springmvc(4)注解简单了解
对于我这样的新人来说,因为是刚开始做项目,所以以前的技术不是用的很多,就比如springmvc来说,实际上使用的都是注解形式的,对于那些全部都是配置的来说,虽然也了解一些,但是实际上还是没试用过的。
下面就理一下注解的各种用法:
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出
模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型; @CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,
因为有一些注解不是经常使用,所以上网将基本上所有的注解都搜了一下。
1.URL映射:@RequestMapping,在控制器和方法上面使用,表示的是将url路径映射到相应的处理方法中。:
@Controller
@RequestMapping("/f")
public class TestController2 { @RequestMapping("index")
public String index(){
return "index";
}
}
如果类上面有注解,那么方法的路径就是它的窄化,比如上面的就应该是‘/f/index’,如果路径是单独的index是不能访问这个方法的。还有一点就是只有在这个控制器放入容器中才能使用注解。
@RequestMapping的几个参数我们可以在源码中了解一下:
package org.springframework.web.bind.annotation; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.Callable; @Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { //为这个映射设置一个名字 目前还没使用过这个参数
String name() default "";
//1.表示的就是映射的值,如果只有这一个value参数有值的话,那么不用指明参数名,这个是注解的用法
//2.这是一个数组,所以可以指定多个路径的。比如:@RequestMapping(value={"/test1", "/user/create"})表示的是/test1或者/user/create路径都能够访问
String[] value() default {};
//我们不仅可以指定映射的路径,我们还可以指定特定的方法,如果路径满足,但是请求方法不满足的话,那么也不能进入到方法中来,
//和value一样,也是支持多个值的。:@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET})表示的是
//GET和POST请求都能映射到方法中。默认是支持GET和POST的。一般在填写表单的时候用的多
RequestMethod[] method() default {};
//表示的是有某些参数的时候,比如:@RequestMapping(params="create", method=RequestMethod.POST)表示的是请求为POST,具有参数create的时候,能够
//进入到这个方法。有一点特别的用法,源码是说: Expressions can be negated by using the "!=" operator,* as in "myParam!=myValue".可以指定当参数不等于
//某个值的时候,还有一种用法是当没有某一个参数的时候:
//!myParam" style expressions indicate that the* specified parameter is <i>not</i> supposed to be present in the request.
String[] params() default {};
//也是一样的意思,就是特定的请求头才能进入到方法内。就不举例了
String[] headers() default {};
//我们都知道 request和resonse是生产者消费者模式的,所以这个名字那么怪,这个参数的意思是媒体类型
//就是request头的提交类型
//consumes = "text/plain"*
//consumes = {"text/plain", "application/*"}
String[] consumes() default {}; //上面是消费者的媒体类型,这个是生产者的媒体类型,就是浏览器中的Accept中表示可以接受的类型:
//produces = "text/plain"
* produces = {"text/plain", "application/*"}
String[] produces() default {}; }
2.参数的注解:@RequestParam 表示的是从客户端发送到服务器的参数,可以通过注解绑定到参数中:
@RequestMapping("index")
public String index(@RequestParam(value="str",required=true,defaultValue="hotusm") String str){
return "index";
}
这几个参数就很好理解啦。不过有一点是:这三个参数都不是必须的,也许很奇怪,那客户端的数据怎么绑定到参数中去,其实这既是springmvc的强大,如果默认的情况会将
同名的数据绑定到同名的参数中。
3.绑定Url模板变量值:
@RequestMapping("/article/{aId}-{categoryId}")
public String showArticle(@PathVariable("aId") String aId,@PathVariable("categoryId") String categoryId){
System.out.println("show the article info");
return "articleDetils";
}
对于一些信息类的查看来说,这个注解还是很好用的。
4.操作Cookie:
@RequestMapping("cookInfo")
public String cookInfo(@CookieValue("JSESSIONID") String sessionId){
System.out.println("session:"+sessionId);
return "";
}
5.@RequestHeader绑定请求头数据,和requestParam一样,具有三个参数。
@RequestMapping(value="/header")
public String test(
@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value="Accept") String[] accepts)
6.ModelAttrbute:
@ModelAttribute一个具有如下三个作用:
①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。 一、绑定请求参数到命令对象
如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。 Java代码 收藏代码
public String test1(@ModelAttribute("user") UserModel user)
和6..1一节中的五、命令/表单对象功能一样。只是此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。 绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。
Java代码 收藏代码
@RequestMapping(value="/model2/{username}")
public String test2(@ModelAttribute("model") DataBinderTestModel model) {
DataBinderTestModel相关模型请从第三章拷贝过来,请求参数到命令对象的绑定规则详见【4.16.、数据绑定】一节,URI模板变量也能自动绑定到命令对象中,当你请求的URL中包含“bool=yes&schooInfo.specialty=computer&hobbyList[]=program&hobbyList[]=music&map[key1]=value1&map[key2]=value2&state=blocked”会自动绑定到命令对象上。 当URI模板变量和请求参数同名时,URI模板变量具有高优先权。 二、暴露表单引用对象为模型数据
Java代码 收藏代码
@ModelAttribute("cityList")
public List<String> cityList() {
return Arrays.asList("北京", "山东");
}
如上代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中,在功能处理方法中调用Model 入参的containsAttribute("cityList")将会返回true。
Java代码 收藏代码
@ModelAttribute("user") //①
public UserModel getUser(@RequestParam(value="username", defaultValue="") String username) {
//TODO 去数据库根据用户名查找用户对象
UserModel user = new UserModel();
user.setRealname("zhang");
return user;
}
如你要修改用户资料时一般需要根据用户的编号/用户名查找用户来进行编辑,此时可以通过如上代码查找要编辑的用户。
也可以进行一些默认值的处理。
Java代码 收藏代码
@RequestMapping(value="/model1") //②
public String test1(@ModelAttribute("user") UserModel user, Model model)
此处我们看到①和②有同名的命令对象,那Spring Web MVC内部如何处理的呢:
(、首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等;
(、执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,如果没有通过反射创建一个,因此②处的user将使用①处返回的命令对象。即②处的user等于①处的user。 三、暴露@RequestMapping方法返回值为模型数据
Java代码 收藏代码
public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)
大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,此时会暴露返回值到模型数据(名字为user2)中供视图展示使用。那哪个视图应该展示呢?此时Spring Web MVC会根据RequestToViewNameTranslator进行逻辑视图名的翻译,详见【4.15.、RequestToViewNameTranslator】一节。 此时又有问题了,@RequestMapping注解方法的入参user暴露到模型数据中的名字也是user2,其实我们能猜到:
(、@ModelAttribute注解的返回值会覆盖@RequestMapping注解方法中的@ModelAttribute注解的同名命令对象。 四、匿名绑定命令参数
Java代码 收藏代码
public String test4(@ModelAttribute UserModel user, Model model)
或
public String test5(UserModel user, Model model)
此时我们没有为命令对象提供暴露到模型数据中的名字,此时的名字是什么呢?Spring Web MVC自动将简单类名(首字母小写)作为名字暴露,如“cn.javass.chapter6.model.UserModel”暴露的名字为“userModel”。
Java代码 收藏代码
public @ModelAttribute List<String> test6()
或
public @ModelAttribute List<UserModel> test7()
对于集合类型(Collection接口的实现者们,包括数组),生成的模型对象属性名为“简单类名(首字母小写)”+“List”,如List<String>生成的模型对象属性名为“stringList”,List<UserModel>生成的模型对象属性名为“userModelList”。 其他情况一律都是使用简单类名(首字母小写)作为模型对象属性名,如Map<String, UserModel>类型的模型对象属性名为“map”
springmvc(4)注解简单了解的更多相关文章
- springMVC的注解详解
springmvc常用注解标签详解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业 ...
- 一 : springmvc常用注解
springmvc常用注解详解1.@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层 ...
- 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s
1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2 spring-mv ...
- 转:springmvc常用注解标签详解
Spring5:@Autowired注解.@Resource注解和@Service注解 - IT·达人 - 博客园--这篇顺序渐进,讲得超级好--此人博客很不错http://www.cnblogs.c ...
- 【Spring】SpringMVC非注解配置的两种方式
目录结构: contents structure [+] SpringMVC是什么 Spring MVC的设计原理 SpringMVC配置的第一种方式 1,复制Jar包 2,Web.xml文件 3,M ...
- springMVC基于注解的控制器
springMVC基于注解的控制器 springMVC基于注解的控制器的优点有两个: 1.控制器可以处理多个动作,这就允许将相关操作写在一个类中. 2.控制器的请求映射不需要存储在配置文件中.使用re ...
- SpringMVC常用注解實例詳解3:@ResponseBody
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- SpringMVC常用注解實例詳解2:@ModelAttribute
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- springmvc常用注解与类型转换
springmvc常用注解与类型转换 一:前置 spring -servlet.xml 注入 <!-- 启用spring mvc 注解 --> <context:annotation ...
随机推荐
- js里cookie操作
原生js操作cookie 创建和存储 cookie 在这个例子中我们要创建一个存储访问者名字的 cookie.当访问者首次访问网站时,他们会被要求填写姓名.名字会存储于 cookie 中.当访问者再次 ...
- Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结
Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...
- WPF入门教程系列十四——依赖属性(四)
六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base ...
- angularJS自定义那些事
angularJS在数据处理方面很优秀. 使用angularJ给我感觉就像在写模板,然后对模板填入内容,只是这些内容不在是 在html页面编写,而是以数据的方式添加进去,这个也大大提高了编写的效率. ...
- Unity 产生各不相同的随机数
1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...
- codeforces Gargari and Permutations(DAG+BFS)
/* 题意:求出多个全排列的lcs! 思路:因为是全排列,所以每一行的每一个数字都不会重复,所以如果有每一个全排列的数字 i 都在数字 j的前面,那么i, j建立一条有向边! 最后用bfs遍历整个图, ...
- MySQL5.6忘记root密码(win平台)
1.首先net stop mysql服务,并且切换到任务管理器,有与mysql有关的,最好关闭进程. 2.运行CMD命令切换到MySql安装bin目录,下面是我的mysql安装目录 cd C:\Pr ...
- 图像映射map
<map>标签:带有可点击区域的图像映射 定义一个客户端图像映射.图像映射(image-map)指带有可点击区域的一幅图像. 效果图: 点击相应蓝色标签可进入详情页面浏览. 代码: < ...
- Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
<Windows Azure Platform 系列文章目录> 项目文件,请在这里下载 在笔者之前的文章中Windows Azure Service Bus (1) 基础 介绍了Servi ...
- pe创建激活administrator后消除问题,删除用户问题
启动pe进入电脑,打开清楚密码,然后选择administrator,点击激活.然后就可以用administrator登陆电脑. 使用完毕后,想要注销administrator. 方法1. 在cmd中输 ...