- 浏览: 21438263 次
- 性别:
博客专栏
-
跟我学spring3
浏览量:2405799
-
Spring杂谈
浏览量:2998317
-
跟开涛学SpringMVC...
浏览量:5631915
-
Servlet3.1规范翻...
浏览量:257703
-
springmvc杂谈
浏览量:1593386
-
hibernate杂谈
浏览量:249043
-
跟我学Shiro
浏览量:5848112
-
跟我学Nginx+Lua开...
浏览量:698307
-
亿级流量网站架构核心技术
浏览量:780690
文章分类
- 全部博客 (329)
- 跟我学Nginx+Lua开发 (13)
- 跟我学spring (54)
- 跟开涛学SpringMVC (34)
- spring4 (16)
- spring杂谈 (50)
- springmvc杂谈 (22)
- 跟我学Shiro (26)
- shiro杂谈 (3)
- hibernate杂谈 (10)
- java开发常见问题分析 (36)
- 加速Java应用开发 (5)
- Servlet 3.1规范[翻译] (21)
- servlet3.x (2)
- websocket协议[翻译] (14)
- websocket规范[翻译] (1)
- java web (6)
- db (1)
- js & jquery & bootstrap (4)
- 非技术 (4)
- reminder[转载] (23)
- 跟叶子学把妹 (8)
- nginx (2)
- 架构 (19)
- flume架构与源码分析 (4)
最新评论
-
xxx不是你可以惹得:
认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
holyselina 写道您前面说到能获取调用是的参数数组,我 ...
【第六章】 AOP 之 6.6 通知参数 ——跟我学spring3 -
xxx不是你可以惹得:
Access denied for user 'root'@' ...
第十六章 综合实例——《跟我学Shiro》 -
dagger9527:
只有@AspectJ支持命名切入点,而Schema风格不支持命 ...
【第六章】 AOP 之 6.5 AspectJ切入点语法详解 ——跟我学spring3 -
dagger9527:
支持虽然会迟到,但永远不会缺席!
【第四章】 资源 之 4.3 访问Resource ——跟我学spring3
到目前为止,请求已经能交给我们的处理器进行处理了,接下来的事情是要进行收集数据啦,接下来我们看看我们能从请求中收集到哪些数据,如图6-11:
图6-11
1、@RequestParam绑定单个请求参数值;
2、@PathVariable绑定URI模板变量值;
3、@CookieValue绑定Cookie数据值
4、@RequestHeader绑定请求头数据;
5、@ModelValue绑定参数到命令对象;
6、@SessionAttributes绑定命令对象到session;
7、@RequestBody绑定请求的内容区数据并能进行自动类型转换等。
8、@RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。
除了上边提到的注解,我们还可以通过如HttpServletRequest等API得到请求数据,但推荐使用注解方式,因为使用起来更简单。
接下来先看一下功能处理方法支持的参数类型吧。
6.6.1、功能处理方法支持的参数类型
在继续学习之前,我们需要首先看看功能处理方法支持哪些类型的形式参数,以及他们的具体含义。
一、ServletRequest/HttpServletRequest 和 ServletResponse/HttpServletResponse
public String requestOrResponse ( ServletRequest servletRequest, HttpServletRequest httpServletRequest, ServletResponse servletResponse, HttpServletResponse httpServletResponse )Spring Web MVC框架会自动帮助我们把相应的Servlet请求/响应(Servlet API)作为参数传递过来。
二、InputStream/OutputStream 和 Reader/Writer
public void inputOrOutBody(InputStream requestBodyIn, OutputStream responseBodyOut) throws IOException { responseBodyOut.write("success".getBytes()); }requestBodyIn:获取请求的内容区字节流,等价于request.getInputStream();
responseBodyOut:获取相应的内容区字节流,等价于response.getOutputStream()。
public void readerOrWriteBody(Reader reader, Writer writer) throws IOException { writer.write("hello"); }reader:获取请求的内容区字符流,等价于request.getReader();
writer:获取相应的内容区字符流,等价于response.getWriter()。
InputStream/OutputStream 和 Reader/Writer两组不能同时使用,只能使用其中的一组。
三、WebRequest/NativeWebRequest
WebRequest是Spring Web MVC提供的统一请求访问接口,不仅仅可以访问请求相关数据(如参数区数据、请求头数据,但访问不到Cookie区数据),还可以访问会话和上下文中的数据;NativeWebRequest继承了WebRequest,并提供访问本地Servlet API的方法。
public String webRequest(WebRequest webRequest, NativeWebRequest nativeWebRequest) { System.out.println(webRequest.getParameter("test"));//①得到请求参数test的值 webRequest.setAttribute("name", "value", WebRequest.SCOPE_REQUEST);//② System.out.println(webRequest.getAttribute("name", WebRequest.SCOPE_REQUEST)); HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);//③ HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class); return "success"; }① webRequest.getParameter:访问请求参数区的数据,可以通过getHeader()访问请求头数据;
② webRequest.setAttribute/getAttribute:到指定的作用范围内取/放属性数据,Servlet定义的三个作用范围分别使用如下常量代表:
SCOPE_REQUEST :代表请求作用范围;
SCOPE_SESSION :代表会话作用范围;
SCOPE_GLOBAL_SESSION :代表全局会话作用范围,即ServletContext上下文作用范围。
③ nativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse:得到本地的Servlet API。
四、HttpSession
public String session(HttpSession session) { System.out.println(session); return "success"; }此处的session永远不为null。
注意:session访问不是线程安全的,如果需要线程安全,需要设置AnnotationMethodHandlerAdapter或RequestMappingHandlerAdapter的synchronizeOnSession属性为true,即可线程安全的访问session。
五、命令/表单对象
Spring Web MVC能够自动将请求参数绑定到功能处理方法的命令/表单对象上。
@RequestMapping(value = "/commandObject", method = RequestMethod.GET) public String toCreateUser(HttpServletRequest request, UserModel user) { return "customer/create"; } @RequestMapping(value = "/commandObject", method = RequestMethod.POST) public String createUser(HttpServletRequest request, UserModel user) { System.out.println(user); return "success"; }如果提交的表单(包含username和password文本域),将自动将请求参数绑定到命令对象user中去。
六、Model、Map、ModelMap
Spring Web MVC 提供Model、Map或ModelMap让我们能去暴露渲染视图需要的模型数据。
@RequestMapping(value = "/model") public String createUser(Model model, Map model2, ModelMap model3) { model.addAttribute("a", "a"); model2.put("b", "b"); model3.put("c", "c"); System.out.println(model == model2); System.out.println(model2 == model3); return "success";}
虽然此处注入的是三个不同的类型(Model model, Map model2, ModelMap model3),但三者是同一个对象,如图6-12所示:
图6-11
AnnotationMethodHandlerAdapter和RequestMappingHandlerAdapter将使用BindingAwareModelMap作为模型对象的实现,即此处我们的形参(Model model, Map model2, ModelMap model3)都是同一个BindingAwareModelMap实例。
此处还有一点需要我们注意:
@RequestMapping(value = "/mergeModel") public ModelAndView mergeModel(Model model) { model.addAttribute("a", "a");//①添加模型数据 ModelAndView mv = new ModelAndView("success"); mv.addObject("a", "update");//②在视图渲染之前更新③处同名模型数据 model.addAttribute("a", "new");//③修改①处同名模型数据 //视图页面的a将显示为"update" 而不是"new" return mv; }从代码中我们可以总结出功能处理方法的返回值中的模型数据(如ModelAndView)会 合并 功能处理方法形式参数中的模型数据(如Model),但如果两者之间有同名的,返回值中的模型数据会覆盖形式参数中的模型数据。
七、Errors/BindingResult
@RequestMapping(value = "/error1") public String error1(UserModel user, BindingResult result)
@RequestMapping(value = "/error2") public String error2(UserModel user, BindingResult result, Model model) {
@RequestMapping(value = "/error3") public String error3(UserModel user, Errors errors)
以上代码都能获取错误对象。
Spring3.1之前(使用AnnotationMethodHandlerAdapter)错误对象必须紧跟在命令对象/表单对象之后,如下定义是错误的:
@RequestMapping(value = "/error4") public String error4(UserModel user, Model model, Errors errors) }如上代码从Spring3.1开始(使用RequestMappingHandlerAdapter)将能正常工作,但还是推荐“错误对象紧跟在命令对象/表单对象之后”,这样是万无一失的。
Errors及BindingResult的详细使用请参考4.16.2数据验证。
八、其他杂项
public String other(Locale locale, Principal principal)java.util.Locale:得到当前请求的本地化信息,默认等价于ServletRequest.getLocale(),如果配置LocaleResolver解析器则由它决定Locale,后续介绍;
java.security.Principal:该主体对象包含了验证通过的用户信息,等价于HttpServletRequest.getUserPrincipal()。
以上测试在cn.javass.chapter6.web.controller.paramtype.MethodParamTypeController中。
其他功能处理方法的形式参数类型(如HttpEntity、UriComponentsBuilder、SessionStatus、RedirectAttributes)将在后续章节详细讲解。
第二部分会介绍注解方式的数据绑定。
评论
1.对象参数是使用反射去设值的吗,那岂不是会导致接口性能慢?
2.对于基本数据类型参数的怎么赋值?因为编译期间参数名已经被擦除了。
1.性能问题是当前核心问题吗?
2.参数名擦除问题我记得博客里有说到,比如通过@RequestParam
1.@RequestMapping("saysth.do")
public void test(int count) {
}
这一种是不用注解的,前端传count名字参数进来能自动数据绑定,但是因为controler的方法是反射调的,方法名编译时已经被擦除,那么怎么根据参数的名字传进来的
2.@RequestMapping("saysth.do")
public void test(User user) {
}
这种参数自动通过对象绑定数据,是通过最原始jdk的反射实现的?还是说使用底层的cglib等实现?
看这篇
http://jinnianshilongnian.iteye.com/blog/1705701
谢谢!不过我是想知道怎么实现的,而不是怎么用,我自己再尝试看看源码吧
1.对象参数是使用反射去设值的吗,那岂不是会导致接口性能慢?
2.对于基本数据类型参数的怎么赋值?因为编译期间参数名已经被擦除了。
1.性能问题是当前核心问题吗?
2.参数名擦除问题我记得博客里有说到,比如通过@RequestParam
1.@RequestMapping("saysth.do")
public void test(int count) {
}
这一种是不用注解的,前端传count名字参数进来能自动数据绑定,但是因为controler的方法是反射调的,方法名编译时已经被擦除,那么怎么根据参数的名字传进来的
2.@RequestMapping("saysth.do")
public void test(User user) {
}
这种参数自动通过对象绑定数据,是通过最原始jdk的反射实现的?还是说使用底层的cglib等实现?
看这篇
http://jinnianshilongnian.iteye.com/blog/1705701
1.对象参数是使用反射去设值的吗,那岂不是会导致接口性能慢?
2.对于基本数据类型参数的怎么赋值?因为编译期间参数名已经被擦除了。
1.性能问题是当前核心问题吗?
2.参数名擦除问题我记得博客里有说到,比如通过@RequestParam
1.@RequestMapping("saysth.do")
public void test(int count) {
}
这一种是不用注解的,前端传count名字参数进来能自动数据绑定,但是因为controler的方法是反射调的,方法名编译时已经被擦除,那么怎么根据参数的名字传进来的
2.@RequestMapping("saysth.do")
public void test(User user) {
}
这种参数自动通过对象绑定数据,是通过最原始jdk的反射实现的?还是说使用底层的cglib等实现?
1.对象参数是使用反射去设值的吗,那岂不是会导致接口性能慢?
2.对于基本数据类型参数的怎么赋值?因为编译期间参数名已经被擦除了。
1.性能问题是当前核心问题吗?
2.参数名擦除问题我记得博客里有说到,比如通过@RequestParam
1.对象参数是使用反射去设值的吗,那岂不是会导致接口性能慢?
2.对于基本数据类型参数的怎么赋值?因为编译期间参数名已经被擦除了。
四、HttpSession
Java代码
1.public String session(HttpSession session) {
2. System.out.println(session);
3. return "success";
4.}
public String session(HttpSession session) {
System.out.println(session);
return "success";
}
此处的session永远不为null。
注意:session访问不是线程安全的,如果需要线程安全,需要设置AnnotationMethodHandlerAdapter或RequestMappingHandlerAdapter的synchronizeOnSession属性为true,即可线程安全的访问session。
-----------------------------------------------------
意思是在一个controller的方法中,直接引用session的话,会线程不安全吗?
比如我这么写
@Controller
@RequestMapping("/test")
public class TestController
{
@RequestMapping("/test")
public String test(HttpSession session, Model model)
{
LzAdmin admin = (LzAdmin) session.getAttribute(SysConstant.ADMIN_INFO);
model.addAttribute("nnn", admin.getName());
return "/test/test";
}
}
这么写的话线程不安全吗?
Spring Web MVC能够自动将请求参数绑定到功能处理方法的命令/表单对象上。
Java代码 收藏代码
@RequestMapping(value = "/commandObject", method = RequestMethod.GET) public String toCreateUser(HttpServletRequest request, UserModel user) { return "customer/create"; } @RequestMapping(value = "/commandObject", method = RequestMethod.POST) public String createUser(HttpServletRequest request, UserModel user) { System.out.println(user); return "success"; }
如果提交的表单(包含username和password文本域),将自动将请求参数绑定到命令对象user中去。
如果该表单要提交的数据不是一个对象的属性,而是对各对象的属性怎么办??
谢谢
上一下日志
你们系统开发,是用什么标签库,自定义?
c标签就挺好用的
你们系统开发,是用什么标签库,自定义?
直接用jstl表达式也一样啊,为什么要用spring的标签。我感觉那个熟悉用什么!!
呵呵,我赞成你那个“那个熟悉用什么”。我的想法是尽可能充分利用spring提供的资源,菜鸟学习中,别耻笑哈 ,不知道spring有没有迭代标签,逻辑判断标签,我看了spring官方文档,貌似没有哦。。。
你们系统开发,是用什么标签库,自定义?
直接用jstl表达式也一样啊,为什么要用spring的标签。我感觉那个熟悉用什么!!
发表评论
-
跟我学SpringMVC目录汇总贴、PDF下载、源码下载
2012-12-22 08:05 619372扫一扫,关注我的公众号 购买地址 ... -
源代码下载——第七章 注解式控制器的数据验证、类型转换及格式化
2012-12-01 07:12 33370源代码请到附件中下载。 其他下载: ... -
SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-23 07:47 2382787.4、数据验证 7.4.1 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 19:18 887667.3、数据格式化 ... -
SpringMVC数据格式化——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-19 16:41 46支持一下博主:------------------ ... -
SpringMVC数据类型转换——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
2012-11-12 20:08 1230167.1、简介 在编写可 ... -
扩展SpringMVC以支持绑定JSON格式的请求参数
2012-11-08 07:43 125890上一篇:《扩展SpringMVC以支持更精准的数据绑 ... -
扩展SpringMVC以支持更精准的数据绑定1
2012-11-06 07:38 76524最新版请点击查看FormM ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-26 07:57 1525956.6.2、@RequestParam绑定单个请求参 ... -
SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-23 14:45 15---------------------------- ... -
Spring MVC 3.1新特性 生产者、消费者请求限定 —— 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-10-10 14:16 483616.6.5、生产者、消费者限定 6.6.5.1、基 ... -
SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 15:29 104638声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:50 946.5.1.1、普通URL路径映射 @Request ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 11:48 536.5.2、请求方法映射 ... -
请求映射之请求方法映射限定 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 10:47 216.5.2、请求方法映射限定 一般我们熟悉的表单 ... -
请求映射之URL路径映射 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-24 07:05 1636.5.1.1、普通URL路径映射 @Reques ... -
源代码下载 第六章 注解式控制器详解
2012-09-22 07:11 41858源代码请到附件中下载。 其他下载: 跟着 ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 17:47 67242声明:本系列都是原创内容,觉得好就顶一个,让更多人知道! ... -
注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC
2012-09-20 15:54 96.1、注解式控制器简介 一、Spring2. ... -
源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC
2012-09-17 07:34 33563源代码请到附件中下 ...
相关推荐
第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器详解 SpringMVC强大的数据绑定(2) 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据类型转换 第七章 注解式控制器的...
第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器详解 SpringMVC强大的数据绑定(2) 第七章 注解式控制器的数据验证、类型转换及格式化 SpringMVC数据类型转换 第七章 注解式控制器的...
非常棒的SpringMVC教程, 简明 透彻 涵盖了基本工作中都会接触到的知识 每一章都是一个PDF,效果...第六章 注解式控制器详解4(SpringMVC强大的数据绑定1).pdf 第六章 注解式控制器详解5(SpringMVC强大的数据绑定2).pdf
PDF,源代码 开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 ...第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化
跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本
SpringMVC学习(一)——SpringMVC入门小程序
跟开涛学springmvc pdf电子文档版 适合学习springmvc 非常好的教程
SpringMVC学习(十二)——SpringMVC中的拦截器
SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1679570
SpringMVC注解驱动的控制器详解,具体效果与过程看博文 http://blog.csdn.net/evankaka/article/details/45562951
跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC
Spring MVC学习(六)-------注解式控制器详解1
springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证 参数传递
springmvc常用注解标签详解,总结,常用注解,标签详解,springmvc
基于注解的springMVC的HelloWorld
跟开涛学SpringMVC-高清版,找了好久的,分享给大家。
跟开涛学SpringMVC 高清 带书签 pdf 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以...
开涛写的中文springmvc开发文档 , 初学者可以下载学习,或者当做字典用。
跟开涛学SpringMVC源代码汇总