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

4689931-eddb18b5ec59fbc8.png

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注解支持的属性

4689931-ae0df9a8ba03a242.png
  • 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值