springmvc项目二RequestMapping注解

来源:互联网 发布:免费流量软件 移动 编辑:程序博客网 时间:2024/05/29 05:02

1,新建一个web项目,按照【springmvc项目一】的方式搭建好即可。本项目讲解关于springmvc的@RequestMapping注解。

2,在新项目的WEB-INF的文件夹中新建一个views的文件夹,然后在views中新建一个success.jsp文件。

在工程目录下(eclipse默认为WebContent)新建一个index.jsp。当前的两个jsp文件暂时没有其它内容,后面的操作中将逐一添加需要的代码。

3,新建一个TestRequestMapping的java类(我们将不断的往该类中添加新的测试方法)。

添加一个testRM()的测试方法。类和方法的代码如下。

在WEB-INF目录下新建一个index.jsp文件(后面所有添加的链接或者提交都在该页面中,相应的也会对应类的方法,我们将成对的讲述)。

代码中可以看出,@RequestMapping可以注解类,也可以注解方法。

其注解的意思表示可以通关过类似http://127.0.0.1:8080/web/testRequestMapping/testRM的链接来访问该类的该方法。

其对应的jsp代码如下,也就是运行本项目,点击该链接就可以调用到testRM()方法。

注意:如果类上没有给与@RequestMapping注解,那么访问是直接跟方法的注解地址即可。

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/testRequestMapping")public class TestRequestMapping {@RequestMapping("/testRM")public String testRM(){System.out.println("testRM()...");return "success";}}
<a href="testRequestMapping/testRM">test R M</a>

4,@RequestMapping注解的value和method属性。相关的java代码和jsp代码如下。

value属性是和上面一样表示映射的地址,只是如果不用其它的属性value可以省略不写。

method属性的表示,只接受什么类型的请求。

如下面的案例所示一个get的请求,一个post请求,而注解的方法只接受post的请求。所以当点击get请求的时候,会反馈给页面一个405的请求。

关于method的其它请求,我们在REST风格的项目中在行讲述。

<span style="white-space:pre"></span>@RequestMapping(value="/testMethod",method=RequestMethod.POST)public String testMethod(){System.out.println("testMethod()...");return "success";}
<a href="testRequestMapping/testMethod">testMethod get</a><form action="testRequestMapping/testMethod" method="post"><input type="submit" value="testMethod post"></form>

5,params属性

params 支持简单的表达式:
param1: 表示请求必须包含名为 param1 的请求参数。
 !param1: 表示请求不能包含名为 param1 的请求参数。
param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1。

使用get和post请求均有效。

案例中表示请求中必须包含name和age的请求参数,而且age不能等于0。

@RequestMapping(value="/testParams",params={"name","age!=0"})public String testParams(){System.out.println("testParams()..");return "success";}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px;"></span><pre name="code" class="html"><a href="testRequestMapping/testParams?name=tom&age=18">test Params</a><form action="testRequestMapping/testParams" method="post"><input type="text" name="name"><input type="text" name="age"><input type="submit" value="test Params"></form>

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px;">5,</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px">headers属性</span></span>

headers与params一样也支持上面的表达式。

案例中表示请求头的Accpet-Encoding和Accept-Language的参数必须与注解的一样才能相应其请求(案例中是复制chrome的请求头信息)。

@RequestMapping(value="/testHeaders",headers={"Accept-Encoding=gzip, deflate, sdch","Accept-Language=zh-CN,zh;q=0.8"})public String testHeaders(){System.out.println("testHeaders()...");return "success";}
<a href="testRequestMapping/testHeaders">test Headers</a>
6,Ant风格的资源地址

Ant 风格资源地址支持 3 种匹配符:                                                
?:匹配文件名中的一个字符                                                         
*:匹配文件名中的任意字符                                                         
**:** 匹配多层路径                                                          
@RequestMapping 还支持 Ant 风格的 URL:                                      
/user/*'/'createUser: 匹配  /user/aaa/createUser、 /user/bbb/createUser 等
/user/**'/'createUser: 匹配/user/createUser、 /user/aaa/bbb/createUser 等 
/user/createUser??: 匹配 /user/createUseraa、/user/createUserbb 等 URL    

@RequestMapping("/testAntStyle/**/before")public String testAntStyle(){System.out.println("testAntStyle()...");return "success";}

<a href="testRequestMapping/testAntStyle/**/before">test AntStyle</a>
7,占位符参数 @PathVariable

通过案例中的方式可以在请求地址中带入占位的参数,在方法中使用@PathVariable注解该占位符即可。(由于是在请求地址中的占位符,所以必须用GET请求方式)

@RequestMapping(value="/testPathVariable/{id}",method=RequestMethod.GET)public String testPathVariable(@PathVariable(value="id")Integer id){System.out.println("testPathVariable()... id = "+id);return "success";}

<a href="testRequestMapping/testPathVariable/23">test PathVariable</a>
8,通过@RequestParam请求来映射方法的请求参数。
 ①RequestParam的参数含义
      value:映射请求的参数名称,必须两方保持一致(页面,映射参数)
     required:表示value的参数是否为必须,默认为true。
 defaultValue:赋值给请求参数的默认值(对于post请求基本无效)。
 ②如果参数使用的是int(long、double等等)类型的参数时:
--如果使用post请求,而又没有值的话,则会报错,配置defaultValue也无效。
 --如果使用get请求,如果没有defaultValue="0"参数也会报错,如果有则不会报错。
 ③如果参数使用的是Intger,如果没有传输参数时不容易出错,值为null(建议使用Integer等包装类来代替基本数据类型)。

案例中演示了post请求的方式,你可以自行验证一下上述的结论。

@RequestMapping(value="/testRequestParam")public String testRequestParam(@RequestParam(value="name")String name,@RequestParam(value="age",required=true)/*int*/Integer age){System.out.println("testRequestParam()... name="+name+";age="+age);return "success";}
<span style="white-space:pre"></span><form method="post" action="testRequestMapping/testRequestParam">name:<input type="text" name="name"><br>age :<input type="text" name="age"><br><input type="submit" value="test RequestParam"></form>
9,关于如果接受 请求头和cookie信息的方法

在方法中使用@RequestHeader注解和@Cookievalue注解,然后标注其value属性即可得到参数(value可以省略)。

<span style="white-space:pre"></span>@RequestMapping(value="/testRequestHeader")public String testRequestHeader(@RequestHeader("Accept-Language")String language){System.out.println("testRequestHeader()..."+language);return "success";}@RequestMapping("/testCookieValue")public String testCookieValue(@CookieValue(value="JSESSIONID")String jessionId){System.out.println("testCookieValue()..."+jessionId);return "success";}
<span style="white-space:pre"></span><a href="testRequestMapping/testRequestHeader">test RequestHeader</a><br><br><a href="testRequestMapping/testCookieValue">test CookieValue</a>


















1 0