想向熟练Struts的人问一个问题:JSP页面中使用struts,定义了Form Bean 之后,写好了页面,页面中文本框里的值是通过什么方式得到,然后传递到Action中的呢?在struts中,如果我对应页面上的不同按钮有不同的Action操作,比如页面上“查询”按钮,我对应写一个SearchAction ,那么在这个SearchAction中,应该怎么写流程呢?也就是说我该写些什么逻辑在里面?我在页面文本框中获取的值,怎么样子才能传递到SearchAction中呢,有人告诉我说可以放在request中,或者是session中,这两种方式有什么区别呢?怎样放入到request中或者是放入到session中呢?归结起来就是两个问题:
1.对应页面按钮的Action逻辑主要写什么?
2.request和session的区别是什么?怎么使用呢?希望有熟悉的人能解答我的疑惑!!谢谢!!
1.对应页面按钮的Action逻辑主要写什么?
2.request和session的区别是什么?怎么使用呢?希望有熟悉的人能解答我的疑惑!!谢谢!!
解决方案 »
- struts2 s:generator 标签生成的list如何判断其长度
- 一个按扭同时具有升降排序功能怎么实现?
- 说说实现网页自动跳转的所有方法
- 请问,有无使用NSIS,进行JDK1.5,MYSQL5,TOMCAT5打包生成安装程序的例子
- myeclipse,tomcat部署问题
- 在线求助
- Tomcat5.5 打war包后项目无法正确执行查询
- java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
- 怎么获取表单内容(form中的input数不定)
- 用JSP调JavaBean,JavaBean再调用本地方法dll
- 如何监听网站访问者的信息,急!急!急!大家帮帮忙
- Changed limits: max_open_files: 2048 max_connections: 2038 table_cache: 64
session是会话域,只要不关闭浏览器或者不超出容器指定的session失效时间,session就存在。
逻辑该怎么写谁都无法帮你,每个应用的每个细节的逻辑都可能是不一样的,没有一个统一的写法。
1.页面中文本框里的值是通过什么方式得到?
首先肯定你是这么用的:
<html:form action="..." ...>
<html:text property="..."/>
</html:form>
标签<html:form/>会根据name值在scope中(page,equest,session,application)查找formBean,如果没有,根据action配置的type实例化一个以name值为名的对象放入scope中,同时它还以"org.apache.struts..."(记不全,我在外地,查不到,但不影响你理解)为名存入pageContext中.那么formBean中的值是如何到页面的呢?这要分两种情况,formBean在struts里有两种,用的较多的是ActionForm,较少的是DynaActionForm。
<html:text property="..."/>会以"org.apache.struts..."为名在pageContext中得到这个formBean。如果是ActionForm类型,再调用org.apache.struts.util.RequestUitls的一个方法,这方法最后调用org.apache.common.beanUtils.PropertyUtils的一个方法getProperty(Object bean,String propertyName)得到<html:text property="..."/>标签中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
因为在外出差,有个函数名述错了,很抱歉,在对第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