第三节 四种请求方式映射:PUT DELETE
1、PUT 请求
①web.xml
②表单
③handler 方法
④请求方式 Filter 对字符集 Filter 的影响
[1]结论
[2]原因
2、HiddenHttpMethodFilter
①简介
②HiddenHttpMethodFilter 源码要点
[1]默认请求参数名常量
[2]和常量配套的成员变量
[3]以常量值为名称获取请求参数
[4]HttpMethodRequestWrapper 类
3、DELETE 请求
①设定场景
②创建负责转换的表单
③给删除超链接绑定单击响应函数
[1]引入Vue
[2]绑定单击响应函数
④handler 方法

第三节 四种请求方式映射:PUT DELETE

1、PUT 请求

以下操作需要在已有的 SpringMVC 环境基础上执行:

①web.xml


hiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter


hiddenHttpMethodFilter
/*

②表单

  • 要点1:原请求方式必须是 post
  • 要点2:新的请求方式名称通过请求参数发送
  • 要点3:请求参数名称必须是_method
  • 要点4:请求参数的值就是要改成的请求方式






  1. <button type="submit">更新</button><br /></form>

③handler 方法

// 映射请求地址:URL + 请求方式
@RequestMapping(value = “/emp”, method = RequestMethod.PUT)
public String updateEmp() {

logger.debug("现在执行的是 updateEmp() 方法");

return "target";<br />}

④请求方式 Filter 对字符集 Filter 的影响

[1]结论

当 web.xml 中两个 Filter 并存,一定要让 CharacterEncodingFilter 先执行。

[2]原因

  • 在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的
  • request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作
  • 而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作:

String paramValue = request.getParameter(this.methodParam);

2、HiddenHttpMethodFilter

①简介

在 HTML 中,GET 和 POST 请求可以天然实现,但是 DELETE 和 PUT 请求无法直接做到。SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求。

②HiddenHttpMethodFilter 源码要点

[1]默认请求参数名常量

public static final String DEFAULT_METHOD_PARAM = “_method”;
在 HiddenHttpMethodFilter 中,声明了一个常量:DEFAULT_METHOD_PARAM,常量值是”_method”。

[2]和常量配套的成员变量

private String methodParam = DEFAULT_METHOD_PARAM;
之所以会提供这个成员变量和配套的 setXxx() 方法,是允许我们在配置 Filter 时,通过初始化参数来修改这个变量。如果不修改,默认就是前面常量定义的值。

[3]以常量值为名称获取请求参数

第三节 四种请求方式映射:PUT DELETE - 图1

[4]HttpMethodRequestWrapper 类

HttpMethodRequestWrapper 类就是 HiddenHttpMethodFilter 的一个内部类,在 HttpMethodRequestWrapper 类中有如下行为实现了对原始对象的包装:

  • 继承了官方包装类:HttpServletRequestWrapper
  • 在构造器中将原始 request 对象传给了父类构造器
  • 将我们指定的新请求方式传给了成员变量
  • 重写了父类(官方包装类)的 getMethod() 方法
  • 外界想知道新包装对象的请求方式时,会来调用被重写的 getMethod() 方法,从而得到我们指定的请求方式

/*
Simple {@link HttpServletRequest} wrapper that returns the supplied method for
{@link HttpServletRequest#getMethod()}.
/
private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {

private final String method;

public HttpMethodRequestWrapper(HttpServletRequest request, String method) {<br />        // 在构造器中将原始 request 对象传给了父类构造器<br />        super(request);

    // 将我们指定的新请求方式传给了成员变量<br />        this.method = method;<br />    }

@Override<br />    public String getMethod() {<br />        return this.method;<br />    }<br />}

3、DELETE 请求

前面为了转换 PUT 请求所配置的环境仍然要继续使用。

①设定场景

通常删除超链接会出现在列表页面:

将XXX请求转换为DELETE请求


















姓名 年龄 删除
张三 40
删除
李四 30
删除

②创建负责转换的表单




③给删除超链接绑定单击响应函数

[1]引入Vue

第三节 四种请求方式映射:PUT DELETE - 图2

[2]绑定单击响应函数

new Vue({
“el”:”#dataTable”,
“methods”:{
“doConvert”:function (event) {

        // 1.先根据id获取到表单的元素对象<br />            var formEle = document.getElementById("convertForm");

        // 2.将表单的action属性设置为当前超链接的href属性<br />            // ①之所以要这样赋值就是为了将来提交表单的时候访问的还是原超链接要访问的地址<br />            // ②event对象:当前事件对象<br />            // ③event.target对象:发生事件的元素对象,现在是我们点击的超链接<br />            // ④event.target.href属性:超链接的href属性值<br />            // ⑤formEle.action属性:表单的action属性的值<br />            formEle.action = event.target.href;

        // 3.提交表单<br />            formEle.submit();

        // 阻止超链接的默认行为(跳转页面)<br />            event.preventDefault();<br />        }<br />    }<br />});

④handler 方法

@RequestMapping(value = “/emp”, method = RequestMethod.DELETE)
public String removeEmp() {

logger.debug("现在执行的是 removeEmp() 方法");

return "target";<br />}

上一节 回目录 下一节