Spring MVC的常用注解

Spring 从2.5版本之后,用户可以使用@Controller、@RequestMapping、@RequestParam、@ModelAttribute等类似这样的注释。

1.@Controller注解

使用@Controller注释的类不需要继承特定的父类或者实现特定的接口。

@Controller用于标记一个类,使用它标记的类就是一个Spring MVC Controller对象。Spring使用扫描机制查找应用程序中所有基于注解的控制器类。

分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用了@RequestMapping注解的方法才是真正处理请求的处理器

Spring处理步骤:

  • 1.在Spring MVC的配置文件的头文件中引入spring-context
  • 使用<context:compoent-scan/>元素,该元素的功能:启动扫描功能,以便注册带有@Controller、@Service、@Repository、@Compoent等注释的类成为Spring的Bean,base-package属性指定了需要扫描的类包。
@RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World ya.");
        return "HelloWorld";//这边的HelloWorld指的是JSP页面的名称
    }

helloWorld方法接受一个Model类型参数。在该方法中添加一个字符串对象。然后该对象在返回的视图中通过request对象获取。

${requestScope.message}

Spring MVC其他用于参数绑定的注解

  • 处理request body部分的注解

@RequestParam、@RequestBody

  • 处理request uri部分的注释

@PathVariable

  • 处理request header部分的注释

@RequestHeader 、@CookieValue

  • 处理attribute类型的注释

@SessionAttributes、@ModelAttribute

2.@RequestMapping注释

@RequestMapping注释类型指示了Spring用哪一个类或者方法来处理请求动作,该注释可用于类或者方法

@Controller
@RequestMapping(value = "/test")
public class TestController {

    @RequestMapping(value = "/hello")
    public String hello() {
        return "hello";
    }
}

当类上加上RequestMapping的时候,该类下面的所有方法的相关路径都要加上test。

2.1 RequestMapping注解支持的常用属性

  • 1.value属性

value属性的作用就是将URL映射到方法上。如果在@RequestMapping中,只有一个属性,那么value可以省略。

  • 2.method属性

该属性用来指示该方法仅仅处理哪些HTTP请求方式。如果没有指定,则可以处理任意的HTTP请求方式

  • 3.consumes属性

该属性用来指定处理请求的提交内容类型(Content-Type)

@RequestMapping(value = "/hi", consumes = "application/json")
public String hi() {
    return "hello";
}

表示方法处理request Content-Type为"application/json"类型的请求

  • 4.produces属性

该属性指定返回的内容,必须是request请求头(Accept)中所包含的类型。
比如,请求的是application/json,那么返回的内容格式也必须是application/json

  • 5.params属性

该属性指定request中必须包含某些参数值时,才让该方法处理。

@RequestMapping(value = "/hi", params = "myvalue=12")
public String hi() {
    return "hello";
}

当请求的url包含myvalue参数时,并且该参数值为12,才开始处理请求。

  • 6.header属性

该属性指定request中包含某些指定的header值,才让该方法处理请求

@RequestMapping(value = "/hi",headers = "referer=http://wwww.baidu.com")
public String hi() {
    return "hello";
}

当请求request的header包含refer请求头和对应值为http://www.baidu.com的时候才处理请求

2.2请求处理方法可出现的参数类型

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model(org.springframework.ui.Model)
  • ...

2.3请求处理方法可返回的类型

  • ModelAndView
  • Model(org.springframework.ui.Model)
  • ...

2.4 Model和ModelView

  • Model

Model接口存储模型数据,功能类似于java.util.Map接口

  • ModelMap

ModelMap类实现了Map接口

@RequestMapping(value = "/hi")
public String hi(Model model, ModelMap modelMap) {
    model.addAttribute("message", "Hello");
    modelMap.addAttribute("message", "World");

    String msg = "";

    msg = model.asMap().get("message").toString() + modelMap.get("message").toString();
    return "hello";
}

msg的结果为WorldWorld。因为Model的最终实现ExtendedModelMap,而ExtendedModelMap类是继承ModelMap。使用的都是同一个map对象

  • ModelAndView
@RequestMapping(value = "/login")
public String login() {
    return "login";
}

/**
 * @ModelAttribute修饰的方法先于其他方法前调用,该方法用于接收前台JSP页面传入的参数
 * @param name
 * @param password
 * @param mv
 */
