为什么RequestMapping是一个Annotation我却不使用艾特符号呢?哈哈,大家都知道的,我就不解释了。阅读博客的同志们知道就可以了。
RequestMapping是SpringMVC经常使用的一个Annotation,所以关于它的知识点一定要熟悉。
代码演示部分是按照controller,然后是view的方式呈现。
下面是我的类名和类的注解
@RequestMapping("/springmvc")
@Controller
public class RequestMappingTest {
public final static String SUCCESS = "success";
}
1、使用RequestMapping来修饰类
RequestMapping除了可以用来修饰方法,当然这也是SpringMVC相对于Struts2一个优势的地方。但是一定要知道的是RequestMapping也可以用来修饰类。若如此,则对应访问到此控制器的url为类配置信息加上方法配置信息
下面的例子中访问此控制器应该如此:springmvc/testRequestMapping
@RequestMapping("/testRequestMapping")
public String testRequestMapping() {
return SUCCESS;
}
<a href="springmvc/testRequestMapping">testRequestMapping</a>
2、RequestMapping的method属性
RequestMapping的属性比较丰富,常见的默认属性就是value,用来指定URL地址。我们知道,在Annotation中使用的唯一属性是value的话,是可以省略的。现在介绍一个也比较常用的属性-method属性,这个属性用来指定请求类型。这时,客户端的请求被响应的条件除了URL正确外,请求的类型也应当和要求的类型对应,否则,控制器方法则不予处理该请求。详细使用方法见下面的例子。
@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
public String testMethod() {
return SUCCESS;
}
<!-- Get方式的请求,错误405 -->
<a href="springmvc/testMethod">testMethod</a>
<!-- post方式的请求 -->
<form action="springmvc/testMethod" method="post">
<input type="submit" value="testMethod">
</form>
3、RequestMapping的params和headers属性
params和headers属性在开发中使用较少,了解即可,params用来限制提交指定参数(而且有时需要满足一些规则)的请求可以访问到这个控制器方法,headers用来限制请求头与指定信息相同时才可以访问到这个控制器方法,params和headers都支持多参数,并且支持简单的表达式。我们看下面的例子就一目了然了。
@RequestMapping(value = "/testParamsAndHeaders", params = { "username", "age!=10" }, headers = {
"Host=localhost:8080" })
public String testParamsAndHeaders() {
return SUCCESS;
}
<a href="springmvc/testParamsAndHeaders?username=rgx&age=10">testParamsAndHeaders</a>
4、RequestMapping与Ant风格的通配符
RequestMapping的映射规则支持Ant风格的通配符,什么是Ant风格的通配符呢?
? : 代表的是一个字符
* : 代表任意个字符
** : 代表多层路径
下面的例子仅测试*通配符。
@RequestMapping("/testAntPath/*/abc")
public String testAntPath() {
System.out.println("testAntPath");
return SUCCESS;
}
<a href="springmvc/testAntPath/hello/abc">testAntPath</a>
5、RequestMapping的搭档PathVariable注解
为什么我说PathVariable是RequestMapping的搭档呢,因为这个注解可以将URL中的占位符映射为方法参数,然后在方法中使用,很多人都认为PathVariable是SpringMVC向REST风格的URL请求挺进的重要里程碑。下面的一个方面即将讲到。以前的URL是什么形式,大概就是这样的:order?id=1,但是使用PathVariable注解后我们就可以这样写:order/1。关于PathVariable的使用方法见下面的例子。
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer i) {
System.out.println("testPathVariable:" + i);
return SUCCESS;
}
<a href="springmvc/testPathVariable/1">testPathVariable</a>
6、RequestMapping与REST
咱们再来简单的说下这个REST风格的URL
* 就以数据库的CRUD为例:
* 意义 URL规则 请求类型 以前的风格
* 获取 /order/1 GET get?1
* 新增 /order POST create
* 修改 /order/1 PUT update?1
* 删除 /order/1 DELETE delete?1
像上面这样去理解的话就很容易看懂了,但是拿去测试的同学注意了:
使用tomcat8可能会遇到一个问题,请求方式是DELETE或者PUT的的时候,由于控制器访问视图使用的是转发的式(即保留了请求方式),但是视图JSP不支持这两种请求方式,所以会报错,但是tomcat7神奇般的规避了这个错误所以在使用tomcat8上面跑SpringMVC项目时候,为了便于调试和优化,建议在方法方法前面加上@ResponseBody注解,此注解可以将方法返回的字符串直接作为页面的输出。即不进入视图解析器。
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
//@ResponseBody
public String testRestDelete(@PathVariable Integer id) {
System.out.println("testRestDelete:" + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
//@ResponseBody
public String testRestPUT(@PathVariable Integer id) {
System.out.println("testRestPUT:" + id);
return SUCCESS;
}
@RequestMapping(value = "/testRest", method = RequestMethod.POST)
public String testRestPost() {
System.out.println("testRestPost");
return SUCCESS;
}
@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
public String testRestGet(@PathVariable Integer id) {
System.out.println("testRestGet:" + id);
return SUCCESS;
}
<a href="springmvc/testRest/1">testRestGet</a>
<br>
<br>
<form action="springmvc/testRest" method="post">
<input type="submit" value="testRestPost">
</form>
<br>
<br>
<form action="springmvc/testRest/1" method="post">
<!-- 设置隐藏域。将_method加在请求中传给控制器 -->
<input type="hidden" name="_method" value="DELETE"> <input type="submit" value="testRestDelete">
</form>
<br>
<br>
<form action="springmvc/testRest/1" method="post">
<!-- 设置隐藏域。将_method加在请求中传给控制器 -->
<input type="hidden" name="_method" value="PUT"> <input type="submit" value="testRestPut">
</form>
<input type="submit" value="testRestPost">
</form>
<br>
<br>
<form action="springmvc/testRest/1" method="post">
<!-- 设置隐藏域。将_method加在请求中传给控制器 -->
<input type="hidden" name="_method" value="DELETE"> <input type="submit" value="testRestDelete">
</form>
<br>
<br>
<form action="springmvc/testRest/1" method="post">
<!-- 设置隐藏域。将_method加在请求中传给控制器 -->
<input type="hidden" name="_method" value="PUT"> <input type="submit" value="testRestPut">
</form>