1.使用@RequestMapping映射请求
- springmvc使用@RequestMapping注解为控制器指定可以处理哪些URL请求
- 在控制的类定义及方法定义处都可以标注
@RequestMapping:
类定义处:提供初步的请求映射信息。相对于WEB应用的根目录
方法定义处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处为标注@RequestMapping,则方法标记处的URL是相对于WEB应用的根目录//Controller类 @Controller @RequestMapping("/test") public class TestController { @RequestMapping("/hello") public String hello() { return "success"; } } // index.jsp(链接访问) <a href="test/hello">test</a>
@Controller public class HelloWorldController { private static final String SUCCESS = "success"; @RequestMapping("/hello") public String hello() { System.out.println("hello world"); return SUCCESS ; } } //index.jsp(链接访问) <a href="hello">hello</a>
- DispatcherServlet截获请求后,就通过控制器上的@RequestMapping注解提供的映射信息确定请求所对应的处理方法
1.1映射请求参数、请求方法、请求头
- @RequestMapping除了可以使用URL映射请求外,还可以使用请求参数、请求方法、请求头映射请求
- @RequestMapping的value、method、params和heads分别表示请求URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系
- params和headers支持简单的表达式:
param1:表示请求必须包含名为param1的请求参数
!param1:表示请求不能包含名为param1的请求参数
param1 != value1:示请求包含名为param1的请求参数,但其值不能为value1
{“param1=value1”, “param2”}:表示请求必须包含名为param1和param2的请求参数,且param1的值为value1
1.2映射请求URL、请求方法
method:指定请求方式
@Controller
@RequestMapping("/test")
public class TestController {
private static final String SUCCESS = "success";
@RequestMapping(value="/hello", method=RequestMethod.POST)
public String hello() {
return SUCCESS;
}
}
访问:
<form action="test/hello" method="post">
<input type="submit" value="确定" />
</form>
表单提交,且指定提交方式“post”
不能用超链接:
<a href="test/hello">test</a>
因为超链接是get方式提交
1.3映射请求参数、请求头
映射请求参数、请求头不是很常用,了解即可
@RequestMapping(value="/testParam", params= {"username", "age != 10"})
public String testParam() {
return SUCCESS;
}
请求地址中要携带参数username、age,且age != 10
访问:
<a href="test/testParam?username=zzc&age=11">testParam</a>
2.映射请求支持通配符
2.1Ant风格资源地址支持3中通配符
- ?:匹配文件名中的一个字符
- *:匹配文件名中的任意字符
- **:匹配多层路径
2.2@RequestMapping还支持Ant风格的URL
- /user/*/createUser:匹配/user/aaa/createUser、/user/bbb/createUser等URL
- /user/**/createUser:匹配/user/createUser、/user/aaa/bbb/createUser等URL
- /user/createUser??:匹配/user/createUseraa、/user/createUserbb等URL
3.@PathVariable注解映射URL绑定的占位符
- 通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL中的{xxx}绑定到操作方法的入参中
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
return SUCCESS;
}
URL中的占位符参数a要与@PathVariable里面的参数b要一样
即:/testPathVariable/{a} -----》 @PathVariable(“a”)
访问:
<a href="test/testPathVariable/1">testPathVariable</a>
4. REST风格
- REST:(资源)表现层状态转化。它结构清晰、符合标准、易于理解
- 资源:网络上的一个实体,或者说是网络上的一个具体信息。可以用一个URI指向它。每一种资源对应一个特定的URI
- 表现层:把资源具体呈现出来
- 状态转换:每发出一个请求,就代表了客户端端和服务器的一次交互过程。HTTP协议是一个无状态的协议,即所有的状态都保存在了服务器。因此,如果客户端想要操作服务器,必须通过某种手段,使服务器发生状态换。而这种转换是建立在表现层上面的,所以就是“表现层状态转换”。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、DELETE、PUT。它们分别对应四种操作:GET用来获取资源、POST用来新建资源、DELETE用来删除资源、PUT用来更新资源
示例:
- /user/1 HTTP GET :得到一个id=1的user
- /user HTTP POST:新增一个user
- /user/1 HTTP DELETE:删除id=1的user
- /user/1 HTTP PUT:更新id=1的user
4.1HiddenHttpMethodFilter
浏览器form表单只支持GET与POST,并不支持DELETE、PUT等方法。在spring3.0中添加了一个过滤器,可以将这些请求转化为标准的http方法,使得支持GET、POST、DELETE、PUT请求
在web.xml中进行配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>springmvc-01-helloworld</display-name>
<!-- 配置HiddenHttpMethodFilter 可以把POST请求转换为DELETE请求/POST请求 -->
<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>
...
</web-app>
- 配置HiddenHttpMethodFilter
REST风格示例:
@RequestMapping(value="/testRest/{id}", method=RequestMethod.GET)
public String testRestGet(@PathVariable("id") Integer id) {
System.out.println(id);
return SUCCESS;
}
@RequestMapping(value="/testRest", method=RequestMethod.POST)
public String testRestPost() {
System.out.println("REST POST ...");
return SUCCESS;
}
@RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") Integer id) {
System.out.println(id);
return SUCCESS;
}
@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
public String testRestPut(@PathVariable("id") Integer id) {
System.out.println(id);
return SUCCESS;
}
以CRUD为例:
/user/1 HTTP GET :得到一个id=1的user get?id=1
/user HTTP POST:新增一个user
/user/1 HTTP DELETE:删除id=1的user delete?id=1
/user/1 HTTP PUT:更新id=1的user update?id=1
要在success.jsp页面添加 “isErrorPage=‘true’”,不然不会显示此页面
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
....
访问:
<a href="test/testRest/1">Test REST GET</a>
<br>
<form action="test/testRest" method="post">
<input type="submit" value="REST POST" />
</form>
<br>
<form action="test/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="REST DELETE" />
</form>
<br>
<form action="test/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="REST PUT" />
</form>
以上就是如何发送POST、DELETE请求
- 需要配置HiddenHttpMethodFilter
- 需要发送POST请求
- 需要在发送POST请求时,携带一个name="_method"隐藏域,值为DELETE或PUT