RquestMapping的注解方式

RequestMapping修饰类
请求方式
请求参数和请求头
PathVarible注解
HiddenHttpMethodFilter(Rest风格)
RequestParam注解
使用实体类作为参数

RequestMapping注解方式

RequestMapping修饰类


@Controller //表示是一个控制器
@RequestMapping("/hello")
public class HelloWorld {

	@RequestMapping("/helloworld")
	public String sayHello() {
		System.out.println("Hello SpringMVC");
		return "success";
	}
	
}

上面的程序中,在类上使用@RequestMapping(“/hello”),而在目标方法上使用@RequestMapping(“/helloworld”),那么这个目标方法真实的映射的地址是:/hello/helloworld,所以我们得出结论:

  • @RequestMapping在类定义处:提供了初步的映射请求URL,表示此请求处理器中所有的目标方法都在此URL下访问
  • @RequestMapping在方法处:为方法提供了进一步的映射请求URL。
    那么我们的目标方法真实的映射URL信息 = 类定义处映射的URL+方法定义出映射的URL。而且不管是类定义出映射的URL还是方法定义出映射的URL都可以省略第一个/。

RequestMapping请求方式

1.method=RequestMethod.POST : 表示此处理方法只能够处理POST请求
2.method=RequestMethod.GET : 表示此处理方法只能够处理GET请求
3.method=RequestMethod.DELETE : 表示此处理方法只能够处理DELETE请求
4.method=RequestMethod.PUT : 表示此处理方法只能够处理PUT请求

RequestMapping指定请求参数和请求头(不常用)

范例一.指定请求参数
使用params指定请求参数,因为参数可能有多个,所以使用一个数组来表示

  1. params= {“name”,“age”} : 表示请求参数必须包含name 和 age,否则出现404错误
  2. params= {“name=jjm”,“age”}:表示请求参数必须包含name 和 age,而且name的参数值必须为jjm,否则出现404
  3. params= {“name!=jjm”,“age”}:表示请求参数必须包含name 和 age,而且name的参数值必须不能为为jjm,否则出现404
  4. params= {“name=jjm”,"!age"}:表示请求参数必须包含name,但是不能存在age参数,而且name的参数值必须为jjm,否则出现404

说明:RequetMapping注解可以使用value映射请求地址,使用method映射请求方法,我们也可以使用params映射请求参数,使用headers映射请求头,如果请求的地址不是value指定的映射地址,那么肯定不会执行相应的请求处理器的目标方法,如果请求方式不是method指定的请求方式,那么也不会执行相应的请求处理器的目标方法,同理,如果没有满足params和headers指定的请求参数和请求头,也不会执行响应的请求处理器的目标方法。
范例二:指定请求头,请求头和请求参数是同样的道理
使用headers指定请求头,因为请求头可能有多个,所以使用一个数组来表示headers= {“Connection=keep-alive”}:表示必须包含Connection请求头,而且只必须是keep-alive

PathVariable注解

@PathVariable注解时用来映射URL绑定的占位符,是Spring3.0中新增的功能,这个功能在SpringMVC向Rest目挺近的过程中具有里程碑式的意义,通过@PathVariable注解可以将URL中占位符参数绑定要请求处理器的目标方法入参中,URL中{XXX}占位符通过@PathVariable(“XXX”)注解绑定要目标方法的入参中。

@RequestMapping("/testPathVariable/{name}/{age}")
	public String testPathVariable(@PathVariable("name")String name,@PathVariable("age")Integer age) {
		System.out.println("name:" + name + ",age:" + age);
		System.out.println("testPathVariable....");
		return SUCCESS;
	}
	/*
	/testPathVariable/{name}/{age} : 表示会通过url占位符的形式传递两个参数过来,一个是name,另外一个是age
	 * 		处理器的目标方法中使用@PathVariable("name") String name 获取URL占位符中的name参数,并且赋值给目标方法的入参name
	 * 		处理器的目标方法中使用@PathVariable("age")Integer age 获取URL占位符中的age参数,并且赋值给目标方法的入参age
	 * 		
	 * 		请求地址:hello/testPathVariable/jjm/32 会匹配到 /testPathVariable/{name}/{age} ,而且通过URL占位符携带的参数为jjm 和 32 */

