RequestMapping
几个可写的属性
value:处理的请求名
params:规定参数必须满足的规则,params={“id”}表示必须带上id,{“!id”}表示必须不带id,{“id=0”}表示id必须等于0,等等表达式。这是一个数组,可以写多个规则
method:规定能处理的请求类型
headers:规定请求头
conosmes:规定请求头的Content-Type
produces:响应头的Content-Type
Ant风格

Rest风格URL
/资源名/资源标识符,以资源和请求方式区分对资源的操作。
问题:页面上只能发POST和GET两种
解决办法
在web.xml种添加过滤器Filter
1 | <filter> |
2 | <filter-name>HiddenHttpMethodFilter</filter-name> |
3 | <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> |
4 | </filter> |
5 | <filter-mapping> |
6 | <filter-name>HiddenHttpMethodFilter</filter-name> |
7 | <url-pattern>/*</url-pattern> |
8 | </filter-mapping> |
在发请求时带上隐藏参数,方法选择post
1 | <form action="book/1" method="post" > |
2 | <input type="hidden" name="_method" value="delete"> |
3 | <input type="submit" value="删除1号图书"> |
4 | </form> |
控制器里根据类型处理请求
1 | (value = "/{id}",method = RequestMethod.DELETE) |
2 | public String deleteBook(@PathVariable("id") int id){ |
3 | System.out.println("删除了"+id+"号图书"); |
4 | return "success"; |
5 | } |
又出现的问题
tomcat高版本出现jsp不支持花里胡哨请求,显示405错误,在转发到的jsp页面的isErrorPage属性设置为true即可
参数处理
注解接收
如果方法入参和请求参数名字一样,那么默认这个入参接受请求参数
@RequestParam:指定请求参数对应方法入参,标注之后默认请求必须带上参数,可以通过required属性调整是否必须,defaultValue指定没带时的默认值。
@RequestHeader:指定请求头中属性对应入参,和上面一样。
@CookieValue:指定cookie中键对应入参,还和上面一样。
自动装箱
当传入的参数为一个对象时,无需任何操作,只要将入参设置为那个对象,会自动将参数装成一个对象,没有的属性就是Null。并且支持级联属性,请求参数直接写xxx.yyy即可。
原生API
支持在入参写HttpSession等原生的api,也可以取到
1 | ("/api") |
2 | public String session(HttpSession session, HttpServletRequest request){ |
3 | session.setAttribute("name","hahaha"); |
4 | request.setAttribute("talk","xixixi"); |
5 | System.out.println("session"); |
6 | return "success"; |
7 | } |
需要添加依赖
1 | <dependency> |
2 | <groupId>javax.servlet</groupId> |
3 | <artifactId>javax.servlet-api</artifactId> |
4 | <version>3.1.0</version> |
5 | </dependency> |
页面
1 | <h1>Hello World!!!</h1> |
2 | session ${sessionScope.name}, |
3 | request ${requestScope.talk} |
结果

MockHttpSession实现了HttpSession接口,不过还是会报错,不知道为什么
可以接收的参数类型

Principal:https相关,Locale:和国际化有关的区域信息,IO流相关
乱码处理
get请求:在server.xml中8080端口处加上URIEncoding=”UTF-8”
post请求:在web.xml中配置一个CharacterEncodingFilter,forceEncoding属性顺便解决了响应乱码
1 | <filter> |
2 | <filter-name>CharacterEncodingFilter</filter-name> |
3 | <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> |
4 | <init-param> |
5 | <param-name>encoding</param-name> |
6 | <param-value>UTF-8</param-value> |
7 | </init-param> |
8 | <init-param> |
9 | <param-name>forceEncoding</param-name> |
10 | <param-value>true</param-value> |
11 | </init-param> |
12 | </filter> |
13 | <filter-mapping> |
14 | <filter-name>CharacterEncodingFilter</filter-name> |
15 | <url-pattern>/*</url-pattern> |
16 | </filter-mapping> |
注意:这个CharacterEncodingFilter要在HiddenHttpMethodFilter之前。
数据处理
原生API
session,request
3M
在方法参数位置处传入Map(接口)或Model(接口)或ModelMap(类,继承LinkedHashMap),其中的数据会被保存在request域中然后requestScope.xxx即可取出。
1 | ("/map") |
2 | public String modelTest(Model model){ |
3 | model.addAttribute("talk","hahahahaha"); |
4 | return "success"; |
5 | } |
这三个都是用BindingAwareModelMap对象来实现功能。BindingAwareModelMap的父类ExtendedModelMap继承了ModelMap并实现了Model接口。
ModelAndView
模型+视图,用这个当返回值也可以,new对象填一个String参数,也就是页面地址。然后使用方法添加数据,数据同样在request域中。
1 | ("/mv") |
2 | public ModelAndView mavTest(){ |
3 | ModelAndView mv = new ModelAndView("success"); |
4 | mv.addObject("talk","hahaha"); |
5 | return mv; |
6 | } |
@SessionAttributes注解
加在类上,value属性指定保存数据的key,假设为test,当在request中保存key为test的数据时,会将数据同时保存到session中。value可以是数组,指定多个key。而type属性指定保存的类型,会保存所有同类型的数据。不过并不推荐使用这个注解,要用session就使用原生API。
@ModelAttribute注解
使用场景:部分更新字段时,SpringMVC的自动封装会导致没更改的字段为null。
标在方法上,会提前运行这个方法,查到数据库中的信息封装成对象,并放入map/model/modelmap中。告诉SpringMVC直接使用刚刚的对象,而不new对象。在方法参数前加注解即可,比如@ModelAttribute(“book”)Book book,这样就会使用这个对象。
DispatcherServlet

总结
头发-1