springmvc(二)之@RequestMapping、@PathVariable注解

1.使用@RequestMapping映射请求

  • springmvc使用@RequestMapping注解为控制器指定可以处理哪些URL请求
  • 在控制的类定义及方法定义处都可以标注
    @RequestMapping:
    类定义处:提供初步的请求映射信息。相对于WEB应用的根目录
    //Controller类
    @Controller
    @RequestMapping("/test")
    public class TestController {
    
    	@RequestMapping("/hello")
    	public String hello() {
    		return "success";
    	}
    }
    // index.jsp(链接访问)
    <a href="test/hello">test</a>
    
    方法定义处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处为标注@RequestMapping,则方法标记处的URL是相对于WEB应用的根目录
    @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请求

  1. 需要配置HiddenHttpMethodFilter
  2. 需要发送POST请求
  3. 需要在发送POST请求时,携带一个name="_method"隐藏域,值为DELETE或PUT
发布了78 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Lucky_Boy_Luck/article/details/100049688