Spring 2.5 引入了注解

基于注解的控制器的优势

1. 一个控制器类可以处理多个动作,而一个实现了 Controller 接口的控制器只能处理一个动作

2. 基于注解的控制器的请求映射不需要存储在配置文件中,使用 RequestMapping 注解类型,可以对一个方法进行请求处理。

@Controller 注解类型

org.springframework.stereotype.Controller 注解类型用于指示 Spring 类的实例是一个控制器类

package com.example.controller;

import org.springframework.stereotype;
... @Controller
public class CustomerController {
// request-handling methods here
}

Spring 使用扫描机制来找到应用程序中所有基于注解的控制器,但需要做两项配置

1. 在 Spring MVC 的配置文件中声明 spring-context

2. 使用 <component-scan /> 元素指定控制器类的基本包,确保所有的控制器类都在基本包下,并且不要指定一个过于广泛的基本包,防止 Spring 扫描无关的包

<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!-- ... -->
<context:component-scan base-package="com.example.controller" />
<!-- ... -->
</beans>

@RequestMapping 注解类型

org.springframework.web.bind.annotation.RequestMapping 注解类型的作用是映射一个请求和一种方法,可以使用 RequestMapping 注解一种方法或类。

一个采用 @RequestMapping 注解的方法将成为一个请求处理方法,并由调度程序在接收到对应的 URL 请求时调用。

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
... @Controller
public class CustomerController { //@RequestMapping("/customer_input")
@RequestMapping(value = "/customer_input") // value 属性将 URI 映射到方法, value是默认属性,如果只有 value 属性的话,可以省略属性名称
public String inputCustomer() {
// do something here
return "CustomerForm"
}
}

@RequestMapping 的属性有,多个属性用逗号分割

value     // java.lang.String[] 将 URI 映射到方法,默认属性,只有 value 属性时 可省略属性名
method // RequestMethod[] 指示该方法仅处理那些 HTTP 方法;如果没有指定 method 属性,则请求处理方法可以处理任意 HTTP 方法。
consumes // java.lang.String[]
headers // java.lang.String[]
name // java.lang.String
params // java.lang.String[]
path // java.lang.String[]
produces // java.lang.String[]

@RequestMapping 注解类型也可以用来注解一个控制器类,此时所有方法都将映射为相对于类级别的请求。

例如 控制器类的@RequestMapping 注解的映射使用“/customer”;而方法的 @RequestMapping 注解的映射使用 “/delete”

则映射到该方法上的 URI 为 “http://domain/context/customer/delete”

@Autowired 注解类型

该注解类型属于 org.springframework.beans.factory.annotation 包

作用是将依赖注入到 Spring MVC 控制器

@Service 注解类型

该注解类型属于 org.springframework.stereotype 包

该注解类型指示类是一个服务,类必须要注明为 @Service 才能被作为依赖注入,此外还需要在 Spring MVC 配置文件中添加一个 <component-scan /> 元素来扫描依赖基本包。

<context:component-scan base-package="dependencyPackage" />

@RequestParam 注解类型

该注解类型属于 org.springFramework.web.bind.annotation 包

作用是获取请求参数,@RequestParam 注解的参数类型不一定是字符串

请求参数可以用于发送值给服务器,是 URL 的一部分,请求参数采用 key = value 形式,并用 & 分割。

例如,下面的 URL 带有一个名为 productId 的请求参数,其值为 3;分别用传统方式和 @RequestParam 方式获取请求参数值

http://localhost:8080/app18b/product_retrieve?productId=3
String productId = httpServeltRequest.getParameter("productId"); // 传统方式
public void sendProduct(@RequestParam int productId) // 使用 @RequestParam 注解方式

路径变量, 该变量必须放在花括弧之间  @PathVariable 注解类型

该注解类型属于 org.springFramework.web.bind.annotation 包

路径变量用于发送值到服务器,是 URL 的一部分,路径变量类似于请求参数,但没有 key 部分,只是一个值。类型可以不是字符串。

为了使用路径变量,首先需要在 RequestMapping 注解的值属性中添加一个变量,该变量必须放在花括弧中。

下面的 RequestMapping 注解定义了一个名为 id 的路径变量,然后在方法签名中添加一个同名变量,并加上 @PathVariable 注解。

当该方法被调用是,请求 URL 的 id 值将被复制到路径变量中,并可以在方法中使用。

@RequestMapping(value="/product_view/{id}")
public String viewProduct(@PathVariable Long id, Model model){
Product product = ProductService.get(id);
model.addAttribute("product", product);
return "productView";
}

也可以在请求映射中使用多个路径变量。例如,下面定义了 userId 和 orderId 两个路径变量

@RequestMapping(value = "/product_view/{userId}/{orderId}")

@ModelAttribute 注解类型

该注解类型属于 org.springframework.web.bind.annotation 包。可以用 @ModelAttribute 来注解方法参数或方法。

第一个作用 修饰参数

带 @ModelAttribute 注解的参数会将相应的参数对象添加到 Model 对象中(若方法中没有显示地添加)

