作为一个javaweb应用的开发者,你快速学习了request(httprequest)和ssion(httpssion)的范围,理解这些范围并且在这些范围内数据和对象是如何是进出的对设计和构建web应用是非常关键的。
当我用springmvc写web应用的时候,我发现spring model和ssion有一点神秘—特别是与http reques贵州高考作文、和ssion范围关联起来这些我都已经了解了。
spring的model元素会在我的ssion或者request中找到吗,如果是这样,我怎么控制这个过程呢,在这篇文章中我希望能够解密springmvc的model和ssion是如何工作的。
这里有好几种向spring的model添加数据的方式。数据或者对象通常通过在controller上的注释方法添加到spring中的model中去。
下边这个例子中,@modelattribute用来将mycommandbean的实例以key值为myrequestobject添加到model中去
@controllerpub出现的反义词lic class mycontroller { @modelattribute("myrequestobject") public mycommandbean addstufftorequestscope() { system.out.println("inside of addstufftorequestscope"); mycommandbean bean = new mycommandbean("hello world",42); return bean; } @requestmapping("/dosomething") public string requesthandlingmethod(model model, httprvletrequest request) { system.out.println("inside of dosomething handler method")鸟化石; system.out.println("--- model data ---"); map modelmap = model.asmap(); for (object modelkey : modelmap.keyt()) { object modelvalue = modelmap.get(modelkey); system.out.println(modelkey + " -- " + modelvalue); } system.out.println("=== request data ==="); java.util.enumeration reqenum = request.getattributenames(); while (reqenum.hasmoreelements()) { string s = reqenum.nextelement(); system.out.println(s); system.out.println("==" + request.getattribute(s)); } return "nextpage"; } // ... the rest of the controller}
在一个请求的request中,任何使用@modelattribute注解的方法会在controller的handler方法(像上边例子汇总的requesthandlingmethod 方法)之前被调用。
在这些handler方法执行前,这些方法把数据增加到java.util.map中最终添加到spring model中去。这可以通过一个简单的实验证明,我创建了两个jsp页面:index.jsp和nextpage.jsp。
index.jsp中的链接用来发送request到web应用中来触发mycontroller中的requesthandlingmethod()方法。requesthandlingmethod()方法返回“nextpage”作为下一个视图逻辑上的名字,在这个例子中我们解析为nextpage.jsp。
当这个小的web站点用这种方式执行的时候,controller里边的system.out.println方法表明了@modelattribute方法是如何在handler方法之前运行的。
它同样也展示了这个mycommandbean被创建和添加到springmodel中去的过程。
inside of addstufftorequestscopeinside of dosomething handler method--- model data ---myrequestobject -- mycommandbean [somestring=hello world, somenumber=42]=== request data ===org.springframework.web.rvlet.dispatcherrvlet.theme_source==webapplicationcontext for namespace 'dispatcher-rvlet': startup date [sun oct 13 21:40:56 cdt 2013]; root of context hierarchyorg.springframework.web.rvlet.dispatcherrvlet.theme_resolver==org.springframework.web.rvlet.theme.fixedthemeresolver@204af48corg.springframework.web.rvlet.dispatcherrvlet.context==webapplicationcontext for namespace 'dispatcher-rvlet': startup date [sun oct 13 21:40:56 cdt 2013]; root of context hierarchyorg.springframework.web.rvlet.handlermapping.pathwithinhandlermapping==dosomething.requestorg.springframework.web.rvlet.handlermapping.bestmatchingpattern==/dosomething.*org.springframework.web.rvlet.dispatcherrvlet.locale_resolver==org.springframework.web.rvlet.i18n.acceptheaderlocaleresolver@18fd23e4
现在的问题是“springmodel数据存储在哪?”它存储在标准的java request范围中吗?答案是“是的”,从上边的输出可以看出,当handler方法执行的时候mycommandbean是在model中,但是没有在request对象中。
确实,spring不会把model数据作为request的属性,直到执行handler方法之后和下一个视图之前(在这个例子中是nextpage.jsp)
这也可以通过打印存储在index.jsp和nextpage.jsp中的httprvletrequest中的数据展示出来,这两个页面我都使用jsp来展示httprvletrequest的属性
request scope (key==values)<% java.util.enumeration<string> reqenum = request.getattributenames(); while (reqenum.hasmoreelements()) { string s = reqenum.nextelement(); out.print(s); out.println("==" + request.getattribute(s));%><br /><% }%>
当应用打开小学一年级数学期中试卷并且index.jsp展现的时候,你可以看到在request范围内没有属性
do somethingrequest scope(key==values)
在这个例子中,当“do something”连接被点击的时候触发了mycontroller的handler方法执行,继而导致nextpage.jsp被执行,考虑到这是同样的jsp内容,再次提出不免有些啰嗦。当nextpage.jsp提出的时候,表明model的mycommandbean在controller里被创建,并已经被加到httprvletrequest范围中去了。这个spring model的属性key已经被复制,并且当做request属性的key。
所以spring model数据的创建要早于handler方法的执行,在下一个视图加载前就已经被复制到httprvletreques分离的反义词t中去了。
你可能会疑惑为什么spring使用model属性,为什么不直接将数据加到request对象中去呢,在rod johnson的书中我找到了这个问题的答案。下边就是来自这本书的关于model元素的文本。
直接给httprvletrequest(或者request属性)增加元素看起来实现了相同的目的,做这件事的原因很明确,当我们查看我们为mvc框架设置的要求的时候,应该尽可能使视图无关的,意味着视图技术不和httprvletrequest绑定。
现在你知道spring的model数据是如何管理的并且是如何和httprequt属性关联的,那么spring的ssion数据呢?
spring的@ssionattributes在controller上使用指定model属性应该存储在ssion中。实际上,精确的讲spring开发文档已经表明了@ssionattributes注解“列出了应该存储在ssion中或者对话存储中model属性的名字”。
实际上,@ssionattribute允许你做的是在加载视图之前,告诉spring你的哪一个model attributes将会被复制到httpssion中去。
ssion scope (key==values)<% java.util.enumeration<string> snum = request.getssion() .getattributenames(); while (snum.hasmoreelements()) { string s = snum.nextelement(); out.print(s); out.println("==" + request.getssion().getattribute(s));%><br /><% }%>
我在mycontroller中用@ssionattributes做注解,来把同样的model属性加到spring ssion中去。
@controller@ssionattributes("myrequestobject")public class mycontroller { ...}
我同样也在handler方法中增加了代码来展示什么属性在httpssion中
@suppresswarnings("rawtypes")@requestmapping("/dosomething")public string requesthandlingmethod(model model, httprvletrequest request, httpssion ssion) { system.out.println("inside of dosomething handler method"); system.out.println("--- model data ---"); map modelmap = model.asmap(); for (object modelkey : modelmap.keyt()) { object modelvalue = modelmap.get(modelkey); system.out.println(modelkey + " -- " + modelvalue); } system.out.println("=== request data ==="); java.util.enumeration<string> reqenum = request.getattributenames(); while (reqenum.hasmoreelements()) { string s = reqenum.nextelement(); system.out.println(s); system.out.println("==" + request.getattribute(s)); } system.out.println("*** ssion data ***"); enumeration<string> e = ssion.getattributenames(); while (e.hasmoreelements()){ string s = e.nextelement(); system.out.println(s); system.out.println("**" + ssion.getattribute(s)); } return "nextpage";}
现在,当我们使用@ssionattributes注解后我们可以看到什么在ssion对象中,包括springmvc处理一个http 请求的前中后的过程里。结果如下,首先是index.jsp展示,我们可以看到在httprvletrequest和httpssion中都没有属性数据。
do somethingrequest scope(key == values)ssion scope(key == values)
在handler方法执行过程中(httprvletrequest),你可以看到mycommandbean被加入到spring model属性中去,但是没有在httprvletrequest和httpssion范围中。
但是在handler方法执行之后并且nextpage.jsp被加载,你可以看到model的属性数据确实被作为属性复制到httprvletrequest和httpssion中。
现在你已经对spring model和ssion属性数据是如何加载到httprvletreq。uest和httpssion有很好的理解了。但你依旧对管理spring ssion中的数据心生疑惑。spring提供了移除spring ssion属性的方式,也可以在httpssion中移除。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 03:48:20,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/d973fad65b402239a8c4dc12c285f3a0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:深入理解springMVC中的Model和Session属性.doc
本文 PDF 下载地址:深入理解springMVC中的Model和Session属性.pdf
留言与评论(共有 0 条评论) |