@ModelAttribute
public void userModel(String name, String password, ModelAndView mv) {
    User user = new User();
    user.setName(name);
    user.setPassword(password);
    mv.addObject("user", user);
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login(ModelAndView mv) {
    User user=(User)mv.getModel().get("user");
    return null;
}

3.参数绑定注解

3.1@RequestParam注解

该注解类型用于将指定的请求参数赋值给方法中的形参。

@RequestMapping("/register")
public String register(@RequestParam("name") String name, @RequestParam("password") String password) {
    return null;
}

3.2 @PathVariable注解

该注解类型可以非常方便的获取请求URL中的动态参数。@PathVariable注解只支持一个属性value,类型为String,表示绑定的名称。如果省略,则默认绑定同名参数

@RequestMapping("/user/{userId}")
public String getUser(@PathVariable String userId){
    return null;
}

3.3 @RequestHeader注解

该注解用于将请求的头信息映射到方法的形参上。

@RequestMapping("/header")
public String getHeaderParams(@RequestHeader(value = "Accept")String[] accepts){
    return null;
}

3.4 @CookieValue注解

该注解用于将请求的Cookie数据映射到方法的形参上。

@RequestMapping("/cookie")
public void cookieTest(@CookieValue(value = "tcuser", defaultValue = "111") String sessionId) {
    return;
}

JSESSIONID

3.5 @SessionAttributes注解

该注解允许我们有选择地指定Model中哪些属性需要转存到HttpSession中。只能用在类上,不能声明在方法上。

@Controller
@RequestMapping(value = "/test")
@SessionAttributes("user")
public class TestController {
     @RequestMapping(value = "/login")
    public String login() {
        return "login";
    }
    
    /**
     * @param name
     * @param password
     * @param mv
     * @ModelAttribute修饰的方法先于其他方法前调用
     */
    @ModelAttribute
    public void userModel(String name, String password, Model mv) {
        User user = new User();
        user.setName(name);
        user.setPassword(password);
        mv.addAttribute("user", user);
    }
    
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(Model mv) {
        //User user = (User) mv.asMap().get("user");
        return "welcome";
    }
}
<%--
  Created by IntelliJ IDEA.
  User: stalkers
  Date: 2017/7/29
  Time: 下午9:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>welcome</title>
</head>
<body>
${requestScope.user.name}<br/>
${requestScope.user.password}
</body>
</html>

3.6 @ModelAttribute注解

该注释只支持一个属性value,类型为String。注意的是,使用该注释的方法会在Controller每个方法执行前被执行。因此在一个Controller映射到多个URL时,要谨慎使用。

@Controller
@RequestMapping("/attribute")
public class ModelAttributeController {
    @ModelAttribute(value = "name")
    public String user(String name){
        String n= "2";
        return n;
    }
    @RequestMapping("/login")
    public String login(){
        return "welcome";
    }
}
${requestScope.name}

这边定义ModelAttribute的value为name,那么前台获取的方式

4.信息转换

4.1 HttpMessageConvert<T>接口

该接口负责将请求信息转换为一个对象(类型为T),并将对象绑定到请求方法的参数中或输出为响应参数。

DispatcherServlet默认装配了RequestMappingHandlerAdapter。即HttpMessageConvert由RequestMappingHandlerAdapter使用。

在springmvc-config加入

<!--自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdpter-->
<mvc:annotation-driven/>

这个是Spring MVC为@Controller分发请求所必须的。并且提供了数据绑定支持、@NumberFormatannotation支出、@DateTimeFormat支持、@Valid支持、读写XML的支持和读写Json的支持。

<!--使用默认的Servlet来响应静态文件-->
<mvc:default-servlet-handler/>

因为web.xml使用了DispatcherServlet截获所有请求url,而引入的script。DispatcherServlet会将"/"看成请求路径。找不到它的时候,会报404错误。当配置文件加上时候,Servlet找不到会去找静态的内容,即是js目录。

4.2 使用自定义的HttpMessageConvert接收Json格式的数据。

Spring默认使用Jackson处理json数据。如果使用其他开源类包处理,下面配置阿里巴巴的fastjson

<!--自定义配置JSON格式的数据-->
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json;chartset=UTF-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容