映射及多种方式接收前端传值

让普通浏览器支持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中的什么值就在注解括号写对应的名称

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页