Title
- 让普通浏览器支持DELETE/PUT请求方式
- @PathVariable获取前端传值
- @RequestParam获取前端传值
- 用一个实体类获取前端传值
- 获取请求头信息和CookieValue中的值(JSESSIONID)
让普通浏览器支持DELETE/PUT请求方式
GET :查
POST :增
DELETE :删
PUT :改
普通浏览器 只支持get post方式 ;其他请求方式 如 delelte|put请求是通过 过滤器新加入的支持。
实现步骤:
a.在web.xml中增加过滤器
<!-- 配置HiddenHttpMethodFilter过滤器 让浏览器支持PUT/DELETE方式的请求 -->
<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>
b.前端页面(只看删/改)
<form action="testDelete/123" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="删">
</form>
<form action="testPut/123" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="改">
</form>
需要满足以下条件:
i:必须是post方式
ii:通过隐藏域 的value值 设置实际的请求方式 DELETE|PUT
iii:< Input >的name必须为”_method”
c.控制器
@RequestMapping(value = "testDelete/{id}",method = RequestMethod.DELETE)
public String testDelete(@PathVariable("id") Integer id) {
System.out.println("删"+id);
return "successe";
}
@RequestMapping(value = "testPut/{id}",method = RequestMethod.PUT)
public String testPut(@PathVariable("id") Integer id) {
System.out.println("改"+id);
return "successe";
}
通过 method=RequestMethod.DELETE 匹配具体的请求方式,此外,可以发现 ,当映射名相同时@RequestMapping(value=”testRest),可以通过method处理不同的请求。
过滤器的部分工作原理
处理put|delete请求的部分源码:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
requestToUse = new HttpMethodRequestWrapper(request, paramValue);
}
}
filterChain.doFilter(requestToUse, response);
}
原始请求:request,普通浏览器默认只支持get post请求
但是如果 是"POST" 并且有隐藏域 <input type="hidden" name="_method" value="DELETE"/>
则,过滤器 将原始的请求 request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)
最后将requestToUse 放入 请求链中, 后续再使用request时 实际就使用改造后的 requestToUse
如果出现了405错误则需要在返回的页面(successe.jsp)中加入
isErrorPage=”true”
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isErrorPage="true"%>
@PathVariable获取前端传值
前端的传值必须是在路径上的。
例如:
<!--此处的/zs便是要传的值 -->
<a href="welcome3/zs">传递姓名</a>
控制器接收:
@RequestMapping("welcome3/{name}")
public String welcome3(@PathVariable("name") String name) {
System.out.println(name);
return "successe";
}
@RequestParam获取前端传值
前端页面:
<form action="testInfo">
<input placeholder="姓名" name="name">
<input placeholder="年龄" name="age">
<input type="submit" value="提交">
</form>
控制器:
@RequestMapping(value = "testInfo")
public String testInfo(@RequestParam("name") String name,@RequestParam("age") int age) {
System.out.println(name+"~~~~~"+age);
return "successe";
}
@RequestParam(“”)括号中的参数必须和input中的name值相等
用一个实体类获取前端传值
实体类:
student:
package org.cduck.entity;
public class Student {
private int id;
private String name;
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", address=" + address.getHomeAddress()+address.getWorkAddress() + "]";
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address:
package org.cduck.entity;
public class Address {
private String homeAddress;
private String workAddress;
public String getHomeAddress() {
return homeAddress;
}
@Override
public String toString() {
return "Address [homeAddress=" + homeAddress + ", workAddress=" + workAddress + "]";
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
public String getWorkAddress() {
return workAddress;
}
public void setWorkAddress(String workAddress) {
this.workAddress = workAddress;
}
}
前端页面:
<form action="testStudent">
id:<input name="id">
<br>
name:<input name="name">
<br>
homeAddress:<input name="Address.homeAddress">
<br>
workAddress:<input name="Address.workAddress">
<br>
<input type="submit" value="学生">
</form>
控制器:
//用student类接受数据
@RequestMapping(value = "testStudent")
public String testStudent(Student student) {
System.out.println(student.getId()+","+student.getName()+","+student.getAddress());
return "successe";
}
注意:前端页面< Input>中的name值必须要和Student类,Address类中的属性值相同
例如:Student类中有一属性 id那么前端表单中要输入id的input框的name值必须为id。
获取请求头信息和CookieValue中的值(JSESSIONID)
获取请求头信息 @RequestHeader
前端:
<a href="testRequestHeader"> 测试请求头</a>
控制器:
//测试获取请求头中的Accept-Language
@RequestMapping(value = "testRequestHeader")
public String testRequestHeader(@RequestHeader("Accept-Language") String CT) {
System.out.println(CT);
return "successe";
}
要获取请求头中的什么值,@RequestHeader()括号中就写对应的名称。
通过mvc获取cookie值(JSESSIONID)
知识复习:
服务端在接受客户端第一次请求时,会给该客户端分配一个session
(该session包含一个sessionId)),并且服务端会在第一次响应客户端时 ,
请该sessionId赋值给JSESSIONID 并传递给客户端的cookie中
前端:
<a href="testCookieValue"> 测试CookieValue</a>
控制器:
//测试获取CookieValue中的JSESSIONID
@RequestMapping(value = "testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String JSESSIONID) {
System.out.println(JSESSIONID);
return "successe";
}
同理,要获取cookie中的什么值就在注解括号写对应的名称