前言
上篇文章为spring-mvc做了个开篇,并且讲解了第一个例子Sample. 这篇文章将简单说一下请求转发,并且简单解释部分注解 

相关信息

该项目例子是spirng-mvc-showcase的RedirectController类,位于org.springframework.samples.mvc.redirect 包内 

类信息

  1. @Controller   
  2. @RequestMapping("/redirect")   
  3. public class RedirectController {   
  4.     private final ConversionService conversionService;   
  5.  
  6.     @Inject   
  7.     public RedirectController(ConversionService conversionService) {   
  8.         this.conversionService = conversionService;   
  9.     }   
  10.  
  11.     //--完整路径为/redirect/uriTemplate   
  12.     @RequestMapping(value="/uriTemplate"method=RequestMethod.GET)   
  13.     public String uriTemplate(RedirectAttributes redirectAttrs) {   
  14.         redirectAttrs.addAttribute("account", "a123");  //--用作URI的模板参数 即{account}   
  15.         redirectAttrs.addAttribute("date", new LocalDate(2011, 12, 31));  // 追加的查询参数(queryParam)   
  16.         return "redirect:/redirect/{account}";   
  17.     }      
  18.  
  19.     //--完成路径为/redirect/uriComponentsBuilder   
  20.     @RequestMapping(value="/uriComponentsBuilder"method=RequestMethod.GET)   
  21.     public String uriComponentsBuilder() {   
  22.         String date = this.conversionService.convert(new LocalDate(2011, 12, 31), String.class);   
  23.         //UriComponentsBuilder 是用于构建URI的 builder   
  24.         UriComponents redirectUri = UriComponentsBuilder.fromPath("/redirect/{account}").queryParam("date", date)   
  25.                 .build().expand("a123")//--这里代替了show方法的{account}   
  26.                 .encode();   
  27.         return "redirect:" + redirectUri.toUriString();   
  28.     }   
  29.  
  30.     @RequestMapping(value="/{account}"method=RequestMethod.GET)   
  31.     public String show(@PathVariable String account, @RequestParam(required=false) LocalDate date) {   
  32.         return "redirect/redirectResults";//--跳转到/redirect/redirectResults.jsp   
  33.     }   
  34.  
  35. }   

 解读

这个例子主要讲解了通过注解@RequestMapping的一些请求转发工作。

a. @RequestMapping

@RequestMapping不仅用于类,还可以用于方法,并且是一种增量关系。

1. uriTemplate()方法实际被请求URI为/redirect/uriTemplate

2. uriComponentsBuilder() 方法实际被请求URI为 /redirect/uriComponentsBuilder

3. show()方法可以在这里用于接收其他两个方法的请求,并且最终跳转到redirectResults.jsp

b. 两种请求方式

uriTemplate()和uriComponentsBuilder()分别展示了两种请求方式,主要用到了RedirectAttributes 和 UriComponentsBuilder 


关注几个注解

1. @Inject

这个注解在这里功能是@Autowired一样的,@Autowired是spring的注解,而@Inject是JSR-330的注解,又叫java的标准注解(standard annotations)。

注:如果用maven,只需加入如下配置:

  1. <dependency>   
  2. <groupId>javax.inject</groupId>   
  3. <artifactId>javax.inject</artifactId>   
  4. <version>1</version>   
  5. </dependency> 

或者

自行下载,地址如下http://repo1.maven.org/maven2/javax/inject/javax.inject/1/ 点击javax.inject-1.jar 即可 

对比spring与标准注解JSR-330 

Spring

javax.inject.*

javax.inject 限制/说明

@Autowired

@Inject

@Inject has no 'required' attribute

@Component

@Named

#

@Scope("singleton")

@Singleton

The JSR-330 default scope is like Spring's

prototype. However, in order to keep it consistent

with Spring's general defaults, a JSR-330 bean

declared in the Spring container is a singleton by

default. In order to use a scope other than

singleton, you should use Spring's @Scope

annotation.

javax.inject also provides a @Scope annotation.

Nevertheless, this one is only intended to be used for

creating your own annotations.

@Qualifier

@Named

#

@Value

# 无等效注解

@Required

# 无等效注解

@Lazy

# 无等效注解

#代表不存在,或者不需说明。

2. @PathVariable

       在SpringMVC中,用@PathVariable注解在一个方法的参数上用于绑定这个参数到URI模板值。
       看例子中的show()方法(注意这里的{account}不是SPEL),那为何{account}能够作为被请求的URI?  答案便是@PathVariable注解。 而@RequestParam则是用于 查询参数(queryParam)

3. @RequestParam

    绑定请求参数Controller的方法参数 

3.1 相关注解

    除了@PathVariable和@RequestParam,相关注解还有:

    @RequestHeader

    @RequestBody

    @RequestPart

    HttpEntity<?> 这个简单描述一下:用于访问Servlet请求的HTTP头和content. 

收尾

        我相信,通过这篇文章,你对spring-mvc的请求转发,以及相关注解有了一定认识。修行在个人了,呵呵,这些确实比较简单,希望大家自己也动手熟悉一下。