站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题向熟练Struts的人问个问题,关于Struts和JSP 中的request和Session操作

向熟练Struts的人问个问题,关于Struts和JSP 中的request和Session操作

摘要: 向熟练Struts的人问个问题,关于Struts和JSP 中的request和Session操作


想向熟练Struts的人问一个问题:JSP页面中使用struts,定义了Form Bean 之后,写好了页面,页面中文本框里的值是通过什么方式得到,然后传递到Action中的呢?在struts中,如果我对应页面上的不同按钮有不同的Action操作,比如页面上“查询”按钮,我对应写一个SearchAction ,那么在这个SearchAction中,应该怎么写流程呢?也就是说我该写些什么逻辑在里面?我在页面文本框中获取的值,怎么样子才能传递到SearchAction中呢,有人告诉我说可以放在request中,或者是session中,这两种方式有什么区别呢?怎样放入到request中或者是放入到session中呢?

归结起来就是两个问题:
1.对应页面按钮的Action逻辑主要写什么?
2.request和session的区别是什么?怎么使用呢?

希望有熟悉的人能解答我的疑惑!!谢谢!!


关于页面中文本框里的值是通过什么方式得到的,我认为应该是通过http的方式传到服务器端,然后服务器端调用java的反射机制(reflection)调用你formbean里面的setter来实现的,所以formbean里面的setter方法必须都是标准的setXXX()形式,XXX代表的是formbean变量的名称,同时也是页面中输入框的property名称,而其他的地方,建议楼主看看struts in action之类介绍struts的书吧,里面都有解答。


这种问题去看教科书经来这里问要好得多。


我就是正在看《Struts in Action》,就是在理解这里的时候老是没想透。关于request和session的区别是什么?这个我一直都没想通。请各位高人能指点指点,谢谢!


还有就是一个按钮对应的Action里面的逻辑该怎么写,我也是不熟悉。请大家指点指点了!



request是单一请求域,不是同一个请求就无效了,例如提交表单就是一次请求。
session是会话域,只要不关闭浏览器或者不超出容器指定的session失效时间,session就存在。
逻辑该怎么写谁都无法帮你,每个应用的每个细节的逻辑都可能是不一样的,没有一个统一的写法。


关注一下


让我来细细告你:
1.页面中文本框里的值是通过什么方式得到?
首先肯定你是这么用的:



标签会根据name值在scope中(page,equest,session,application)查找formBean,如果没有,根据action配置的type实例化一个以name值为名的对象放入scope中,同时它还以"org.apache.struts..."(记不全,我在外地,查不到,但不影响你理解)为名存入pageContext中.那么formBean中的值是如何到页面的呢?这要分两种情况,formBean在struts里有两种,用的较多的是ActionForm,较少的是DynaActionForm。
会以"org.apache.struts..."为名在pageContext中得到这个formBean。如果是ActionForm类型,再调用org.apache.struts.util.RequestUitls的一个方法,这方法最后调用org.apache.common.beanUtils.PropertyUtils的一个方法getProperty(Object bean,String propertyName)得到标签中property为名的属性值。
如果是DynaActionForm,则首先调用struts的DynaActionFormClass接口的一个方法getProperty(......),这个方法得到xml文件中配置的属性,如果属性不存在,返回空,抛出异常,否则如同对ActinForm那样得到属性值。得到属性值后调用pageContext.getOut().write(...)方法将属性值组合成<input type="text" value="..."/>。

2.那么在这个SearchAction中,应该怎么写流程呢?
这个完全是你的业务问题。

3.我在页面文本框中获取的值,怎么样子才能传递到SearchAction中呢.
业面表单submit后,值会传给ActionServlet,它从action值得到action配置,再从配置中name值及scope范围得到的formBean,ActionServlet再从request中得到上传的值,根据属性名绑定到formBean中,接着调用你的Action类中的方法,将formBean做为参数。你在Action类的方法中可以 ActinForm actionForm=(ActionForm)form得到formBean.这个formBean就已有你从页面表单submit上来的数据。
4.有人告诉我说可以放在request中,或者是session中,这两种方式有什么区别呢?
你从jsp1.jsp转到jsp2.jsp时你在jsp1.jsp的request中的值就传到jsp2.jsp,你在jsp2.jsp中能得到这些值,但是你再从jsp2.jsp转到jsp3.jsp时,你在jsp1.jsp的request中的值就不一定能在jsp3.jsp中得到(从jsp1.jsp到jsp2.jsp可以是直接的,也可以是经ActionServlet再到jsp2.jsp的).但是session中的值存在于你整个会话期。你在jsp1.jsp上在session中放入的对象可以在jsp3.jsp中得到。
5.怎样放入到request中或者是放入到session中呢?
你在Action类中对数据处理后, 想将某对象放入request或session中可以采用这样的方法。如果对象是obj1,你可以用一个名字,如"mayObj"存放。
放入request中:request.setAttribute("myObj",obj1);
放入session中:request.getSession(false).setAttribute("myObj",obj1);
注意:处理formBean后,你无需将其存放到request或session中,因为它已在request或session中,这是你struts的action配置scope指定的.
6.补充:
在jsp页面上,你可以通过这样的方法将你在Action类某方法存入request或session中的对象找回来:
<%
Object obj=pageContext.getRequest().get("myObj");
%>

<%
Object obj=pageContext.getRequest()getSession().get("myObj");
%>
我在外地的一个网巴中。个别方法名可能记不准确,但不影响你理解。
你可以结合struts与newxy技术一同学,会受用无穷。因为大量的东西不用写代码。
newxy技术网站:http://www.newxy.net



向楼上的敬礼!


页面文本框的值通过formbean在Action的execute方法的参数中传进来。取得页面文本框的值利用frombean相应的getter方法。你每按一个网页上的一个链接就是一个新的request,当服务器返回给浏览器一个response时,request就结束了,此时保存在request中的对象就不存在了,但是当你用一个浏览器连到服务器上时application-server会新开一个session给你,当连接超时或浏览器关闭时session才销毁。所以说作用的范围是不一样。只需要传递一次的东西可以放到request中,需要在不同的页面转换的过程中一直保存的东西可以放到session中,比如用户信息和购物车信息可以放到session中,而表单提交信息可以放到request中。Action的逻辑主要是在execute方法中写具体的查询逻辑。


解释的已经够详细了




有人向我敬礼,我非常高兴,我给很多人答过问题,但我的分还只有90分。
因为在外出差,有个函数名述错了,很抱歉,在对第1个问的回答中,“如果是DynaActionForm,则首先调用struts的DynaActionFormClass接口的一个方法getProperty(......),这个方法得到xml文件中配置的属性,如果属性不存在,返回空”这名句有误,接口方法应是:public DynaProperty getDynaProperty(String name),strus的DynaActionFormClass扩张了org.apache.commons.beanutils.DynaClass接口;另有一包名述错了,"org.apache.common.beanUtils"应为"org.apache.commons.beanutils"。
非常遗憾,没能100%准确述清楚,大家可看:http://blog.csdn.net/nlhlx/archive/2006/06/11/788541.aspx


不知yinyyzz (深蓝)有没有理解。


up


非常非常非常~~~非常 感谢楼上的各位给我的解答和帮助,真的是非常感谢,多的话也不会说,就只会说一句,感谢帮忙!!

非常抱歉才来结贴,兄台我在贵州的深山里出差了3个多月,刚刚才回归文明社会生活~


↑返回目录
前一篇: FAIL - Application at context path /Test could not be started错误,请问是什么原因?
后一篇: jacob的问题,高手来看看,急!!