第四章 请求数据传入 Filter顺序
SpringMVC 模型数据概述
输入数据模型
利用下面的代码从网页传递username到客户端 因为是get请求 接受也是get请求 ?又符合get请求
默认方式获取请求参数:
- 直接给方法入参上写一个和请求参数名相同的变量,这个变量就来接受请求参数的值 带:有值 不带:没值null
@RequestParam("username") --> ?user=admin
- value("username") 也就是key
- required =false
- defaultValue 也就是?后没有值 没有值默认为defaultValue指定的 也就是value
@PathVariable("username") 路径/{username} 获取路径中的值
《a href="requ?username=tomcat" >点击《/a> @RequestMapping("requ") public String getBook(String username ) { System.out.println("getusername:"+username); return "hello"; } public String getBook(@RequestParam("username")String user ) { //user = request.getParameter("username") System.out.println("getusername:"+username); return "hello"; }
@RequestHeader:获取请求头中某个key的值
- request.getHeader("User-Agent");
- required = false 可以不带
- defaultValue 可以传入默认值
@RequestMapping("requ") //User-Agent 需要是http请求的关键词 如果没找到就会报错 public String getBook(@RequestHeader("User-Agent") String userAgent) { System.out.println("userAgent:"+userAgent); return "hello"; //userAgent:Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko }
Cookie 能带key-Value对
- 旧方式获取
request.getCookies()//获取所有Cookies for(Cookie c:cookies){ ... equal("JSONID") }
- 新方式 @CookieValue
required = false 可以不带
defaultValue 可以传入默认值@Controller public class MyController { @RequestMapping("requ") public String getBook(@CookieValue(value = "JSESSIONID" ,required = false,defaultValue = "空值") String cookie) { System.out.println("cookie:"+cookie); return "hello"; } }
使用POJO-Spring
- 如果我们请求参数是一个POJO
将POJO种的每一个属性,从request参数种尝试获取出来,并封***r>还可以级联封装 属性的属性《%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %> 《% %> 《html> 《body> 《h2>Hello World!《/h2> 《/body> 《form action="pojo"> 《input type="text" name="bookName" value="javaee"> 《input type="text" name="bookValue" value="98.9"> 《input type="text" name="person.name" value="cznczai"> 《input type="text" name="person.age" value="12"> 《input type="submit" name="提交"> 《/form> 《/html> @RequestMapping("/pojo") public String getBook(Book book) { System.out.println("book:"+book); return "hello"; } public class Book { private Person person; private String bookName; private Double bookValue; } public class Person { private String name; private Integer age; }
传入原生API
- httpSession (以前是通过request获取)
- HttpServletRequest
- HttpServletResponse
@RequestMapping("requ") public String getBook(HttpSession session , HttpServletRequest request,HttpServletResponse response) { session.setAttribute("session", "我是session"); request.setAttribute("request","我是request"); return "hello"; } jsp: ${requestScope.request} ${sessionScope.session}
request.getInputStream(); 请求流
response.geteOutputStream()
request.getReader();
response.getWriter();
乱码
- 需要看看是请求乱码还是响应乱码
请求:- get请求 改server.xml tomcat8.0以上 处理了get请求的编码
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
- POST:在第一次获取请求参数之前设置 request.setCharacterEncoding("UTF-8")
- 利用filter 需要springmvc的包 底层也是request.setCharacterEncoding("UTF-8")
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!--forceEncoding 默认是false 顺手解决响应编码--> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- get请求 改server.xml tomcat8.0以上 处理了get请求的编码
响应:response.setContentType("text/html;charset=utf-8")
Filter同时配置配置的时候
理由 设置编码后才获取参数 如果先获取参数在设置编码 没法解决编码问题
- 编码(CharacterEncodingFilter 编码的) 先
- Rest(HiddenHttpMethodFilter 编码的) 后
获取参数