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


Title

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


文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录