SpringMVC如何获取请求带来的各种信息?
contoller演示
package com.atguigu.controller;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
public String hello() {
System.out.println("hello方法执行了。。。");
return "success";
}
/**
* springMVC如何获取请求带来的各种信息?
* 默认方式获取请求参数:
* 直接给方法上写一个参数和请求参数一样的变量,这个变量就来接收请求参数的值
* 带了就是有值的,没带默认为null
*
* @RequestParam:获取请求参数
* @RequestHeader:获取请求头
* @CookieValue:获取某个cookie的值
*/
@RequestMapping("/handle01")
public String handle01(String username) {
System.out.println("这个变量名username的内容是"+username);
return "success";
}
/**
* @RequestParam("username")指定后面的变量就是用来接受请求参数username的变量
* 默认必须带此参数,否则报错400,可以通过修改required=false来避免报错
* 带了就是有值的,没带默认为null
*
* 参数:
* value:指定要获取的参数的key
* required:这个参数是否是必须的
* defaultVlaue:默认值,没带就默认是这个值
*/
@RequestMapping("/handle02")
public String handle02(@RequestParam(value="username",required = false,defaultValue = "Tom") String name) {
System.out.println("这个变量名username的内容是"+name);
return "success";
}
/**
* @RequestHeader:获取请求头中的某个key的值
* @RequestHeader(value="userAgent")表示后面的变量userAgent用来表示请求头中User-Agent的值
* 如果请求头中没有此请求头,则报错500,可以通过修改required=false来避免报错
* 带了就是有值的,没带默认为null
*
* 参数:
* value:指定要获取的参数的key
* required:这个参数是否是必须的
* defaultVlaue:默认值,没带就默认是这个值
*/
@RequestMapping("/handle03")
public String handle03(@RequestHeader(value="User-Agent",required = false,defaultValue = "火狐") String userAgent) {
System.out.println("请求头中浏览器的信息:"+userAgent);
return "success";
}
/**
* @CoolkieValue:获取某个cookie的值,麻烦!!
* 以前的操作获取某个cookie:Cookie[] cookies = request.getCookies();
* for(Cookie c:cookies){
* if(c.getName().equals("JSESSIONID")){
* String cv = c.getValue();
* }
* }
*
* (@CookieValue("JSESSIONID")表示后面的jSessionId变量就是cookie中JSESSIONID的值
* 如果cookie中没有这个键值对,则报错500,可以通过修改required=false来避免报错
* 带了就是有值的,没带默认为null
*
* 参数:
* value:指定要获取的参数的key
* required:这个参数是否是必须的
* defaultVlaue:默认值,没带就默认是这个值
*/
@RequestMapping("/handle04")
public String handle04(@CookieValue(value="JSESSIONID",required = false,defaultValue = "1") String jSessionId) {
System.out.println("cookie中的JSESSIONID值为:"+jSessionId);
return "success";
}
/**
* 如果我们的请求参数是一个pojo,springMVC会自动为这个pojo自动赋值
* 1、将pojo中的每一个参数,从request参数中尝试获取出来,并封装进去
* 2、还可以级联封装
*
* 提交的数据可能有乱码:
* 请求乱码:
* get请求:改Server.xml
* <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>
* post请求:在第一次获取请求之前设置
* request.setCharacterEncoding("utf-8");
* 自己写一个filter;springMVC有这个filter
* 相应乱码:
* response.setContentType("text/html";charset=utf-8);
*/
@RequestMapping("/book")
public String addBook(Book book) {
System.out.println(book);
return "success";
}
/**
* springMVC可以直接在参数上写原生API
*/
@RequestMapping("/handle05")
public String handle05(HttpSession httpSerssion,HttpServletRequest httpServletRequest) {
httpServletRequest.setAttribute("reqParam", "我是请求域中的");
httpSerssion.setAttribute("sessionParam", "我是session域中的");
return "success";
}
}
前端jsp发送请求的样式:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="hello">hello</a><br/>
<a href="handle01?username=tomcat">普通取参数</a><br/>
<a href="handle02?username=tomcat">@RequestParam取参数</a><br/>
<a href="handle03">@RequestHeader取参数</a><br/>
<a href="handle04">@CookieValue取参数</a><br/>
<!-- 级联属性 -->
<form action="book" method="post">
书名:<input name="bookName"/><br/>
作者:<input name="author"/><br/>
价格:<input name="price"/><br/>
库存:<input name="stock"/><br/>
销量:<input name="sales"/><br/>
<hr/>
省:<input name="address.province"/><br/>
市:<input name="address.city"/><br/>
街道:<input name="address.street"/><br/>
<input type="submit"/>
</form><br/>
<a href="handle05">原生API</a>
</body>
</html>
解决乱码问题:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>springMVC_helloWorld</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 使用spirngMVC前端控制器写完就直接写字符编过滤器
Tomcat一装上,修改servlet.xml
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>
就可以解决乱码问题
-->
<!-- 配置一个字符编码的filter -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 指定encoding:解决POST请求乱码 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- 响应编码也设置成上述encoding,顺手解决响应乱码 -->
<init-param>
<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>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<!-- 支持REST风格的URL的过滤器,一定要放在字符编码的filter后面,否则获取到了值再解决乱码是没有意义的 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>