【SpringMVC笔记】2、利用IDE快速配置,Result风格,doFilterInternal源码解读,使用原生态ServletAPI,多种注解使用

REST风格 :软件编程风格

Springmvc:  
GET  :查
POST  :增
DELETE :删
PUT :改

普通浏览器只支持get post方式 ;其他请求方式如 delelte|put请求是通过过滤器新加入的支持。


springmvc实现 :put|post请求方式的步骤


a.增加过滤器

        <!-- 增加HiddenHttpMethodFilte过滤器:目的是给普通浏览器 增加 put|delete请求方式 -->
    <filter>
            <filter-name>HiddenHttpMethodFilte</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    
    </filter>
   
    <filter-mapping>
            <filter-name>HiddenHttpMethodFilte</filter-name>
            <url-pattern>/*</url-pattern>
    </filter-mapping>

b.表单

    <form action="handler/testRest/1234" method="post">
        <input type="hidden"  name="_method" value="DELETE"/>
        <input type="submit" value="删">
    </form>


i:必须是post方式
ii:通过隐藏域 的value值 设置实际的请求方式 DELETE|PUT

c.控制器
 

   @RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)
        public String  testDelete(@PathVariable("id") Integer id) {
            System.out.println("delete:删 " +id);
            //Service层实现 真正的增
            return "success" ;//  views/success.jsp,默认使用了 请求转发的 跳转方式
        }


通过method=RequestMethod.DELETE匹配具体的请求方式

此外,可以发现 ,当映射名相同时@RequestMapping(value="testRest"),可以通过method处理不同的请求。

sringMVC 转发到jsp时出现405错误:JSPs only permit GET POST or HEAD



过滤器中处理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/header
但是如果 是"POST"  并且有隐藏域 

<input type="hidden"  name="_method" value="DELETE"/>

 则过滤器将原始的请求request加入新的请求方式DELETE,并将原始请求 转为 requestToUse 请求(request+Delete请求)
最后将requestToUse 放入 请求链中, 后续再事情request时  实际就使用改造后的 requestToUse


@RequestParam("uname") String name,@RequestParam(value="uage",required=false,defaultValue="23")

@RequestParam("uname"):接受前台传递的值,等价于request.getParameter("uname");

required=false:该属性 不是必须的。
defaultValue="23":默认值23


获取请求头信息 @RequestHeader
public String  testRequestHeader(@RequestHeader("Accept-Language")  String al  ) {
        
通过@RequestHeader("Accept-Language")  String al   获取请求头中的Accept-Language值,并将值保存再al变量中 


通过mvc获取cookie值(JSESSIONID)
@CookieValue 
(前置知识: 服务端在接受客户端第一次请求时,会给该客户端分配一个session (该session包含一个sessionId)),并且服务端会在第一次响应客户端时 ,请该sessionId赋值给JSESSIONID 并传递给客户端的cookie中


小结:
SpringMVC处理各种参数的流程/逻辑:
请求:  前端发请求a-> @RequestMappting("a") 
处理请求中的参数xyz:

    @RequestMappting("a") 
    public String  aa(@Xxx注解("xyz")  xyz)
    {

    }

使用对象(实体类Student)接受请求参数

在SpringMVC中使用原生态的Servlet API  :HttpServletRequest :直接将 servlet-api中的类、接口等 写在springMVC所映射的方法参数中即可:

        @RequestMapping(value="testServletAPI")
        public String testServletAPI(HttpServletRequest  request,HttpServletResponse response) {
//            request.getParameter("uname") ;
            System.out.println(request);
            return "success" ;
        }

 
 

猜你喜欢

转载自blog.csdn.net/kuaileky/article/details/89643334