// Spring MVC 将在每次调用 submitOrder 方法时创建一个 Order 实例;此方法中,输入或创建的 Order 实例将用 newOrder 键值添加到 Model 对象中。
@RequestMapping(method = RequestMethod.POST)
public String submitOrder(@ModelAttribute("newOrder") Order order, Model model) {
....
}
// 如果未定义键值名,则将使用该对象类型的名称,此方法中,会使用键值 order 将 Order 实例添加到 Model 对象中
@RequestMapping(method = RequestMethod.POST)
public String submitOrder(@ModelAttribute Order order, Model model) {
...
}

第二个作用 修饰非请求处理方法

@ModelAttribute 可以标注一个非请求的处理方法。被 @ModelAttribute 注解的方法会在每次调用该控制器类的请求处理方法时被调用。

这Spring MVC 会在调用请求处理方法之前调用带 @ModelAttribute 注解的方法。意味着,如果一个控制器类有两个请求处理方法,以及一个有 @ModelAttribute 注解的方法,该方法的调用就会比每个处理请求方法更频繁。

带 @ModelAttribute 注解的方法可以返回一个对象或一个 void 类型,如果返回一个对象,则返回的对象会自动添加到 Model 中。如果方法返回 void 则还必须添加一个Model类型的参数,并自行将实例添加到 Model 中。

@ModelAttribute
public Product addProduct(@RequestParam String productId){
...
return productService.get(productId);
} @ModelAttribute
public void populateModel(@RequestParam String id, Model model){
...
model.addAttribute(new Account(id));
}

Spring MVC 注解类型的更多相关文章

  1. Spring MVC注解的一些案列

    1.  spring MVC-annotation(注解)的配置文件ApplicationContext.xml <?xml version="1.0" encoding=& ...

  2. spring mvc 注解@Controller @RequestMapping @Resource的详细例子

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...

  3. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  4. spring mvc 注解入门示例

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  5. spring mvc 注解示例

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  6. spring mvc 形参类型

    spring mvc 形参类型 1 没有占位符号的,形参的名字为参数的名称 请求路径为:organtrans/t1/t5?a=1(a为形参的的名称必须一致) @RequestMapping(" ...

  7. 关于Spring mvc注解中的定时任务的配置

    关于spring mvc注解定时任务配置 简单的记载:避免自己忘记,不是很确定我理解的是否正确.有错误地方望请大家指出. 1,定时方法执行配置: (1)在applicationContext.xml中 ...

  8. Spring MVC 注解[转]

    [学习笔记]基于注解的spring3.0.x MVC学习笔记(九) 摘要: 本章节,仅为@SessionAttributes的功能扩展介绍介绍,结合@requestparam注解进行简易无数据库分页. ...

  9. Spring MVC 注解之controller层

    第一层注解:@Controller 和 @RestController. 这两个注解的作用是:处理页面的HTTP请求,不同点 @RestController相当于@Controller +@Respo ...

随机推荐

  1. 静态html返回

    在这篇文章中我们介绍后台路由的概念,后台的路由根据路径返回相应的内容, 首先我们建立一个服务器 let port = 3000 //监听端口let fs = require ('fs')//用来生成可 ...

  2. linux编译安装php apache mysql (已试过)

    阅读目录 (全部使用源码安装方式,先安装mysql,然后是apache,再是php,这样好像能防止挺多问题的,期间出现问题基本是依赖没有或者版本不对) 1.简介 2.安装apache 2.1.yum方 ...

  3. 关于python中的is和==的区别

    Python 中的比较:is 与 ==   在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个 ...

  4. 2.6、CDH 搭建Hadoop在安装(安装CDH和其他软件)

    第6步:安装CDH和其他软件 设置Cloudera Manager数据库后,启动Cloudera Manager Server,然后登录Cloudera Manager Admin Console: ...

  5. iftop网络流量查看工具

    1.下载iftop源码包 mkdir /usr/local/src/iftop cd /usr/local/src/iftop wget http://www.ex-parrot.com/~pdw/i ...

  6. 【pycharm】使用过程的相关问题

    背景:安装scrapy后在cmd里可以正常import scrapy模块,但是在pycharm里不可以(python2.7) 问题:cmd中能正常导入模块,在pycharm报错 原因:pycharm里 ...

  7. char、varchar、nchar、nvarchar的区别(转)

    转自:http://tech.diannaodian.com/dw/data/sql/2011/1005/135556.html 对于程序中的string型字段,SQLServer中有char.var ...

  8. openstack(Pike 版)集群部署(六)--- Horizon 部署

    一.介绍 参照官网部署:https://docs.openstack.org/horizon/pike/install/    继续上一博客进行部署:http://www.cnblogs.com/we ...

  9. Mysql 5.7 弱密码限制,及创建用户无密码用户

    一.介绍 1.haproxy Mysql 需要一个无密码登录的mysql用户. 2.Mysql 5.7 版本默认安装了 validate_password 插件,作用:要求密码的复杂度. 3.创建用户 ...

  10. TOJ 2130: Permutation Recovery(思维+vector的使用)

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2130 时间限制(普通/Java): ...