这篇讲的是RequestMapping的映射和HiddenHttpMethodFilter过滤器
@Controller
@RequestMapping("indexClassController")
public class indexController {
@RequestMapping("indexController")
public String GOTO() {
return "index";
}
}
一般controller中的映射有类的映射和方法的映射,如果像我这段代码一样是如何映射的呢?
<a href="indexClassController/indexController">hello world</a>
没错,先类的映射再类里方法的映射
接下来谈谈RequestMapping里面的属性
首先我们前面给出来的代码其实等价于
@Controller
@RequestMapping(value="indexClassController")
public class indexController {
@RequestMapping(value="indexController")
public String GOTO() {
return "index";
}
}
除了value,还有很多属性
- 比如method
举个例子: @RequestMapping(value=“indexController” method=RequestMethod.POST)
这段代码中的method=RequestMethod.POST表示拦截"indexController"的POST请求然后进入这个方法 - 比如params
@RequestMapping(value="indexController" method=RequestMethod.POST,params={"name"})
表示必须有一个"name"的参数
@RequestMapping(value="indexController" method=RequestMethod.POST,params={"name=cpy"})
表示必须有一个"name"参数的同时还要参数值为cpy才行
@RequestMapping(value="indexController" method=RequestMethod.POST,params={"name=cpy","age!=0"})
表示要不就没这个age的参数,要不就不能为0;
@RequestMapping(value="indexController" method=RequestMethod.POST,params={"name=cpy","age!=0","!weight"})
表示不能有如果有weight参数就不拦截
- 接下来我们谈谈ant风格的请求路径
‘?’ 任意一个单字符
‘*’ 任意字符(0个或多个)
‘**’ 任意目录
@RequestMapping(value="indexController/*/hello")
以下会被拦截
<a href="indexController/aaaa/hello">helloworld</a>
<a href="indexController/bbbb/hello">helloworld</a>
但是
<a href="indexController/aaaa/bbbbb/hello">helloworld</a>
这样就不会拦截了,会报404NotFound的错误,但是换成这样的就可以
@RequestMapping(value="indexController/**/hello")
因为**表示任意目录
- @PathVariable动态获取参数
如果
<a href="indexController/cpy" >hello</a>
就把cpy这个值传给了控制器中的name变量
@RequestMapping(value="indexController/{name}")
public String indexController(@PathVariable("name") String name){
System.out.println(name)
return "index";
}
这里控制台就打印 cpy
- Spring-MVC四种请求
get :查
post :增
delete :删
put :改
一般有一些浏览器不支持delete和put所以我们一般使用过滤器来实现
这个过滤器的名字叫做"HiddenHttpMethodFilter"
这个过滤器有一些约定:
第零:请求方式必须为post
第一:这个请求必须是隐藏域
第二:这个请求的name属性值必须是"_method"
第三:这个请求的value属性值必须是"delete"或者"put"
<input type="hidden" name="_method" value="delete"/>
<input type="hidden" name="_method" value="put"/>
接下来我们在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>
这个和servlet的那个很像
唯一不一样的是filter-mapping种的url-pattern中拦截所有的请求是 /* ;
然后我们在jsp页面中写上
<form action="indexControllerDelete" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="delete"/>
</form>
<br>
<form action="indexControllerPut" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="put"/>
</form>
这里的value值必须为大写,因为是枚举类型
那么Controller里面怎么写呢?
@RequestMapping(value="indexControllerDelete",method=RequestMethod.DELETE)
public String DeleteTest(){}
@RequestMapping(value="indexControllerPut",method=RequestMethod.PUT)
public String PutTest(){}
这样就可以通过put和delete请求了
这篇文章来自于我观看网易云课堂的"SpringMVC视频教程"后记录下来的笔记,不得不说这个老师讲得很好,推荐大家去看看,另外有什么问题还请联系博主
最后祝大家学习愉快