@Controller
org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制 器,使用@Controller注解的类不需要继承特定的父类或者实现特定的接口,相对之前的版本 实现Controller接口变得更加简单。而且Controller接口的实现类只能处理一个单一请求动作, 而@Controller注解的控制器可以支持同时处理多个请求动作,更加灵活。
@Controller用于标记一个类,使用它标记的类就是一个SpringMVC Controller对象,即 一个控制器类。Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会 扫描使用了该注解的类的方法,并检测该方法是否使用了@RequeStMapPing注解,而使用 @RequestMapping注解的方法才是真正处理请求的处理器。为了保证Spring能找到控制器, 需要完成两件事情:
- 在Spring MVC的配置文件的头文件中引入spring-context。
- 使用<context:component-scan/>元素,该元素的功能为:启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为 Spring 的 Bean。 base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。 配置文件如下所示:
<context:component-scan base-package="com.wayboo.controller"/>
应该将所有控制器类都放在基本包下,并且指定扫描该包,即wayboo.controller,而不应该指定扫描ocom.wayboo包,以免Spring MVC扫描了无关的包。
核心代码:
`
package com.wayboo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* HelloWorldController是一个基于注解的控制器, 可以同时处理多个请求动作,并且无须实现任何接口。
* org.springframework.stereotype.Controller注解用于指示该类是一个控制器
*/
@Controller
public class HelloWorldController {
@RequestMapping("/helloWorld")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}
`
HelloWorldController 是一个基于@Controller注解的控制器,@RequestMapping 注释用来 映射一个请求,value="/helloWorld"表示请求由helloWorld方法进行处理。helloWorld方法接收 一个org.springframework.ui.Model类型的参数,在model中添加了一个名为“message”的 字符串对象,该对象可以在返回的视图当中通过request对象获取。最后,方法返回一个字符 串“helloWorld”作为视图名称
SpringMVC配置代码:
`<?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:mvc="http:// www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件, 如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="com.wayboo.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>
`
由于使用了注解类型,因此不需要再在配置文件中使用XML描述Bean。<contextcomponent- scanbase-package=“com.wayboo.controller/>指定需要 Spring 扫描 com.wayboo.controller 包及其子包下面 的所有Java文件。最后配置了视图解析器IntemalResourceViewResolver来解析视图,将View 呈现给用户。视图解析器中配置的prefix属性表示视图的前缀,suffix表示视图的后缀,返回 的视图字符串是“helloWorld”,经过视图解析器之后,则视图的完整路径为:/WEB-INF/Content/helloWorld.jSp。需要注意的是,此处没有配置处理映射器和处理器适配器,当用户没 有配置这两项时,Spring会使用默认的处理映射器和处理器适配器处理请求。
返回视图文件
`<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试@Controller注解</title>
</head>
<body>
<!-- 页面可以访问Controller传递传递出来的message -->
${requestScope.message}
</body>
</html>`
web.xml配置
`
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 定义Spring MVC的前端控制器 -->
<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>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<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>
`
http://localhost:8090/ControllerTest/helloWorld
Spring MVC中用于参数绑定的注解有很多,都在 org.springframework.web.bind.armotation 包中,根据它们处理的request的不同内容部分可以分为四类
- 处理 request body 部分的注解:@RequestParam、@RequestBody。
- 处理 requeturi 部分的注解:@PathVariable
- 处理 request header 部分的注解:@RequestHeader、@CookieValue
- 处理 attribute 类型的注解:@SessionAttributes、@ModelAttribute
@RequestMapping注解
需要在控制器内部为每一个请求动作开发相应的处理方法。org.springfiramework. web.bind.annotation.RequestMapping注解类型指示Spring用哪一个类或方法来处理请求动作, 该注解可用于类或方法。
@RequestMapping 虽然也在 org.springframework.web.bind.annotation 下面,但是严格来说,它并不属于参数绑定注解。
@RequestMapping可以用来注释一个控制器类,在这种情况下,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下,示例代码如下:
`package org.fkit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/register")
public String register() {
return "register";
}
}
`
由于UserController类中加了value = "/user"的@RequestMapping注解,因此所有相关路径 都要加上”/user",此时方法被映射到如下请求URL:
http://localhost:8090/ControllerTest/user/register
@RequestMapping注解支持的属性
- value属性
@RequestMapping用来映射一个请求和一种方法。可以使用@RequestMapping注释一个方法或类。
一个采用@RequestMapping注释的方法将成为一个请求处理方法,例如:
@RequestMapping("/hello")
public ModelAndView hello(){
return ...;
}
使用@RequestMapping注释的value属性将URL映射到方法上,将hello映射到hello方法上,使用如下URL访问应用时将由hello方法进行处理
http://localhost:8090/ControllerTest/user/hello
由于value属性是@RequestMapping注释的默认属性,因此,如果只有唯一的属性,则可 以省略属性名,即如下两个标注含义相同。
@RequestMapping(valuer="/hello")
@RequestMapping(”/hello”)
但如果有超过一个属性,就必须写上value属性名称
value属性的值也可以是一个空字符串,此时该方法被映射到如下请求URL:http://localhost:8090/context
- method属性
该属性用来指示该方法仅仅处理哪些HTTP请求方式
@RequestMapping(value="/hello",method=RequestMethod.POST)以上代码method=RequestMethod.POST表示该方法只支持POST请求
也可以同时支持多个HTTP请求方式
@RequestMapping (value="/hello",
method={RequestMethod.POST,RequestMethod.GET})
如果没有指定method属性值,则请求处理方法可以处理任意的HTTP请求方式
- consumes属性
该属性指定处理请求的提交内容类型(Content-Type)
@RequestMapping(valuer="/hello",method=RequestMethod.POST, consumes= "application/json")
表示方法仅处理request Content-Type为“application/json”类型的请求
- produces属性
该属性指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。
@RequestMapping(value="/hello",method=RequestMethod.POSTr,produces= "application/json")
方法仅处理request请求中Accept头中包含了"application/json”的请求,同时指明了返回的内容类型为application/json.
- params属性
该属性指定request中必须包含某些参数值时,才让该方法处理
@RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam=myValue')
方法仅处理其中名为“myParam”、值为“myValue”的请求。
- headers 属性
该属性指定request中必须包含某些指定的header值,才能让该方法处理请求
@RequestMapping(value="/hello",method=RequestMethod.POST, headers="Referer=http://www.ithelei.com/")
方法仅处理request的header中包含了指定“Referer”请求头和对应值为“http://www.ithelei.com/” 的请求。
请求处理方法可出现的参数类型
每个请求处理方法可以有多个不同类型的参数
如果需要访问HttpServletRequest对象,则可以添加HttpServletRequest作为参数,Spring 会将对象正确地传递给方法
@RequestMapping("/login")
public String login(HttpServletRequest request){
return "login";
}
如果需要访问HttpSession对象,则可以添加HttpSession作为参数,Spring会将对象正确地传递给方法:
@RequestMapping("/login")
public String login( HttpSession session){
return "login";
}
下面是可以在请求处理方法中出现的参数类型:
javax.servlet.ServletRequest javax.servlet.http. HttpServletRequest
javax.servlet.ServletResponse ^ javax.servlet.http. HttpServletResponse
javax.servlet.http.HttpSession
org.springframework.web.context.request.WebRequest 或org.springframework.web.context.request.NativeWebRequest
java.util.Locale
java.io.InputStream 或 java.io.Reader
java.io.OutputStream 或 java.io.Writer
java.security.Principal
HttpEntity<?>
java.util.Map
org.springframework.ui.Model
org.springframework.ui.ModelMap
org.springframeworlc.web.servlet.mvc.support.RedirectAttributes
org.springframework.validation.Errors
org.springframework.validation.BindingResult
org.springframework.web.bind.support.SessionStatus
org. springframework. web .util .UriComponentsBuilder
@PathVariable、@@MatrixVariable 注解
@RequestParam、@RequestHeader、@Requesbody、@RequestPart 注解
其中最重要的是org.springframework.ui.Model这不是一个Servlet API类型,而是一 个Spring MVC类型,其中包含了 Map对象用来存储数据。如果方法中添加了 Model参数, 则每次调用请求处理方法时,Spring MVC都会创建Model对象,并将其作为参数传递给方法。
请求处理方法可返回的类型:
每个请求处理方法可以返回以下类型的返回结果:
org.springframework.web.portlet.ModelAndView
org.springframework.ui.Model
java.util.Map<k,v>
org.springframework.web.servlet.View
java.lang.String
HttpEntity 或 ResponseEntity
java.util.concurrent.Callable
org.springframework.web.context.request.async.DeferredResult
void
- 邮箱:ithelei@sina.cn
- 技术讨论群:687856230
- GoodLuck