`

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
分享到:
评论

相关推荐

    struts2综合复习习题

    OGNL的根对象是`ValueStack`,它是Struts2框架内部用于存储请求作用域中的所有对象的容器。 #### 九、在jsp页面中可以通过Struts2提供的()标签输出国际化信息 **答案解析:** - 正确答案为 **D.**。 - `&lt;s:text&gt;...

    struts2标签使用方法

    - 在Action配置中,将User对象放入session或request作用域。 - JSP页面中,可以使用`s:property value="${user.name}"`显示用户名,`&lt;s:textfield name="user.email" /&gt;`创建一个输入框用于编辑邮箱。 5. **最佳...

    struts2常用标签详解(实用版)

    - 当字段名与Action类中的属性名一致时,如`userName`,Struts2会自动调用Action类中的setter方法来设置该值。 - 如果字段名与Action类中的属性名不一致,则可以通过request对象获取参数值,例如使用`request....

    Struts2页面取值总结

    如`&lt;s:property value="username"/&gt;`,这里的`username`需确保在当前作用域(通常是action或request)中可访问。 2. **EL表达式** (`${}`): EL表达式提供了一种简洁的方式来访问JavaBean属性。例如`${username}`...

    Struts2页面开发中常用的标签介绍

    - 此标签用于将某个值设置到指定的作用域中,如`request`、`session`等。 #### 三、Struts2页面开发中常用标签使用规范 - **数据传递**: 在向Action传递数据时,推荐使用`&lt;s:textfield&gt;`等Struts2标签,以利用其...

    struts2 session 解读

    ### Struts2中Session的理解与应用 #### 一、Struts2框架简介 Struts2是Struts的一个改进版本,它结合了WebWork框架的一些优点,成为了一个功能强大的MVC框架。Struts2的设计思想非常先进,它不仅支持拦截器模型,...

    Struts2笔记

    本笔记将深入探讨Struts2的核心概念、配置方法以及如何通过Action类与视图进行交互。 1. **Struts2的作用** Struts2的主要作用是为Web应用程序提供结构化和可扩展的架构。它负责处理用户请求,将这些请求映射到...

    struts2-s标签

    与 Struts 1.x 版本相比,Struts2 在标签库的设计上进行了重大的改进和优化。 #### 标签库概述 在 Struts 1.x 中,标签库主要分为四大类:`html`、`bean`、`logic`、`tiles`。而在 Struts2 中,所有的标签都被统一...

    传智168期JavaEE struts2杜宏 day32~day33笔记

    在Struts2中,通常会将Action对象设置为根对象(root),而其他Web域对象(如request, session, application)则作为非根对象进行管理。 - **根对象(root)与非根对象**:根对象在获取数据时不需要加上`#`符号,而非根...

    Struts2标签库

    `list`属性用于指定下拉选项,可以是静态列表或从`request`或`session`作用域获取的数据。 8. `&lt;s:checkbox&gt;`:用于创建多选框,`name`属性指定字段名,`value`设置默认选中项,`label`定义显示的文本。 9. `...

    struts2常用标签说明

    - `&lt;s:set&gt;`:将值放入特定范围,如`&lt;s:set name="user" value="userName" scope="request"/&gt;`,将`userName`放入request作用域中,可供后续请求使用。 在Struts2的页面开发中,遵循以下使用规范: - 为Action提供...

    Struts实现CRUD操作

    - 随后,Action将这个集合对象放入到请求或session作用域中,以便JSP页面可以访问并显示数据。 3. 更新(Update)操作: 更新记录需要: - 在JSP页面上展示待修改的记录,这可能通过Action从数据库获取数据并...

    struts常见错误以及解决

    当JSP页面中的`&lt;html:form&gt;`标签中的`action`属性值与struts-config.xml文件中的映射不匹配时,会出现此类异常。 - **解决方案:** - 检查JSP页面中的`&lt;html:form&gt;`标签中的`action`属性值是否与struts-config....

    2014 java servet jdbc struts struts2面试题

    2. **变量与数据类型**:包括基本数据类型和引用数据类型的区别,以及作用域、生命周期和初始化。 3. **封装、继承和多态**:这是面向对象编程的三大特性,面试时会深入讨论它们的概念和实际应用。 4. **异常处理*...

    Struts2+Spring3+Hibernate3整合文档

    为了与Struts2保持一致,需要将Action的Scope设置为`prototype`或`session`。 - **`prototype`**:为每个请求创建一个新的Action实例。 - **`session`**:为每个会话创建一个新的Action实例。 示例配置如下: ```...

    struts2中OGNL的一些概念及原理说明

    1. **ValueStack的作用**:`ValueStack`主要用来存储请求过程中的数据,特别是在处理Action类相关的数据时尤为重要。 2. **使用EL表达式获取ValueStack中的数据**:通过EL表达式的搜索机制,可以在未找到相应域对象...

    struts2标签和OGNL表达式.pdf

    #applicationContext, #session, #request等符号是OGNL在Struts2中的内置对象,分别代表了不同作用域的数据存储。#applicationContext用于访问应用范围的对象,#session访问会话范围的对象,#request访问请求范围的...

    Struts2标签库的所有

    在使用Struts2框架时,首先需要在JSP页面中引入Struts2标签库: ```jsp &lt;%@ taglib uri="/struts-tags" prefix="s" %&gt; ``` 接下来我们将详细探讨以下八个重要的Struts2标签及其用途。 #### 三、Struts2标签详解 ...

    struts+hibernate查询所有记录

    - 将查询结果保存到请求或会话作用域中,以便在JSP页面中使用。 ```java public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) ...

    struts2入门,struts2 标签

    在此例中,“userBean.name”是表单字段与Action类中的属性对应关系,以便在提交时将数据绑定到相应的Action属性。 #### 2. `&lt;s:textarea&gt;` — 多行文本输入标签 - **用途**:用于创建一个多行文本输入框,适用于...

Global site tag (gtag.js) - Google Analytics