REST风格:软件编程风格
SpringMVC:
GET —查
POST—增
DELETE—删
PUT —改
普通浏览器只支持get和post方式,其他请求是通过 过滤器新加入的支持
springmvc实现:put/delete请求方式的步骤
a.增加过滤器
b.表单
注意:1.必须是post方式。 2.通过隐藏域的value值 设置实际的请求方式(DELETE/PUT)
c.控制器
@RequestMapping(value="testRest/{id}",method=RequestMethod.DELETE)//映射
public String welcome(@PathVariable("id") String tt) {
System.out.println("delete:删 "+tt);
//Service层实现真正的删
return "success";
}
通过 method=RequestMethod.DELETE 匹配具体的请求方式
此外,可以发现,当映射名相同时@RequestMapping(value=“testRest/{id}”,可以通过method(如:method=RequestMethod.DELETE)处理不同的请求。
过滤器中,处理put/delete请求的部分源码:
@Override
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 w,@RequestParam(value="uage",required=false,defaultValue="23") int t
@RequestParam(“uname”):接受前台传递的值,等价于request.getParameter(“uname”)。
required=false:该属性不是必须的。
defaultValue=“23”:默认值为23。
获取请求头信息@RequestHeader:
public String RHeadder(@RequestHeader(“Accept-Language”) String tt) {}
通过@RequestHeader(“Accept-Language”) String tt 获取请求头中的Accept-Language的值,并将值保存在tt变量中。
通过mvc获取cookie值(获取JSESSIONID)
@CookieValue
(前置知识:服务器在接受客户端第一次请求时,会给该客户端分配一个session,(该session包含一个sessionID),并且服务器会在第一次响应客户端时,将该sessionID赋值给JSESSIONID,并传递给客户端的cookie中)
小结:SpringMVC处理各种参数的流程/逻辑:
请求:前端发请求a---->@RequestMapping(value=“a”)
处理请求中的参数xy:
@RequestMapping(value="a")
public String test(@Xxx注解("xy") String tt) {
System.out.println(tt);
return "success";
}
处理对象(实体类Student)接受请求参数:
实体类中的属性名与前端参数的name值一致,支持级联属性
@RequestMapping(value="testObject")
public String testObject(Student student) {
System.out.println(student);
return "success";
}
在SpringMVC中使用原生态的Servlet API:HttpServletRequest
@RequestMapping(value="testServletAPI")
public String testServletAPI(HttpServletRequest request) {
System.out.println(request);//不需要new
return "success";
}