本文基于SpringMVC的helloworld项目来讲解演示。
Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求,其在控制器的类定义及方法定义处都可标注。
下面演示一下在注解@RequestMapping在类上的使用。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/springmvc")//在类上使用映射请求注解
@Controller
public class SpringMVCTest {
private final static String SUCCESS = "success";
@RequestMapping("/testRequestMapping")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}
}
<a href="springmvc/testRequestMapping.action">testRequestMappinga><br/>
如果在类上没有使用@RequestMapping("/springmvc"),那么如下代码可以写成如下的形式:
<a href="testRequestMapping.action">testRequestMappinga><br/>
/**
* 使用method来指定请求方式
*/
@RequestMapping(value="testMethod",method=RequestMethod.POST)
public String testMethod() {
System.out.println("testMethod");
return SUCCESS;
}
<form action="springmvc/testMethod.action" method="post">
<input type="submit" name="testMethod"/>
form>
注意:@RequestMapping中若未指明method属性,那么默认情况下则对于所有请求都会响应。
@RequestMapping(value="testHeaders", headers= {"Accept-Language=en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"})
public String testHeaders() {
System.out.println("testHeaders");
return SUCCESS;
}
需要注意的是Accept-Language后面跟的是等号,而不是冒号。
<a href="springmvc/testHeaders.action">testRequestHeadersa><br/>
@RequestMapping(value="testRequestParams", params= {"username","age!=10"})
public String testRequestParams() {
System.out.println("testRequestParams");
return SUCCESS;
}
<a href="springmvc/testRequestParams.action?username=abc&age=11">testRequestParamsa><br/>
@RequestMapping 还支持 Ant 风格的 URL,Ant 风格资源地址支持 3 种匹配符:
示例:
下面以*为例,代码示例如下:
@RequestMapping(value="testAntPath/*/abc")
public String testAntPath() {
System.out.println("testAntPath");
return SUCCESS;
}
<a href="springmvc/testAntPath/nn/abc.action">testAntPatha><br/>
带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义。所谓的REST的具体含义如下所示:
举例:简单地说就是:如一超链接文本(资源)以html格式显示在页面上(表现层),点击超链接文本时会向服务器的发送GET请求获取数据,这个过程服务器端则发生了“状态转化”。
我们可以通过 @PathVariable 将 URL 中占位符参数绑定到控制器处理方法的入参中。
比如我们在SpringMVCTest定义如下方法,其实现了将占位符id绑定到控制器处理方法testPathVariable的参数id中。
@RequestMapping(value="/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println("testPathVariable:" + id);
return SUCCESS;
}
接着在index.jsp中编写如下代码,并传入参数1,即testPathVariable方法的id值。
<a href="springmvc/testPathVariable/1.action">testPathVariablea><br/>
浏览器 form 表单只支持 GET与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器HiddenHttpMethodFilter,可以将这些POST请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求。
<filter>
<filter-name>HiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
public String testRestPut(@PathVariable("id") Integer id) {
System.out.println("testRest PUT:" + id);
return SUCCESS;
}
@RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") Integer id) {
System.out.println("testRest DELETE:" + id);
return SUCCESS;
}
@RequestMapping(value="/testRest", method=RequestMethod.POST)
public String testRestPost() {
System.out.println("testRest POST");
return SUCCESS;
}
@RequestMapping(value="/testRest/{id}", method=RequestMethod.GET)
public String testRestGet(@PathVariable("id") Integer id) {
System.out.println("testRest GET:" + id);
return SUCCESS;
}
<form action="springmvc/testRest/1.action" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit" value="TestRest PUT"/>
form>
<form action="springmvc/testRest/1.action" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit" value="TestRest DELETE"/>
form>
<form action="springmvc/testRest.action" method="post">
<input type="submit" value="TestRest POST"/>
form>
<a href="springmvc/testRest/1.action">testRest GETa><br/>
注意:这里使用到了隐藏表单,value的值为对应的提交方法,而name的值为_method。我们可以查看HiddenHttpMethodFilter的源码,具体如下示:
即过滤器会根据表单的name的值_method去获取对应的value,然后做对应的过滤操作。
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法。
代码示例如下:
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username") String un,
@RequestParam(value="age", required=false, defaultValue="0") int age) {
System.out.println("username:" + un + " age:" + age);
return SUCCESS;
}
注意:value:参数名;required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常;defaultValue:默认值。基本数据类型必须要赋予默认值,因为不能使用null值表示。
<a href="springmvc/testRequestParam.action?username=abc">testRest RequestParama><br/>
请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中。
代码示例如下:
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String al) {
System.out.println("Accept-Language:" + al);
//输出Accept-Language:en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
return SUCCESS;
}
<a href="springmvc/testRequestHeader.action">testRequestHeadera><br/>
注意:@RequestHeader与@RequestParam相似,都有required等属性。
@CookieValue 可让处理方法入参绑定某个 Cookie 值。
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String sessionId) {
//输出:session id:8CBD7E8DE6851D48ACB806C4B020C6FB
System.out.println("session id:" + sessionId);
return SUCCESS;
}
注意:@CookieValue与@RequestParam相似,都有required等属性。
Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值,并将POJO对象放入请求域中。支持级联属性。
代码示例如下:
public class User {
private String uid;
private String username;
private String password;
private Integer age;
private Address address;
public User() {
super();
}
public User(String uid, String username, String password, Integer age, Address address) {
super();
this.uid = uid;
this.username = username;
this.password = password;
this.age = age;
this.address = address;
}
//getter,setter,toString
}
public class Address {
private String province;
private String city;
public Address() {
super();
}
public Address(String province, String city) {
super();
this.province = province;
this.city = city;
}
//getter,setter,toString
}
@RequestMapping(value="/testPOJO",method=RequestMethod.POST)
public String testPOJO(User user) {
System.out.println(user);
return SUCCESS;
}
<form action="springmvc/testPOJO.action" method="POST">
uid:<input type="text" name="uid"/><br/>
username:<input type="text" name="username"/><br/>
password:<input type="password" name="password"/><br/>
age:<input type="text" name="age"/><br/>
province:<input type="text" name="address.province"/><br/>
city:<input type="text" name="address.city"/><br/>
<input type="submit" name="确定"/>
form>
SpringMVC 的 Handler 方法可以接收如下 ServletAPI 类型的参数:
HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、 Locale、InputStream、OutputStream、Reader、Writer。
下面演示一下一些API的使用。
@RequestMapping(value="/testServletAPI")
public void testServletAPI(HttpServletRequest req, HttpServletResponse resp, Writer out) throws IOException {
System.out.println("HttpServletRequest:" + req);
System.out.println("HttpServletResponse:" + resp);
/*
* 输出:
* HttpServletRequest:org.apache.catalina.connector.RequestFacade@133beef9
* HttpServletResponse:org.apache.catalina.connector.ResponseFacade@2b695474
*/
out.write("hello SpringMVC!");//会在页面上显示
}