- 先@RequestMapping把请求接收过来
- 参数列表获取接收的数据
- 再通过ModelAndView把处理结果返回给浏览器
springMVC流程
1.web.xml配置文件
- spring监听器使得spring容器中的所有对象一次性创建出来
- dispatcher创建时把springMVC容器创建出来。 希望能在tomcat启动时就把dispatcher创建,从而把spring创建出来
dispatcherServlet创建,并 指定配置文件xml的位置
mapping映射 url与servlet的映射
- 传统的是自己写一个myservlet文件,继承httpServlet,url与myservlet对应,执行nyservlet中的方法。
- springMVC创建了一个dispatcherServlet,它本质就是一个servlet,所有定义的url都和dispatcherServlet对应,dispatcherServlet再通过配置文件去找controller控制器,在controller类中寻找与页面传入的url对应的方法,并执行
2.springMVC 配置文件
定义扫描器,声明controller类所在的包
3.定义Controller类
- value对应web.xml中的url
- 能处理请求的都是控制器(处理器),4/ Controller就是后端控制器
- value是一个数组,可以存储多个值。 当访问这些路径时,多个请求都交给doSome()来处理。
- 在一个controller类中可以创建多个方法(在Controller类中写多个方法),也可以多个请求交给同一个方法处理(value的值写多个)
编写实现方法
- 当进入/some.do页面时,会调用dosome()
- mv.addObject相当于request的setAttribute(),传入name和value,这个attribute在这一次request中是整个服务器共享的。
- 可以在跳转页面中输出attibute的内容
- mv.setViewName()相当于Request的请求转发的forward方法,会自动跳转到" "中。
4. 结果跳转的页面show.jsp
其中可以输出dosome()中设置的attribute
5.设置视图解析器。
- 如果把show.jsp等视图直接放在webapp目录下,其他人可以猜出来路径,直接访问
- 为了防止这种情况,可以新建一个文件夹,存储view视图
- 即把访问路径变得更复杂
6.给地址加一个模块名称(用)
- 模块名称可以通过requestMapping放在类上面(方便修改),也可以在方法上面/user/some.do
- 当功能很多时,可以按照模块分类
7.指定使用通过get还是post方式发起请求(不用)
- RequestMethod是一个枚举类型的,主要用到的值时get,post
- 在controller类的方法中,通过method= 来指定
- 也可以不指定,则可以通过get/post访问
- html中get和post的区别
get方式传入参数
8.接收参数
a.request, response, session参数
b. 逐个接收请求参数
参数名必须和html中定义的参数名一样才能接收到
requestParam在【逐个接受请求参数】中可以解决:
- 参数名不一样的问题,使用value参数
- 传入参数能否为空的问题,使用Required false可以为空
- requestParam只能在【逐个接受请求参数】中使用
c.接收java对象(用这个,因为我们已经建好了实体类domain)
不能使用requestParam
接收参数时会产生两个问题8-9
8.使用Integer代替int,能使传入的int类型为空而不出错(用)
- springMVC会自动获取前端传入的数据,并且把string自动转换为int类型
- 但是如果定义为int类型 的值,浏览器中不输入,为null传入,.valueOf()会出错,报400错误
- 400是客户端错误,表示提交请求参数时,出了问题。
- 只要把int类型改为Integer就能解决“传入为null”的问题。
- Integer类型只能传入整数
9.解决字符编码问题 过滤器(用)
- get方法无乱码问题,post方法有中文乱码问题
- 原始servlet中,在doGET()中指定字符参数。但是在springMVC中,如果每个方法都指定,很麻烦
- 声明过滤器解决 。接收到的所有请求先经过过滤器,修改字符编码,再传入controller
10.三种返回值
- ModelAndView: 如果请求处理完成后,既需要返回数据,也需要跳转到其他方面(视图),用ModelAndView
- String:返回视图,视图执行.forward() 。视图名称有两种写法:a.视图解析器+逻辑名称show b.不使用视图解析器+完整路径。 可以使用request.setAttribute()类获取数据并设置
- void
- Object
SSM整合开发