大家好,欢迎来到IT知识分享网。
1.回顾mvc
二阶段的封装代码中,问题
使用springmvc,减少开发量,让上述的工作,给springmvc去做
2.springmvc介绍
首先,springmvc是spring中的一个模块,也是一个mvc设计思想的框架
The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme resolution as well as support for uploading files.
springmvc设计核心,是DispatcherServlet,是用来接收和分发请求给具体的handler(类似二阶段封装中的Controller,是由程序员开发的),通过请求和handler之间的映射配置(类似mvc.xml),最后,通过视图解析器解析页面响应。支持文件上传
3.springmvc框架搭建
需求:浏览器输入请求地址 http://localHost:8080/teacher_springmvc/hello访问服务器,服务器响应hello.jsp给浏览器
1)新建teacher_springmvc01
2)导包
核心包
还需要拷贝之前spring框架中的jar包
3)配置文件
log4j.properties
springmvc框架自己的配置文件,applicationContext-mvc.xml(名字不重要,也可以是springmvc.xml)
配置文件直接拷贝之前spring的配置文件
web.xml(是tomcat加载工程的唯一入口)
给servlet加load标签,一般是servlet在第一次被访问的时候实例化,加了load标签,就是tomcat启动的时候就实例化。
4)部署到tomcat中,启动tomcat
报错:
DispatcherServlet在实例化的时候,会默认去WEB/INF目录下找配置文件,配置文件的文件名为 web.xml中servlet配置的servlet-name + “-servlet.xml”
拷贝applicationContext-mvc.xml到在WEB-INF下,并重命名为springmvc-servlet.xml
重启服务器—》成功
但是!!我们的配置文件,肯定不会直接放在WEB/INF下,而是放在src下,编译之后的目录是WEB/INF下的class目录
这时,我们需要告诉DispatcherServlet,配置文件的路径+文件名,替换默认路径和文件名
删除WEB/INF下的springmvc-serlvet.xml
重启服务器
–成功
5)入门案例,HelloWorld
浏览器输入请求地址 http://localHost:8080/teacher_springmvc/hello访问服务器,服务器响应hello.jsp给浏览器
a. handler编写,用于处理/hello请求
b.hello.jsp
c. 请求地址和handler之间的映射
重启,访问
因为web.xml配置DispatcherServlet拦截的地址为 /*,所以不管是jsp还是/hello还是js,css的请求,会全部都到DispatcherServlet中。会404
处理办法:将需要给DispatcherServlet拦截的请求加个标识,拦截.action结尾的请求
浏览器请求地址:http://localHost:8080/teacher_springmvc/hello.action
映射配置:
重启,重新访问
4.springmvc 注解模式
teacher_springmvc02
1)controller可以脱离springmvc的api
2)配置文件中开启注解
3)代码中使用注解
5.执行流程
1.tomcat启动的时候加载应用,解析web.xml
需要在启动之后,实例化DispatcherServlet.
DispatcherServlet实例化的时候,默认加载了一个配置文件DispatcherServlet.properties
DispatcherServlet加载这个配置文件,主要的目的,就是实例化它的各种帮手。
除了默认加载的配置文件,DispatcherServlet还加载了我们指定的配置文件
先解析applicationContext-mvc.xml,
如果有bean配置,那么实例化bean,然后拿bean的name属性作为key,实例作为value.
如果有开启注解的标签,那么DispatcherServlet会扫面指定的包
扫描指定包的时候,找@Controller和@RequestMapping注解
@Controller注解,用来生成实例
@RequestMapping用来映射请求地址和方法之间的映射
如果还有其他的标签,会继续做相应的事。
2.浏览器请求http://localHost:8080/teacher_springmvc/hello.action
3.tomcat服务器接收到浏览器的请求,先拆分看请求的是 哪个应用,然后看请求地址有没有在web.xml中配置到。如果web.xml中没有配置拦截,那么就根据路径指向具体的资源(比如teacher_springmvc/index.jsp,那么tomcat会发现web.xml中没有要接收这个请求的,那么就从webRoot开始,找index.jsp响应给浏览器,没找到,404)
但是,请求的是teacher_springmvc/hello.action ,web.xml中,有个servlet配置,接收*.action的请求,请求地址hello.action符合要求,那么tomcat就会把这个请求丢给DispatcherServlet
4.DispatcherServlet拿到这个请求,会找处理器映射器帮忙,找是那个映射关系。
找到映射关系,等于找到了哪个Controller处理这个请求
继续找处理器适配器帮忙,调用具体的Controller中的具体方法
5.DispatcherServlet拿到Controller层处理之后的返回值。
又继续找视图解析器帮忙,解析响应指定的页面给浏览器
6.@RequestMapping应用
6.1方法上使用
请求地址:
http://localhost:8080/teacher_springmvc/hello.action
6.2用在类上,作用类似namespace
请求该类中每个方法,都需要带上namespace, namespace就是类上的RequestMapping指定的路径
1+2组成的请求地址,在整个工程中不能重复
6.3 @RequestMapping 默认支持get/post两种请求方式。
那如果,我只要支持其中的一种
显式的定义,支持post、get
7.Controller层方法的返回值
7.1 ModelAndView
ModelAndView可以给跳转页面地址
绝对路径,以 / 打头
页面跳转是转发还是重定向?
默认为转发
那如果要重定向?页面地址前加上 redirect:
ModelAndView除了可以放view视图(jsp),还可以放model(数据)
7.2 String
返回值String:为需要跳转的页面
默认转发
如果要使用重定向
7.3 void
方法没有返回值,在方法中,使用response直接给页面响应
8.Controller层方法参数
8.1 默认参数(Servlet API)
HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView ,ModelMap
8.2 简单类型
String,int之类
形参的命名=前台页面控件的name属性值
类型转换-》框架会做
一般用于属性较少的添加和查询功能
8.3 自定义对象
提交参数的key需要和实体类属性名保持一致
提交参数key: 如果是form表单,key就为form控件中的name属性
如果是其他的提交方式,比如get, …action?key1=value1&key2=value2,那么,key1,key2都需要和实体类属性名一致
8.4 包装类
自定义对象中含有自定义对象
Product中Company对象传参
jsp页面,控件的name属性值,需要使用导航符。
8.5数组
checkbox类型
参数使用String类型
参数使用数组类型
如果前台使用的checkbox,那么参数可以是String类型,也可以是数组类型,如果value为number类型,那么数组可以直接定义为int类型数组
8.6 类型转换
之前的参数中,有String—》int, 也有String—》double这些类型转换,springmvc框架中内置的。
但是如果想要String Date, 比如产品的发行时间,通过req取出参数肯定是String类型,但是我们的实体类,或者说直接使用参数接收,那么框架不支持转换,需要自定义转换器
1) 定义转换器
2)将转换器注册到框架中
3)mvc框架集成自定义的转换器
需要使用到mvc打头的标签,要使用mvc中的标签,需要引入mvc的约束
使用mvc标签,集成自定义转换器
springmvc框架中,遇到StringDate类型,会自动调用自定义的转换器。
如果已有的转换器,重新定义,比如String Integer ,那么,自定义的转换器会覆盖内置转换器
9.乱码问题
get/post
POST
使用springmvc中的字符集过滤器
GET
使用终极大招
tomcat/conf/server.xml中指定url编码格式
get方式提交,参数是直接跟在请求地址之后,请求地址是由tomcat解析的。让tomcat在解析的时候,使用我们指定的编码格式解析
10.springmvc+spring+mybatis集成(dao+xml配置版本)
teacher_ssm01
1)导包
导入spring+mybatis最后一个版本的包
至于springmvc,检查下是否含有spring-web和spring-webmvc这两个包,如果没有,重新导入。
2)配置文件
log4j.properties
db.properties—》数据源配置,给spring引入使用
sqlMapConfig.xml ——–mybatis
applicationContext.xml———-spring
applicationContext-mvc.xml——–springmvc
web.xml——DispatcherServlet需要配置,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到webRoot/pages/backend目录
c.将html修改为jsp
第一步先复制jsp文件内容到html
第二步修改后缀
第三步,修改所有的引用地址为绝对
第四步:使用c标签解析comList
11) 部署,启动
12)浏览器访问地址
11.springmvc+spring+mybatis+mapper代理+注解
1)拷贝teacher_ssm01工程,代码结构调整
2)company.xml中的namespace调整
3)修改company.xml在sqlMapConfig.xml中的路径
4)service使用注解
5)在spring中配置mapper代理生成
6)springmvc配置文件中,一定要打开注解
如果这个扫描的包已经包含了Service,dao等等,那么spring配置文件中applicationContext.xml不需要再开启一次注解
如果applicationContext-mvc.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.校验框架
teacher_ssm04
使用hibernate校验框架
1)导包
2)在mvc中配置校验器
3)需要在mvc框架中启用校验器
4)代码中使用
在实体类中,使用注解标明这个属性的规则是什么样子的
在Controller的方法中,需要告诉springmvc,形参Company company,需要使用校验框架做校验
页面效果:
将错误信息放到配置文件中
数据回显
校验框架,支持数据回填
默认key为实体类类名,第一个字母小写。不需要显示的传值
案例:
如果就是要修改一下传值的key,使用
并不是每种场景校验都一模一样
比如:添加和修改。
添加中,每个属性都需要校验
修改: 不允许修改的属性,还需要校验么???
假设:企业数据中,佣金不允许修改
添加需要校验 企业名称、佣金、详情
修改需要校验 企业名称、详情
校验需要分场合,分场景
把实体类属性中的校验分组
校验分组
1)首先需要定义两个空接口,作为两个标识
2)给实体类中的规则分组
3)Controller中使用分组校验
校验注解:
逻辑性校验校验框架做不了,比如,重名校验
13.springmvc中使用ajax
1)使用response响应
2 ) 使用@ResponseBody注解响应
使用该注解,表示,返回值不管是啥,直接响应给浏览器
返回String
返回Company
让springmvc框架自动的将对象转换成json格式的字符串,需要导包
代码:
jsp:
结果:
14.springmvc上传
1)jsp中的form表单处理和Servlet上传处理一致
method=”post”,enctype需要处理
2)Controller中使用mvc包中的类直接接收文件对象
需求:给企业添加一个图片
1)数据库添加字段
img_url(上传路径), img_real_name(原始文件名)
2)实体类添加属性
3)需要修改的功能:
企业添加,企业修改,企业列表页展示,企业详情也要展示
4)企业添加:
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中的异常处理
teacher_ssm06
1.定义异常处理器
2.注册自定义异常处理器
17. Spring中的定时任务—SpringJob
1)导包
2)定义定时任务
3)配置定时任务
1.定时任务bean
2.定时任务触发器(间隔时间)
3.spring定时任务配置所有的触发器
到点之后,不管上一个定时任务是否结束,
1)到点仍然开启新一轮定时任务,允许同一个定时任务有多个线程存在
2)到点之后,等待上一个定时任务结束,然后再开启新一轮定时任务
如果涉及到数据库数据更新,那么定时任务,不应该是可以多线程。
实现接口就可以了,不需要编写额外的代码
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/123551.html