springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解)
1. @Controller
@Controller
注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller
注解定义的控制器有如下特点:
- 不需要继承任何类, 也不需要实现任何接口
- 可以处理多个请求
- 可以使用Servlet的相关特性
spring自动扫描所有基于注解的类, 并将其注册为spring的bean, DispatcherServlet
自动扫描注解为@Controller
的类, 查找其中使用了@RequestMapping
的方法, 这些方法是真正处理请求方法.
<!-- 扫描包路径com.lizj.controller下的所有类, 将带有注解的类注册到spring容器中 -->
<context:component-scan base-package="com.lizj.controller" />
<!-- 视图解释器 -->
<!-- 配置的视图解析器为InternalResourceViewResolver, 并为其添加了前缀prefix和后缀suffix属性 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
此示例中没有配置处理映射器和处理器适配器, spring将使用默认的处理映射器和处理器适配器来处理请求.
下面是使用@Controller
注解定义的控制器
/**
* 基于注解的控制器
*/
@Controller
public class HelloController {
}
2. @RequestMapping
2.1 @RequestMapping注解
@RequestMapping
注解用来表示请求具体由哪个类的哪个方法来处理. 即
@RequestMapping
既可以用来注解一个类, 也可以用来注解一个方法. 当用来注解一个类的时候, 所有方法都将映射为相对于类级的请求.
/**
* 基于注解的控制器
*/
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(HttpServletRequest request) {
model.addAttribute("message", "Hello World");
return "helloworld";
}
}
@RequestMapping
注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 映射地址别名, 一般不设置 |
value | String[] | 否 | 指定请求的地址映射到方法上 |
method | RequestMethod[] | 否 | 请求的方法类型, 包括GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE,TRACE |
consumes | String[] | 否 | 指定处理请求的提交内容类型(Content-Type),例如application/json |
produces | String[] | 否 | 指定返回的内容类型, 返回的内容类型必须是request请求头(Accept)中包含的类型 |
params | String[] | 否 | 指定request中必须包含某些参数值时, 此方法才处理此请求 |
header | String[] | 否 | 指定request中必须包含某些指定的header值, 此方法才处理此请求 |
path | String[] | 否 | In a Servlet environment... 就是value属性的别名, value属性没有含义不确切, path含义更明确 |
常用的@RequestMapping
属性:
- value
value属性用于将请求映射到方法上. value属性是@RequestMapping
的默认属性, 当只有唯一的属性时, 则可以省略属性名, 如下两个注解含义是一样的:
@RequestMapping("/user")
@RequestMapping(value="/user")
多个请求地址映射到同一个方法
@RequestMapping(value={"/user", "/customer"})
- method
method属性指定此方法只处理哪些HTTP请求. 例如:
// 此方法只处理POST请求.
@RequestMapping(value="/user", method=RequestMethod.POST)
// 此方法既支持POST请求, 又支持GET请求
@RequestMapping(value="/user", method={RequestMethod.POST,RequestMethod.GET})
如果没有配置method属性, 则此方法可以处理任意的HTTP请求.
两个示例:
示例类: com.lizj.controller_01.HelloController01
访问地址: http://127.0.0.1:8080/springmvc03/hello示例类: com.lizj.controller_01.HelloController02
访问地址: http://127.0.0.1:8080/springmvc03/hello/hello
2.2 支持的方法参数类型
每个请求处理方法都可以有多个参数, 参数类型可以为以下类型, 可根据需要添加方法声明参数.
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.NativeWebRequeset
java.util.Locale
java.io.InputStream
或java.io.Reader
用于访问请求正文, 这两个对象与通过Servlet API
拿到的InputSteam和Reader对象是一样的java.io.OutputSteam
或java.io.Writer
用于生成响应正文, 这两个对象与通过Servlet API
拿到的OutputSteam和Writer对象是一样的java.security.Principal
包装了当前被谁的用户信息org.springframework.http.HttpEntity<T>
其提供了对HTTP请求头和请求内容的存取org.springframework.web.servlet.mvc.support.RedirectAttributes
用以指定重定向下要使用到的属性集以及添加flash属性(暂存在服务端的属性,它们会在下次重定向请求的范围中有效)org.springframework.validation.Errors
或org.springframework.validation.BindingResult
验证结果对象,用于存储前面的命令或表单对象的验证结果(紧接其前的第一个方法参数)org.springframework.web.bind.support.SessionStatus
用以标记当前的表单处理已结束org.springframework.web.util.UriComponentsBuilder
构造器对象, 用于构造当前请求URL相关的信息, 比如主机名、端口号、资源类型(scheme)、上下文路径、servlet映射中的相对部分(literal part)等@PathVariable
@MatrixVariable
java.util.Map
或org.springframework.io.Model
或org.springframework.ui.ModelMap
用以增强默认暴露给视图层的模型(model)的功能- 带有
@RequestParam
注解的参数, 其存放了Servlet请求中所指定的参数. 参数的值会被转换成方法参数所声明的类型 - 带有
@RequestHeader
注解的参数, 其存放了Servlet请求中所指定的HTTP请求头的值. 参数的值会被转换成方法参数所声明的类型 - 带有
@RequestBody
注解的参数, 提供了对HTTP请求体的存取. 参数的值通过HttpMessageConverter
被转换成方法参数所声明的类型 - 带有
@RequestPart
注解的参数, 提供了对一个"multipart/form-data请求块(request part)内容的存取 - 命令或表单对象, 它们用于将请求参数直接绑定到bean字段(可能是通过setter方法)
在参数列表中,
Errors
或BindingResult
参数必须紧跟在其所绑定的验证对象后面. 这是因为, 在参数列表中允许有多于一个的模型对象, spring会为它们创建不同的BindingResult实例
所有方法参数中, 最重要的是org.springframework.ui.Model
, 它是一个接口, 功能类似于java.util.Map
, 用于存储模型数据. springmvc调用处理方法前, 会创建一个隐含的模型对象, 作为模型数据的存储容器. 如果处理方法的方法参数为Model
, 那么springmvc会将模型的引用传递给此参数. 那么在方法内部就可以访问模型中的数据, 也可以向模型中添加新的属性数据.
/*
* springmvc中controller中的方法参数, 支持大多数常用的数据类型,
* 如: String, int....
*/
// 需要注意的是, 此处请求参数名必须与方法参数名一致, 否则获取不到参数值, 后面@RequestParam再做详细解释
@RequestMapping("/get")
public String getUser(String id, Model model) {
User user = null;
for(int i=0; i<userList.size(); i++) {
User u = userList.get(i);
if(u.getId().equals(id)) {
user = u;
break ;
}
}
if(user == null) {
user = new User();
user.setId("001");
user.setName("张三");
user.setAge(18);
user.setSex("男");
}
// 向model中添加数据
model.addAttribute("user", user);
// 返回视图名称
return "user/oneuser";
}
两个示例:
示例类: com.lizj.controller_02.UserController01
访问地址: http://127.0.0.1:8080/springmvc003/user01/get示例类: com.lizj.controller_02.UserController02
访问地址: http://127.0.0.1:8080/springmvc003/user02/get?userId=2
2.3 支持的方法返回类型
请求处理方法的返回类型如下:
org.springframework.web.servlet.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
如果控制器处理方法的返回值是ModelAndView
类型, 其既包括模型数据, 又包括视图信息, 那么springmvc就可以使用包含的视图对模型数据进行渲染, 而且可以非常方便的访问模型数据. ModelAndview
对象常用的添加模型数据和设置视图的方法如下:
// 添加模型数据
addObject(String attributeName, Object attributeValue);
// 设置视图
setViewName(String viewName);
示例类: com.lizj.controller_02.UserController03
访问地址: http://127.0.0.1:8080/springmvc003/user03/get?userId=3
3. @RequestParam
@RequestParam
注解用于将指定的请求参数赋值给方法的参数.
@RequestParam
注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定请求参数绑定的名称 |
value | String | 否 | name属性的别名 |
required | boolean | 否 | 指示参数是否必须绑定 |
default | String | 否 | 没有参数时使用的默认值 |
请求处理的方法的参数的类型为Java基本类型和String.
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(@RequestParam("name") String name,
@RequestParam("author") String author) {
}
当方法参数没有用
@RequestParam
修饰时, 那么会默认绑定同名的参数.
示例类: com.lizj.controller_03.BookController
访问地址: http://127.0.0.1:8080/springmvc003/book/books
4. @PathVariable
@PathVariable
注解可以方便的从URL中获取请求的参数.
它只支持一个类型为String
的属性, 表示绑定的请求参数的名称, 省略则默认绑定同名的参数.
@RequestMapping(value="/book/{bookId}")
public ModelAndView get(@PathVariable int bookId)
示例类: com.lizj.controller_04.BookController04
访问地址: http://127.0.0.1:8080/springmvc003/book04/books
5. @RequestHeader
@RequestHeader
注解用于将请求的头信息区数据映射到请求处理方法的参数上.
@RequestHeader
注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定请求头绑定的名称 |
value | String | 否 | name属性的别名 |
required | boolean | 否 | 指示参数是否必须绑定 |
default | String | 否 | 没有参数时使用的默认值 |
public void testRequestHeader(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader("Accept") String[] accepts) {
// ...
}
示例类: com.lizj.controller_05.HeaderAndCookieController
访问地址: http://localhost:8080/springmvc003/hac/show
关于http请求的header头信息
参考: http://www.cnblogs.com/printN/p/6534529.html
6. @CookieValue
@CookieValue
注解将Cookie数据映射到请求处理方法的参数上.
@CookieValue
注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
name | String | 否 | 指定请求头绑定的名称 |
value | String | 否 | name属性的别名 |
required | boolean | 否 | 指示参数是否必须绑定 |
default | String | 否 | 没有参数时使用的默认值 |
示例类: com.lizj.controller_05.HeaderAndCookieController
访问地址: http://localhost:8080/springmvc003/hac/show
7. @SessionAttributes
@SessionAttributes
注解指定Model
中哪些数据需要转存到session
中.
@SessionAttributes
注解支持的属性
属性 | 类型 | 是否必要 | 说明 |
---|---|---|---|
names | String[] | 否 | Model中属性的名称, 储存在session中也会用此名称 |
values | String[] | 否 | names属性的别名 |
types | Class<?>[] | 否 | 根据指定参数的类型, 将模型中对应类型的参数存储到session中 |
@SessionAttributes
注解只能声明在类上, 不能声明在方法上.
示例类: com.lizj.controller_06.LoginController
访问地址: http://localhost:8080/springmvc003/login
8. @ModelAttribute
@ModelAttribute
注解用于将请求参数绑定到Model对象上.
@ModelAttribute
只支持一个类型为String
的属性value
, 表示绑定的属性名称.
需要注意的是, @ModelAttribute
注解修饰的方法会在Controller
的每个请求处理方法执行前被执行, 如果一个Controller
映射了多个URL要注意这一问题.
示例类: com.lizj.controller_06.PageController
访问地址: http://127.0.0.1:8080/springmvc003/mac/testPage
可结合示例, 阅读下面几种情况的介绍.
@ModelAttribute
注解修饰的方法有返回值
示例:
@ModelAttribute("paramName")
public String getParam(@RequestParam("param") String param) {
return param;
}
此方法将先于其他请求处理方法执行, 并且将请求参数param
的值, 以paramName
为名称, 指定为model
的一个属性, 此时model
并没有显示的定义出来.
示例:
@ModelAttribute
// 这次没有使用@ModelAttribute注解的value属性
public User getUserById(String userId) {
return userService.getUserById(userId);
}
示例中没有显示的使用
@RuquestParam
注解, 而是使用了默认绑定同名参数.
本示例中, 方法的返回值类型为User
, 且没有使用@ModelAttribute
注解的value
属性. 此时, value
的默认名称为方法返回值类型(首字母小写), 即模型中的属性名为方法返回值类型(首字母小写). 也可以显示的定义value
属性.
@ModelAttribute
注解修饰的方法有返回值, 返回值类型为void
示例:
@ModelAttribute
public void getUserById(String userId, Model model) {
model.addAttribute("user", userService.getUserById(userId));
}
这种写法的前提是在请求处理方法中加入了一个Model
参数.
@ModelAttribute
和@RequestMapping
修饰同一个方法
示例:
@RequestMapping("/show")
@ModelAttribute("username")
public String show(String userId) {
User user = userService.getUserById(userId);
return user.getName();
}
示例中, @ModelAttribute
和@RequestMapping
共同修饰了show
方法. 此时方法的返回值不再是视图名称, 而是Model
的属性值, Model
属性的名称由@ModelAttribute
的value
设置, 即username
;
而@RequestMapping
的value
值/show
除了是请求映射之外, 还将作为视图名称, 即此请求处理方法将跳转至名称为show
的页面.
@ModelAttribute
修饰一个请求处理方法的参数
示例:
@ModelAttribute
public User getUserById(String userId) {
return userService.getUserById(userId);
}
@RequestMapping("/show")
public String show(@ModelAttribute User user) {
return "mac/test05";
}
示例中, @ModelAttribute
修饰的getUserById()
方法仍旧在Model
中添加user
属性, 其值为一个User
对象.
而在show
方法中, 参数也被@ModelAttribute
修饰, 表示参数user
的值就是Model
中的属性值.
9. @RequestBody 和 @ResponseBody
9.1 @RequestBody
springmvc提供了处理JSON格式请求和响应的功能, 可以方便的使服务端的请求处理方法和客户端JSON格式消息进行交互, 这时就用到了@RequestBody
注解.
@RequestBody
注解用于读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.
前台页面使用GET或POST请求提交数据时, 数据编码格式会由请求头的
ContentType
来指定, 可分为以下几种情况:
- application/x-www-form-urlencoded, 此时可以使用
@RequestParam
,@ModelAttribute
来处理参数, 也可以使用@RequestBody
.- multipart/form-data, 此时不能使用
@RequestBody
处理.- application/json或application/xml, 只能使用
@RequestBody
处理.
9.2 @ResponseBody
@ResponseBody
注解用于将Controller
的请求处理方法返回的数据对象, 转换为指定格式后, 写入到response对象的的body数据区. 一般地, 返回的数据不是某个具体的视图页面, 而是某种格式的数据(json, xml等).
9.3 示例
示例类: springmvc004项目中, com.lizj.controller_08.BookController08
访问地址: http://127.0.0.1:8080/springmvc004/book08/books
简单说明:
9.3.1 springmvc-servlet.xml
springmvc-servlet.xml配置文件中, 添加加了两项配置:
<!-- 自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter -->
<mvc:annotation-driven />
<!-- DispatcherServlet会拦截所有请求, 会将静态文件(如js文件)的请求看成路径, 就会找不到对应的静态文件 -->
<!-- 此配置将使用默认的servlet响应静态文件, 避免出现上述情况 -->
<mvc:default-servlet-handler/>
springmvc4.x默认使用的HandlerMapping和HandlerAdapter为:
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
详情见:
spring-webmvc-4.2.3.RELEASE.jar
org.springframework.web.servlet包下的DispatcherServlet.properties文件.
9.3.2 pom.xml
引用Jackson
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.2</version>
</dependency>
Jackson用来实现json对象与Java对象之间的转换.
示例下载:
https://files.cnblogs.com/files/lzj0616/springmvc常用注解示例.rar
springmvc学习笔记(常用注解)的更多相关文章
- springMVC学习笔记(二)-----注解和非注解入门小程序
最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...
- 【springmvc学习】常用注解总结
@Controller 在springmvc中,我们用它来告诉前端控制器,他这个类是controller,也就是springmvc的一个对象了,我们在spring.xml配置文件中用<conte ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
- springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定
springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定 标签: springmvc springmvc学习笔记12-springmvc注解开发之包装类型參数绑定 需求 实现方 ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
随机推荐
- 遇到local variable 'e' referenced before assignment这样的问题应该如何解决
问题:程序报错:local variable 'e' referenced before assignment 解决:遇到这样的问题,说明你在声明变量e之前就已经对其进行了调用,定位到错误的地方,对变 ...
- 【Oracle】环境变量与监听文件
一.环境变量的及其含义: 数据库主目录 ORACLE_HOME=D:\app\Administrator\product\11.2.0\dbhome_1 监听文件所在目录 TNS_ADMIN=D:\a ...
- malloc/free 的使用要点
函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int *p = (int *)mall ...
- python的eval函数
eval函数介绍:将字符串str当成有效的表达式来求值并返回计算结果.语法: eval(source[, globals[, locals]]) -> value参数: source:一个Pyt ...
- spring框架整合hibernate框架简单操作数据库
1.配置文件: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...
- ASP.NET Core 2.0使用Cookie认证实现SSO单点登录
之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sample,这个Demo是基于.NET Framework,.NE ...
- Spring框架——事务处理(编程式和声明式)
一. 事务概述 ●在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术. ●事务就是一组由于逻辑上紧密关联而合 ...
- 深入浅出数据结构C语言版(14)——散列表
我们知道,由于二叉树的特性(完美情况下每次比较可以排除一半数据),对其进行查找算是比较快的了,时间复杂度为O(logN).但是,是否存在支持时间复杂度为常数级别的查找的数据结构呢?答案是存在,那就是散 ...
- 介绍下Python的两个标准库 os 和 sys
import sysprint(sys.path) #python 2 中报错 ....,打印的是绝对路径(***\\python\\lib\\site-packages# 第三方库,后退一级为标准库 ...
- ThreadLoacl的反思
在我的随笔 spring mvc:注解@ModelAttribue妙用 中使用ThreadLocal来简化spring mvc控制层controller中的ModelMap,Response.Jso ...