1。回顾mvc 二阶段的封装代码中,问题 使用springmvc,减少开发量,让上述的工作,给springmvc去做2。springmvc介绍 首先,springmvc是spring中的一个模块,也是一个mvc设计思想的框架 TheSpringWebmodelviewcontroller(MVC)frameworkisdesignedaroundaDispatcherServletthatdispatchesrequeststohandlers,withconfigurablehandlermappings,viewresolution,localeandthemeresolutionaswellassupportforuploadingfiles。 springmvc设计核心,是DispatcherServlet,是用来接收和分发请求给具体的handler(类似二阶段封装中的Controller,是由程序员开发的),通过请求和handler之间的映射配置(类似mvc。xml),最后,通过视图解析器解析页面响应。支持文件上传3。springmvc框架搭建 需求:浏览器输入请求地址http:localHost:8080teacherspringmvchello访问服务器,服务器响应hello。jsp给浏览器 1)新建teacherspringmvc01 2)导包 核心包 还需要拷贝之前spring框架中的jar包 3)配置文件 log4j。properties springmvc框架自己的配置文件,applicationContextmvc。xml(名字不重要,也可以是springmvc。xml) 配置文件直接拷贝之前spring的配置文件 web。xml(是tomcat加载工程的唯一入口) 给servlet加load标签,一般是servlet在第一次被访问的时候实例化,加了load标签,就是tomcat启动的时候就实例化。 4)部署到tomcat中,启动tomcat 报错: DispatcherServlet在实例化的时候,会默认去WEBINF目录下找配置文件,配置文件的文件名为web。xml中servlet配置的servletnameservlet。xml 拷贝applicationContextmvc。xml到在WEBINF下,并重命名为springmvcservlet。xml 重启服务器》成功 但是!!我们的配置文件,肯定不会直接放在WEBINF下,而是放在src下,编译之后的目录是WEBINF下的class目录 这时,我们需要告诉DispatcherServlet,配置文件的路径文件名,替换默认路径和文件名 删除WEBINF下的springmvcserlvet。xml 重启服务器 成功 5)入门案例,HelloWorld 浏览器输入请求地址http:localHost:8080teacherspringmvchello访问服务器,服务器响应hello。jsp给浏览器 a。handler编写,用于处理hello请求 b。hello。jsp c。请求地址和handler之间的映射 重启,访问 因为web。xml配置DispatcherServlet拦截的地址为,所以不管是jsp还是hello还是js,css的请求,会全部都到DispatcherServlet中。会404 处理办法:将需要给DispatcherServlet拦截的请求加个标识,拦截。action结尾的请求 浏览器请求地址:http:localHost:8080teacherspringmvchello。action 映射配置: 重启,重新访问 4。springmvc注解模式 teacherspringmvc02 1)controller可以脱离springmvc的api 2)配置文件中开启注解 3)代码中使用注解 5。执行流程 1。tomcat启动的时候加载应用,解析web。xml 需要在启动之后,实例化DispatcherServlet。 DispatcherServlet实例化的时候,默认加载了一个配置文件DispatcherServlet。properties DispatcherServlet加载这个配置文件,主要的目的,就是实例化它的各种帮手。 除了默认加载的配置文件,DispatcherServlet还加载了我们指定的配置文件 先解析applicationContextmvc。xml, 如果有bean配置,那么实例化bean,然后拿bean的name属性作为key,实例作为value。 如果有开启注解的标签,那么DispatcherServlet会扫面指定的包 扫描指定包的时候,找Controller和RequestMapping注解 Controller注解,用来生成实例 RequestMapping用来映射请求地址和方法之间的映射 如果还有其他的标签,会继续做相应的事。 2。浏览器请求http:localHost:8080teacherspringmvchello。action 3。tomcat服务器接收到浏览器的请求,先拆分看请求的是哪个应用,然后看请求地址有没有在web。xml中配置到。如果web。xml中没有配置拦截,那么就根据路径指向具体的资源(比如teacherspringmvcindex。jsp,那么tomcat会发现web。xml中没有要接收这个请求的,那么就从webRoot开始,找index。jsp响应给浏览器,没找到,404) 但是,请求的是teacherspringmvchello。action,web。xml中,有个servlet配置,接收。action的请求,请求地址hello。action符合要求,那么tomcat就会把这个请求丢给DispatcherServlet 4。DispatcherServlet拿到这个请求,会找处理器映射器帮忙,找是那个映射关系。 找到映射关系,等于找到了哪个Controller处理这个请求 继续找处理器适配器帮忙,调用具体的Controller中的具体方法 5。DispatcherServlet拿到Controller层处理之后的返回值。 又继续找视图解析器帮忙,解析响应指定的页面给浏览器6。RequestMapping应用 6。1方法上使用 请求地址: http:localhost:8080teacherspringmvchello。action 6。2用在类上,作用类似namespace 请求该类中每个方法,都需要带上namespace,namespace就是类上的RequestMapping指定的路径 12组成的请求地址,在整个工程中不能重复 6。3RequestMapping默认支持getpost两种请求方式。 那如果,我只要支持其中的一种 显式的定义,支持post、get 7。Controller层方法的返回值7。1ModelAndView ModelAndView可以给跳转页面地址 绝对路径,以打头 页面跳转是转发还是重定向? 默认为转发 那如果要重定向?页面地址前加上redirect: ModelAndView除了可以放view视图(jsp),还可以放model(数据) 7。2String 返回值String:为需要跳转的页面 默认转发 如果要使用重定向 7。3void 方法没有返回值,在方法中,使用response直接给页面响应 8。Controller层方法参数8。1默认参数(ServletAPI) HttpServletRequest,HttpServletResponse,HttpSession,ModelAndView,ModelMap 8。2简单类型 String,int之类 形参的命名前台页面控件的name属性值 类型转换》框架会做 一般用于属性较少的添加和查询功能8。3自定义对象 提交参数的key需要和实体类属性名保持一致 提交参数key:如果是form表单,key就为form控件中的name属性 如果是其他的提交方式,比如get,action?key1value1key2value2,那么,key1,key2都需要和实体类属性名一致 8。4包装类 自定义对象中含有自定义对象 Product中Company对象传参 jsp页面,控件的name属性值,需要使用导航符。 8。5数组 checkbox类型 参数使用String类型 参数使用数组类型 如果前台使用的checkbox,那么参数可以是String类型,也可以是数组类型,如果value为number类型,那么数组可以直接定义为int类型数组8。6类型转换 之前的参数中,有String》int,也有String》double这些类型转换,springmvc框架中内置的。 但是如果想要StringDate,比如产品的发行时间,通过req取出参数肯定是String类型,但是我们的实体类,或者说直接使用参数接收,那么框架不支持转换,需要自定义转换器 1)定义转换器 2)将转换器注册到框架中 3)mvc框架集成自定义的转换器 需要使用到mvc打头的标签,要使用mvc中的标签,需要引入mvc的约束 使用mvc标签,集成自定义转换器 springmvc框架中,遇到StringDate类型,会自动调用自定义的转换器。 如果已有的转换器,重新定义,比如StringInteger,那么,自定义的转换器会覆盖内置转换器 9。乱码问题 getpost POST 使用springmvc中的字符集过滤器 GET 使用终极大招 tomcatconfserver。xml中指定url编码格式 get方式提交,参数是直接跟在请求地址之后,请求地址是由tomcat解析的。让tomcat在解析的时候,使用我们指定的编码格式解析 10。springmvcspringmybatis集成(daoxml配置版本) teacherssm011)导包 导入springmybatis最后一个版本的包 至于springmvc,检查下是否含有springweb和springwebmvc这两个包,如果没有,重新导入。 2)配置文件 log4j。properties db。properties》数据源配置,给spring引入使用 sqlMapConfig。xmlmybatis applicationContext。xmlspring applicationContextmvc。xmlspringmvc web。xmlDispatcherServlet需要配置,spring中的实例也需要tomcat创建,所以,spring的入口也在web。xml中配置 DispatcherServlet spring入口》监听 3)部署,启动 未报错,但是不能证明框架集成成功4)案例 查询所有的企业展示。 1。建表 insert数据 2)实体类 Company。java 3)CompanyDao接口,CompanyDaoImpl实现类,company。xml company。xml 实现类 4)sqlMapConfig。xml中注册配置文件 5)CompanyService,接口,实现类 6)Controller 7)service,dao在applicationContext中的bean配置 8)controller中的注解配置 9)springmvc配置文件中,开启注解 10)companyManager。jsp 路径需要Controller中返回的路径一致 a。拷贝资源目录 》 b。复制companyManager。html到webRootpagesbackend目录 c。将html修改为jsp 第一步先复制jsp文件内容到html 第二步修改后缀 第三步,修改所有的引用地址为绝对 第四步:使用c标签解析comList 11)部署,启动 12)浏览器访问地址 11。springmvcspringmybatismapper代理注解 1)拷贝teacherssm01工程,代码结构调整 2)company。xml中的namespace调整 3)修改company。xml在sqlMapConfig。xml中的路径 4)service使用注解 5)在spring中配置mapper代理生成 6)springmvc配置文件中,一定要打开注解 如果这个扫描的包已经包含了Service,dao等等,那么spring配置文件中applicationContext。xml不需要再开启一次注解 如果applicationContextmvc。xml中的包只有com。njwb。controller 那么,applicationContext。xml中需要重新开启注解,扫描service,dao 案例: 添加企业 1)添加企业ID的序列 2)接口,company。xml提供添加 3)service 4)controller 校验参数 调用service添加数据 跳转到列表页 5)修改companyAdd。html a。修改companyManager。jsp中的跳转地址 b。修改companyAdd。html为jsp文件 c。修改添加页面的form提交地址,提交方式 d。给需要提交到后台数据的控件添加name属性 e。要取详情内容,使用隐藏域 目前代码中的校验 如果属性比较多,代码就会很多,并且,修改中也会有很多的重复代码,因为修改中也需要做校验,并且,校验一般和添加差不多 并且,校验完成之后,目前是跳转到result。jsp 但是从用户的角度来说,校验不通过,一般回到添加页面,并且,原始数据有回显,然后有相依的错误信息提示 不使用校验框架也可以做到,不过,使用校验框架,编码更简单,提示信息也可以作为配置文件12。校验框架 teacherssm04使用hibernate校验框架 1)导包 2)在mvc中配置校验器 3)需要在mvc框架中启用校验器 4)代码中使用 在实体类中,使用注解标明这个属性的规则是什么样子的 在Controller的方法中,需要告诉springmvc,形参Companycompany,需要使用校验框架做校验 页面效果: 将错误信息放到配置文件中 数据回显 校验框架,支持数据回填 默认key为实体类类名,第一个字母小写。不需要显示的传值 案例: 如果就是要修改一下传值的key,使用 并不是每种场景校验都一模一样 比如:添加和修改。 添加中,每个属性都需要校验 修改:不允许修改的属性,还需要校验么??? 假设:企业数据中,佣金不允许修改 添加需要校验企业名称、佣金、详情 修改需要校验企业名称、详情 校验需要分场合,分场景 把实体类属性中的校验分组校验分组 1)首先需要定义两个空接口,作为两个标识 2)给实体类中的规则分组 3)Controller中使用分组校验 校验注解: 逻辑性校验校验框架做不了,比如,重名校验13。springmvc中使用ajax 1)使用response响应 2)使用ResponseBody注解响应 使用该注解,表示,返回值不管是啥,直接响应给浏览器 返回String 返回Company 让springmvc框架自动的将对象转换成json格式的字符串,需要导包 代码: jsp: 结果: 14。springmvc上传 1)jsp中的form表单处理和Servlet上传处理一致 methodpost,enctype需要处理 2)Controller中使用mvc包中的类直接接收文件对象 需求:给企业添加一个图片 1)数据库添加字段 imgurl(上传路径),imgrealname(原始文件名) 2)实体类添加属性 3)需要修改的功能: 企业添加,企业修改,企业列表页展示,企业详情也要展示 4)企业添加: a。修改company。xml中的insert语句 b。Controller添加方法中,参数,直接找框架要浏览器提交的文件对象 c。需要使用文件对象,那么需要在mvc中配置文件解析器 d。页面添加file控件 e。form表单处理 f。测试Controller中能不能拿到文件对象 g。指定文件上传的路径 h。文件上传地址,使用配置形式;文件重命名,使用当前时间的时分秒毫秒形式15。列表页的table中省略显示详情 页面效果: 解决方式 Company实体类中,提供一个get方法,获取这个String 页面使用el取值 16。文件下载 1)页面请求地址 比如 2)需要有一个Controller处理下载请求 a。Servlet通用下载,使用response响应文件流 3)SpringMVC下载 16。Springmvc中的异常处理 teacherssm06 1。定义异常处理器 2。注册自定义异常处理器 17。Spring中的定时任务SpringJob 1)导包 2)定义定时任务 3)配置定时任务 1。定时任务bean 2。定时任务触发器(间隔时间) 3。spring定时任务配置所有的触发器 到点之后,不管上一个定时任务是否结束, 1)到点仍然开启新一轮定时任务,允许同一个定时任务有多个线程存在 2)到点之后,等待上一个定时任务结束,然后再开启新一轮定时任务 如果涉及到数据库数据更新,那么定时任务,不应该是可以多线程。 实现接口就可以了,不需要编写额外的代码