Spring MVC学习路(五)RequestMapping

@Controller  
@RequestMapping("/user")                 //1处理器的通用映射前缀  
public class HelloWorldController2 {  
    @RequestMapping("/hello2")        //2相对于1处的映射进行窄化  
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

此时访问localhost:8888/demo/hello2 在控制台内是无法打印出“hello!”的

值能访问localhost:8888/demo/user/hello2 才能访问次方法,堪称方法级别的RequestMapping

同时也叫窄化请求映射

多个URL路径可以映射到同一个处理器的功能处理方法

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2","/testhello")        //多URL映射同一处理方法
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

URI模板模式映射

@Controller  
public class HelloWorldController2 {  
    @RequestMapping("/hello2/{fid}")   //fid是占位符        
    public ModelAndView helloWorld() {  
         System.out.print("hello!");
         ..以下省略
    }  
}

通过这种占位符的方式可以通过/hello2/123444或者/hello/abc的映射访问该处理器,通过@PathVariable可以提取URI模板模式中的{×××}中的×××变量。当然修改/hello2/{fid}为/hello2/{fid}/test同理

Ant风格的URL路径映射


@RequestMapping("/users/**"):可以匹配“/users/abc/abc”,但“/users/123”将会被【URI模板模式映射中的“/users/{userId}”模式优先映射到

 @RequestMapping("/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;

@RequestMapping("/product*"):可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;

@RequestMapping("/product/*"):可匹配“/product/abc”,但不匹配“/productabc”;

@RequestMapping("/products/**/{productId}"):可匹配“/products/abc/abc/123”或“/products/123”

也就是Ant风格和URI模板变量风格可混用;


通过@PathVariable取值

使用@PathVariable取值时,必须使用基本类型定义变量

@Controller
public class Test {
	@RequestMapping("test/{fid}")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此时访问http://localhost:8888/SpringMVCTest/test/12334?a=333

在控制台会打印出12334和333两个参数

但如果访问http://localhost:8888/SpringMVCTest/test?a=333

则会报404错误

正则表达式风格的URL路径映射

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。

规定请求的方法指定映射

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.POST)
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

如果此时直接通过浏览器访问http://localhost:8888/SpringMVCTest/test/12334?a=333则会报

HTTP Status 405 - Request method 'GET' not supported

错误,必须使用POST请求才能指定到该映射,而将

method = RequestMethod.POST

改为

method = RequestMethod.GET

即可直接通过网页访问

注意:此时因为@requestMapping内存在多个参数,

@RequestMapping(value="test/{fid}",method = RequestMethod.POST)

所以不可再简写为

@RequestMapping("test/{fid}")

除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE。

DispatcherServlet默认开启对 GET、POST、PUT、DELETE、HEAD的支持

如果需要支持OPTIONS、TRACE,请添加DispatcherServlet在web.xml的初始化参数:dispatchOptionsRequest 和 dispatchTraceRequest 为true。

@RequestMappings属性之params

@Controller
public class Test {
	@RequestMapping(value="test/{fid}",method = RequestMethod.GET,params="dai")
	public void test1(@PathVariable("fid") String fid,
			@RequestParam("a")String a,HttpServletResponse res) throws IOException{
		System.out.println(fid);
		System.out.println(a);
		res.getWriter().print(a);
	}
}

此时通过访问:http://localhost:8888/SpringMVCTest/test/12334?a=333  会出现404错误

需要通过访问:http://localhost:8888/SpringMVCTest/test/12334?dai&a=333正常

如果将

params="dai"

改为

params="!dai"  访问时参数名不带dai即可访问


访问时参数名dai的值为123时可访问
params="dai=123"
访问时参数名dai的值不为123时可访问
params="dai!=123"


方法内@解释 

以下信息来源:http://jinnianshilongnian.iteye.com/blog/1705701

1、@RequestParam绑定单个请求参数值;

参数:

value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#

如果请求中有多个同名的应该如何接收呢?如给用户授权时,可能授予多个权限,首先看下如下代码:

public String test(@RequestParam(value="role") String roleList)

如果请求参数类似于url?role=admin&role=user,则实际roleList参数入参的数据为“admin,user”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:

public String test(@RequestParam(value="role") String[] roleList)

或者

public String test(@RequestParam(value="list") List<String> list)
2、@PathVariable绑定URI模板变量值

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(  
       @PathVariable(value="userId") int userId,   
       @PathVariable(value="topicId") int topicId)

如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。代码在PathVariableTypeController中。

3、@CookieValue绑定Cookie数据值

@CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上。

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)

如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。

传入参数类型也可以是javax.servlet.http.Cookie类型。

 

测试代码在CookieValueTypeController中。@CookieValue也拥有和@RequestParam相同的三个参数,含义一样。

4、@RequestHeader绑定请求头数据

@RequestHeader用于将请求的头信息区数据映射到功能处理方法的参数上。

@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts)

如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。测试代码在HeaderValueTypeController中。

 

@RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。

5、@ModelAttribute绑定参数到命令对象

@ModelAttribute一个具有如下三个作用:

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;

②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。


6、@SessionAttributes绑定命令对象到session

有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。

7、@RequestBody绑定请求的内容区数据并能进行自动类型转换等。

8、@RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。


转载于:https://my.oschina.net/u/2538370/blog/537597

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值