0%

SpringMVC想吃火锅

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
@RequestMapping(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
@RequestMapping("/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
@RequestMapping("/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
@RequestMapping("/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