1.@Controller注解
该注解用来标记类,由其标记的类就是一个Spring MVC Controller的一个对象,即一个控制器类。
Spring使用扫描机制扫描应用程序中所有使用该注解进行注释的类,分发处理器会扫描使用了该注解的类的方法,并检测方法是否使用了@RequestMapping注解,使用了@RequestMapping注解的方法才是真正处理请求的处理器。
Spring能够扫描到控制器,需要在Spring MVC的配置文件(springmvc-servlet.xml文件)中完成两个配置项:
1.在头文件中引入spring-context。
2.使用<context:component-scan/>元素,该元素的功能:启动包扫描功能,注册使用了@Controller、@Service、@Repository、@Component等注解的类成为Spring的bean。
<context:component-scan base-package="com.snow.dcl.controller"/>
base-package属性指定了需要扫描的包,该包以及其子包中的类都会被处理,所有的控制器类都应该放在该包路径下,以免扫描其他无关的包。
接下来,我们要创建一个Spring MVC的配置文件,并且从中配置,在我们的maven项目“src/main/webapp/WEB-INF”目录下创建一个springmvc-config.xml,这个xml文件就是我们的Spring MVC配置文件。配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schhttp://localhost:8088/springmvc-comment1/helloWorldema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件,
如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="com.qianchunhua.controller"/>
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix">
<value>/WEB-INF/content/</value>
</property>
<!-- 后缀 -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
由于在我们的java文件中使用了注解类型,因此不需要再配置文件中使用xml描述bean。
<context:component-scan base-package="com.qianchunhua.controller"/> 指定需要Spring扫描com.qianchunhua.controller包及其子包下面的所有java文件。
最后配置了视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。视图解析器中配置的prefix属性表示视图的前缀,suffix表示视图的后缀,返回的视图字符串是“helloWorld”,经过视图解析器之后,则视图的完整路径是:/WEB-INF/content/helloWorld.jsp。
需要注意的是,在此配置文件中没有配置处理映射器和处理适配器时,Spring会使用默认的处理映射器和处理适配器处理请求。此外,还需要在web.xml中配置Spring MVC的前端控制器DispatcherServlet。web.xml配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>springmvc-comment1</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
到此,我们就将@Controller注解的案例应用给写完了。下面,我将部署springmvc-comment1项目,在浏览器中输入如下url地址来测试应用:
http://localhost:8088/springmvc-comment1/helloWorld
2.@RequestMapping注解
该注解用来标记类或者方法,指示Spring用该类或者方法处理请求动作。
Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容可以分为四类(常用的类型)。
第一类:处理request body部分的注解有:@RequestParam和@RequestBody
第二类:处理requet uri部分的注解有:@PathVaribale
第三类:处理request header部分的注解有:@RequestHeader和@CookieValue
第四类:处理attribute类型的注解有:@SessionAttributes和@MoelAttribute
如果使用该注解注释类,该类所有的方法,都被映射为相对于类级别的请求,表示该控制器处理的所有请求,都被映射为value属性指定的路径下。
1 @Controller
2 @RequestMapping(value = "/user")
3 public class UserController {
4
5 @RequestMapping(value = "register")
6 public String register(){
7 return "register";
8 }
9
10 @RequestMapping(value = "login")
11 public String login(){
12 return "login";
13 }
14 }
15
因为在该类上使用了@RequestMapping(value = "/user")注解,请求都要加上/user路径如:
http://localhost:8080/user/login
http://localhost:8080/user/register
@RequestMapping注解支持的常用属性:
属性 | 类型 | 说明 |
---|---|---|
value | String[] | 用于将指定请求映射到方法上 |
method | RequestMethod[] | 映射指定请求的方法类型,包括GET、POST、PUT...... |
consumes | String[] | 指定处理请求的提交内容类型(Content-Type:application/json、text/html等) |
produces | String[] | 指定返回的内容类型,必须是request请求头(Accept)中包含的类型 |
params | String[] | 指定request中必须包含某些参数,才让该方法处理请求 |
header | String[] | 指定request中必须包指定的header值,才让该方法处理请求 |
- value属性
value是@RequestMapping注解的默认属性,如果该注解使用时只有此一个属性,则可以省略属性名,若有多个属性,则必须写上value属性名。
@RequestMapping(value = "/hello")
@RequestMapping("/hello")
value属性是String[]类型,所以可以设置多个值:
@RequestMapping(value = {"/hello","/hello1"})
- method属性
该属性用来指示该方法仅仅处理哪些HTTP请求方式。如下代码:
@RequestMapping(value="/hello",method=RequestMethod.POST)
以上代码method=RequestMethod.POST表示该方法只支持POST请求,也可以同时支持多个HTTP请求。如下:
@RequestMapping(value="/hello",method={RequestMethod.POST,method=RequestMethod.GET})
若没有指定method属性值,则请求处理方法可以处理任意的请求HTTP方式。
- consumes属性
该属性指定处理请求的提交内容类型(Content-Type)。如下伪代码:
@RequestMapping(value="/hello",method=RequestMethod.POST,consumes="application/json")
表示方法仅处理request Content-Type为"application/json"类型的请求。
- produces属性
该属性指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。如下伪代码:
@RequestMapping(value="/hello",method=RequestMethod.POST,produces="application/json")
方法仅处理request请求中Accept头中包含了"application/json"的请求,同时说明了返回的内容类型为application/json。
- 5、params属性
该属性指定request中必须包含某些参数值时,才让该方法处理。如下伪代码:
@RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam=myValue")
方法仅处理其中名为“myPara”,值为“myValue”的请求。
- headers属性
该属性指定request中必须包含某些特性的header值,才能让该方法处理请求。如下代码:
@RequestMapping(value="/hello",method=RequestMethod.POST,headers="Referer=http://www.qianchunhua.com/")
方法仅处理request的header中包含了指定的“Referer”请求头和对应值为“http://www.qianchunhua.com”的请求。
3.@RequestParam注解
该注解用来将指定的请求参数赋值给方法中的形参。
@RequestParam注解支持的常用属性:
属性 | 类型 | 说明 |
---|---|---|
name | String | 指定请求头绑定的名称 |
value | String | name属性的别名 |
required | boolean | 参数是否必须绑定 |
defaultValue | String | 没有传递参数时,参数的默认值 |
请求处理方法参数的可选类型位Java的8种基本数据类型、String类和集合类。如下示例伪代码:
@RequestMapping(value="/hello")
public ModelAndView hello(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password) {
return...;
}
假设请求如下:http://localhost:8088/springmvc-comment1/login?loginname=qianch&password=123456
以上代码会将请求中的loginname参数的值“qianch”赋给loginname变量,password参数的值“123456”赋给password变量。
4.@PathVaribale注解
该注解类型可以非常方便的获得请求url中的动态参数。@PathVaribale注解只支持一个属性value,类型String,表示绑定的名称,如果省略则默认绑定同名参数。如下示例伪代码:
@RequestMapping(value="/pathVariableTest/{userId})
public void pathVariableTest(@PathVaribale ("userId")Integer userId)
假如请求的url地址为:http://localhost:8088/springmvc-comment1/pathVariableTest/1 ,则自动将url中模板变量{userId}绑定到通过@PathVaribale注解的同名参数上,即userId变量将被赋值为1。
5.@RequestHeader注解
该注解类型用于将请求的头的信息区域数据映射到功能处理方法的参数上。
@RequestHeader注解支持的常用属性:
属性 | 类型 | 说明 |
---|---|---|
name | String | 指定请求头绑定的名称 |
value | String | name属性的别名 |
required | boolean | 参数是否必须绑定 |
defaultValue | String | 没有传递参数时,参数的默认值 |
示例代码:
@RequestMapping(value="/requestHeaderTest")
public void requestHeaderTest(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts) {
}
以上配置自动将请求头“User-Agent”的值赋到userAgent变量上,并将“Accept”请求头的值赋到accept参数上。
6.@CookieValue注解
该注解用于将请求的Cookie数据映射到功能处理方法的参数。
@CookieValue注解支持的常用属性:
属性 | 类型 | 说明 |
---|---|---|
name | String | 指定请求头绑定的名称 |
value | String | name属性的别名 |
required | boolean | 参数是否必须绑定 |
defaultValue | String | 没有传递参数时,参数的默认值 |
示例:
@RequestMapping(value="/cookieValueTest")
public void cookieValueTest(
@CookieValue(value="JSESSIONID",defaultValue="") String sessionId) {
}
以上配置会自动将JSESSIONID值设置到sessionId参数上,defaultValu表示Cookie中没有JSESSIONID时默认为空。