`

struts2中action的作用域为session时,如何使浏览器提交的List与服务器保持完全一致

阅读更多
    问题:action的scope=session的场合,如何使浏览器提交的list和服务器端接收到的保持完全一致。

    咱们知道,action的scope设置为session后,除非浏览器提交数据到服务器,否则服务器端form中的数据不会发生变化。

    昨天遇到了一个问题,MyAction中有一个变量nameList(有getter,setter方法),把这个nameList显示在浏览器的表单中,然后用js删除几行后再次提交到MyAction中,发现服务器端的nameList大小没有发生变化。然后继续尝试,结果如下:

【服务器】
nameList = ["a1","a2","a3"];

【浏览器显示】
nameList[0]=a1
nameList[1]=a2
nameList[2]=a3

【浏览器修改后】
nameList[3]=b4
nameList[5]=b6
这里的意思是删除了原有的3个,新加了两个,并且下标是不连续的。

【提交服务器】
nameList = ["a1","a2","a3","b4",null,"b6"];

    通过form提交的nameList到了服务器后,服务器端并不重新初始化nameList这个变量,而是根据浏览器传递过来的下标单独进行设定。

    想要的结果是:服务器端接收到的nameList与浏览器发送的完全一致。

    开始的解决思路是查找struts2的设定,如果可以让服务器接收到list类型的数据后先初始化服务器端变量然后再设定,就可以解决。但最终没有找到。
    然后想到在服务器端使用两个list变量,一个变量用来给浏览器提供显示的数据,另一个变量用来接收浏览器传递过来的数据。这个方法只停留在了思考阶段,因为我又想到了到了一个较为简洁的替代方案。
    JSP会被编译成servlet,servlet执行后生成了用于浏览器显示的html,那么如果在servlet的最后加上初始化服务器变量的代码,这样一来,浏览器再次把数据发送到服务器时,服务器的nameList就是被初始化过的了,兴奋不已啊,只是struts2与struts1不一样啊,setAttribute不好使啊咋办啊,那就直接取得action实例吧,终于搞定。

这段用于初始化的代码写在jsp的最后(因为前面还要使用nameList来显示)
	<%
		HttpServletRequest req = ServletActionContext.getRequest();
		ServletContext sc = req.getSession().getServletContext();
		ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
		
		// 取得action的实例
		// (因为scope是session,所以这里取到的action与上次访问的是同一个实例)
		MyAction action = (MyAction) ac.getBean("MyAction");

		// 初始化变量
		action.setNameList(new ArrayList());
	%>
1
7
分享到:
评论

相关推荐

    低清版 大型门户网站是这样炼成的.pdf

    6.2.4 bean的作用域与生命周期 374 6.2.5 基于xml方式的bean装配 376 6.2.6 基于annotation方式的bean装配 381 6.2.7 基于xml方式的aop实现 386 6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理...

    从J2SE到J2EE知识点介绍

    2. 表单提交中文时出现乱码 134 3. 关于jsp在MyEclipse中打开的乱码问题 138 4. 关于html页面在eclipse中打开出现乱码情况 139 5. JSP页面通过URL传递中文参数的乱码问题 139 四、 Struts2 140 (一) 基于struts2的...

    java面试题

    答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 ...

    外文翻译 stus MVC

    ActionErrors is Struts way of keeping up with a list of errors. The ActionMapping class An incoming event is normally in the form of an HTTP request, which the servlet Container turns into an ...

    Java面试宝典2010版

    17、请说出作用域public,private,protected,以及不写时的区别 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 19、构造器Constructor是否可被override? 20、接口是否可继承接口? ...

    最新Java面试宝典pdf版

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    Java面试笔试资料大全

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    Java面试宝典-经典

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    java面试题大全(2012版)

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    Java面试宝典2012版

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    Java面试宝典2012新版

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    java面试宝典2012

    17、请说出作用域public,private,protected,以及不写时的区别 14 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 15 19、构造器Constructor是否可被override? 16 20、接口是否可继承...

    JAVA面试宝典2010

    17、请说出作用域public,private,protected,以及不写时的区别 13 18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 14 19、构造器Constructor是否可被override? 15 20、接口是否可继承...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

Global site tag (gtag.js) - Google Analytics