HiddenHttpMethodFilter过滤(REST风格URL)

REST:Representational state transfer 叫做资源表现层状态转化,是目前最流行的一种互联网软件架构,Rest结构清晰,符合标准,易于理解,便于扩展,所以目前得到了越多越多的网站使用。转台转化:每次发送一个请求,表示客户端和服务端的一次交互过程,Http协议是一个无状态的协议,即所有的状态都保存在服务器端,因此如果客户想要操作服务器,必须通过某种手段,让服务器端发生状态转化,而这种转化是建立在表现层的,所以就叫做资源表现出状态转化,具体的说,就是在Http协议中,使用get请求来获取资源,使用post请求来新建资源,使用put请求来更新资源,使用delete请求来删除资源 ,http协议中存在get请求和post请求,如果发送put和delete请求呢,SpringMVC可以将post请求转换成put或者delete请求,这就是SpringMVC提供的资源表现层状态转化。所以在我们后续的开发中,不仅仅只有post和get请求了,还存在delete和put请求。
实例:

  1. get请求查询数据:/user/1 表示查询ID为1的资源
  2. Post请求新增数据:/user表示新增资源
  3. Delete请求删除资源:/user/1 表示删除ID为1的资源
  4. Put 请求修改资源 :/user/1 表示修改ID为1的资源

现在关键在于如何将post请求转换成delete和put请求呢?SpringMVC提供了响应的解决方案:

  • 配置过滤器 HiddenHttpMethodFilter
  • 发送post请求,携带_method = put 或者_method=delete 表示将post请求转换成put或者delete 请求。
    ①:在web.xml中配置过滤器
<!-- 配置HiddenHttpMethodFilter -->
	<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>

②:编写请求处理器

/**
	 * 	删除
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)
	public String deleteById(@PathVariable("id") Integer id) {
		System.out.println("delete...." + id);
		return SUCCESS;
	}
	
	/**
	 * 	修改
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
	public String updateById(@PathVariable("id") Integer id) {
		System.out.println("put...." + id);
		return SUCCESS;
	}
	
	/**
	 * 	新增
	 * @return
	 */
	@RequestMapping(value="/user",method=RequestMethod.POST)
	public String insert() {
		System.out.println("post....");
		return SUCCESS;
	}
	
	/**
	 * 	查询
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
	public String selectById(@PathVariable("id") Integer id) {
		System.out.println("get...." + id);
		return SUCCESS;
	}

③:编写请求页面

<form action="${pageContext.request.contextPath}/hello/user/1" method="post">
		<input type="hidden" name="_method" value="delete">
		<button>test RestFul Delete</button>
	</form>
	<br>
	
	<form action="${pageContext.request.contextPath}/hello/user/1" method="post">
		<input type="hidden" name="_method" value="put">
		<button>test RestFul Put</button>
	</form>
	<br>
	
	<form action="${pageContext.request.contextPath}/hello/user" method="post">
		<button>test RestFul Post</button>
	</form>
	<br>
	<a href="${pageContext.request.contextPath}/hello/user/1">test RestFul Get</a>

说明:参数名一定要_method
参数值delete或者put有没有大小写的限制
可以不使用隐藏域传递_mthod,但是存在问题,使用text显示的话可能会被用户修改,所以建议使用hidden隐藏域
对于Rest风格的url

RequestParam注解

在请求处理器的目标方法中,通过入参就可以获取请求参数的信息
约定:目标方法入参参数名和 请求参数名称一致,就会自动匹配
指定方式:使用@ReuqestParam注解指定匹配的请求参数名称,此种情况下,如果没有对应的指定的请求参数,则会报错,我们可以使用required=false属性表示参数非必须,如果获取不到非必须的参数,会设置为null,defaultValue 表示设置默认值。

使用实体类对象作为参数

对于新增或修改时,表单传递的参数很多,实际上都能够对应到实体类的属性,对于接收表单参数

  • request.getParameter() : 原生开发使用
  • @RequestParam注解 : 之前讲解的SpringMVC接收参数
    以上两种做法在表单提交的参数数量较多的情况下,不适用,最终的解决方案
  • 使用实体类作为处理器目标方法的入参:SpringMVC会将对应实体类JavaBean风格属性名的参数自动的封装到实体类的属性上
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值