Result风格和doFilterInternal源码解读

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";
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值