SpringMVC-02-请求数据获取
REST
REST 即表述性状态传递(Representational State Transfer),是一种软件架构风格,指代使用不同的请求方式来表示这次请求需要完成的 CURD 的种类,然后在 URL 中携带被操作对象,
比如:
URL | 请求方式 | 目的 |
---|---|---|
/book/1 | get | 获取 1 号图书 |
/book | post | 添加图书 |
/book/1 | put | 更新图书 |
/book/1 | delete | 删除 1 号图书 |
这里面要说一下 Post 和 Put 的区别,在官方 HTTP 协议中,规定 Put 为 idempotent(幂等) 方法,也就是多次连续请求造成结果应该相同。因此 Put 应该执行更新方法,而 Post 应该执行非幂等(多次执行添加请求会添加多个)的添加方法。
实现 REST
因为 HTML 发起请求的方式只有 GET 和 POST,所以为了实现 REST,我们可以曲线救国。在 GET 或者 POST 里面添加请求参数,_method
,放入 delete 和 put 作为参数,然后在 web.xml 中配置一个 Srping 的 Filter:HiddenHttpMethodFilter
,过滤范围为所有的请求。
这个 Filter 会去查找是否拥有 _method
参数并且数据的请求类型是否为合法(指是否为 HTTP 协议里面的类型),如果合法,那么这个 Filter 会将 HttpRequest 里面的请求方法修改为我们设置的 _method
参数数据。
最后需要注意的是,在大于等于 8.0 版本的 Tomcat 里面使用 REST 的时候,因为 JSP 认为不是 Get 或者 Post 的请求都是有问题的,会爆出错误页面,为了掩盖这个问题,将当前 JSP 页面的页头添加设置 isErrorPage="true"
,就可以让 Tomcat 忽略这个问题了。
获取请求信息
请求参数
标准参数
- 方法声明变量名,参数名和变量名匹配的话就会将参数值传入方法中,比如下面当有参数:
username=XXX
的时候,发现方法参数和请求参数名相匹配,就会将 XXX 传入方法中,没带则传入 null。
1 |
|
- 使用
@RequestParam
注解标注方法参数。
(RequestParam(value = "user",required = false,defaultValue = "No_Name") String username)
主要是解决方法参数名和请求参数名不一样的问题,给 value 附上别名即可(当然附上别名就只能使用别名来让方法参数接收数据了),required 则是标注这个参数是否必须要有(如果没有页面会报错 Required Parameter XXX)
POJO
SpringMVC 支持 POJO 类型的请求自动封装,会自动将符合匹配条件(名字一样)的请求参数放入 POJO 中。还支持 POJO 的级联封装,只需要加 .
即可:address.home=Xorex&address.school=CUIT
就是对 Address 里的两个 String 进行赋值。
1 | 请求:username=Xorex&password=Xorex&address.home=Xorex&address.school=CUIT&Xorex=Tempest |
1 | public String getUsername(User user,String username) {// 两个封装并不冲突 |
原生参数
SpringMVC 支持自动传入原生 ServletAPI,直接写在方法的参数里面即可,会按照类型填入,支持类型:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer
请求头
使用 @RequestHeader
注解获取请求头信息,value 填写请求头名称, required 和 defaultValue 参考上面。
Cookie
使用 @CookieValue
注解获取请求中的 Cookie 信息,value 填写 Cookie 的 key,required 和 defaultValue 参考上面。
请求响应乱码
- GET 请求乱码:
GET 乱码主要是 Tomcat 中 Connector 对请求的解析的问题,只需要在 8080 端口的 Connector 的设置(在 server.xml 中)里添加 URLEncoding=”UTF-8” 即可、
- POST 请求乱码:\
在 HttpServletRequest 实例设置 setCharacterEncoding(“UTF-8”),或者写一个 Filter 将所有的请求提前设置一下。
最最最重要的是,Spring 内置了这个 Filter,不需要我们自己写!是 CharacterEncodingFilter ,直接配置到 web.xml 中即可,可选配置请求乱码 encoding 和相应乱码 forceEncoding 一起改:
更更更重要的是,这个 Filter 要放到其他的 Filter 前面,因为可能其他 Filter 回对请求里面的数据进行处理,应该修改完编码类型之后才可以!!!
1 | <filter> |