Spring4 MVC的常用注解

@Controller

org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制 器,使用@Controller注解的类不需要继承特定的父类或者实现特定的接口,相对之前的版本 实现Controller接口变得更加简单。而且Controller接口的实现类只能处理一个单一请求动作, 而@Controller注解的控制器可以支持同时处理多个请求动作,更加灵活。

@Controller用于标记一个类,使用它标记的类就是一个SpringMVC Controller对象,即 一个控制器类。Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会 扫描使用了该注解的类的方法,并检测该方法是否使用了@RequeStMapPing注解,而使用 @RequestMapping注解的方法才是真正处理请求的处理器。为了保证Spring能找到控制器, 需要完成两件事情:

  1. 在Spring MVC的配置文件的头文件中引入spring-context。
  2. 使用<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的不同内容部分可以分为四类

  1. 处理 request body 部分的注解:@RequestParam、@RequestBody。
  2. 处理 requeturi 部分的注解:@PathVariable
  3. 处理 request header 部分的注解:@RequestHeader、@CookieValue
  4. 处理 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servl...
    alexpdh阅读 2,638评论 0 3
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,733评论 6 342
  • 1、Spring MVC请求流程 (1)初始化:(对DispatcherServlet和ContextLoderL...
    拾壹北阅读 1,945评论 0 12
  • 生命中和你偶然的相逢 让我走出了寂寞的围城 没有热烈的海誓山盟 我们却相信爱能穿越时空 人海里我们紧紧的相拥 彼此...
    思y阅读 370评论 0 1