问题: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());
%>
分享到:
相关推荐
OGNL的根对象是`ValueStack`,它是Struts2框架内部用于存储请求作用域中的所有对象的容器。 #### 九、在jsp页面中可以通过Struts2提供的()标签输出国际化信息 **答案解析:** - 正确答案为 **D.**。 - `<s:text>...
- 在Action配置中,将User对象放入session或request作用域。 - JSP页面中,可以使用`s:property value="${user.name}"`显示用户名,`<s:textfield name="user.email" />`创建一个输入框用于编辑邮箱。 5. **最佳...
- 当字段名与Action类中的属性名一致时,如`userName`,Struts2会自动调用Action类中的setter方法来设置该值。 - 如果字段名与Action类中的属性名不一致,则可以通过request对象获取参数值,例如使用`request....
如`<s:property value="username"/>`,这里的`username`需确保在当前作用域(通常是action或request)中可访问。 2. **EL表达式** (`${}`): EL表达式提供了一种简洁的方式来访问JavaBean属性。例如`${username}`...
- 此标签用于将某个值设置到指定的作用域中,如`request`、`session`等。 #### 三、Struts2页面开发中常用标签使用规范 - **数据传递**: 在向Action传递数据时,推荐使用`<s:textfield>`等Struts2标签,以利用其...
### Struts2中Session的理解与应用 #### 一、Struts2框架简介 Struts2是Struts的一个改进版本,它结合了WebWork框架的一些优点,成为了一个功能强大的MVC框架。Struts2的设计思想非常先进,它不仅支持拦截器模型,...
本笔记将深入探讨Struts2的核心概念、配置方法以及如何通过Action类与视图进行交互。 1. **Struts2的作用** Struts2的主要作用是为Web应用程序提供结构化和可扩展的架构。它负责处理用户请求,将这些请求映射到...
与 Struts 1.x 版本相比,Struts2 在标签库的设计上进行了重大的改进和优化。 #### 标签库概述 在 Struts 1.x 中,标签库主要分为四大类:`html`、`bean`、`logic`、`tiles`。而在 Struts2 中,所有的标签都被统一...
在Struts2中,通常会将Action对象设置为根对象(root),而其他Web域对象(如request, session, application)则作为非根对象进行管理。 - **根对象(root)与非根对象**:根对象在获取数据时不需要加上`#`符号,而非根...
`list`属性用于指定下拉选项,可以是静态列表或从`request`或`session`作用域获取的数据。 8. `<s:checkbox>`:用于创建多选框,`name`属性指定字段名,`value`设置默认选中项,`label`定义显示的文本。 9. `...
- `<s:set>`:将值放入特定范围,如`<s:set name="user" value="userName" scope="request"/>`,将`userName`放入request作用域中,可供后续请求使用。 在Struts2的页面开发中,遵循以下使用规范: - 为Action提供...
- 随后,Action将这个集合对象放入到请求或session作用域中,以便JSP页面可以访问并显示数据。 3. 更新(Update)操作: 更新记录需要: - 在JSP页面上展示待修改的记录,这可能通过Action从数据库获取数据并...
当JSP页面中的`<html:form>`标签中的`action`属性值与struts-config.xml文件中的映射不匹配时,会出现此类异常。 - **解决方案:** - 检查JSP页面中的`<html:form>`标签中的`action`属性值是否与struts-config....
2. **变量与数据类型**:包括基本数据类型和引用数据类型的区别,以及作用域、生命周期和初始化。 3. **封装、继承和多态**:这是面向对象编程的三大特性,面试时会深入讨论它们的概念和实际应用。 4. **异常处理*...
为了与Struts2保持一致,需要将Action的Scope设置为`prototype`或`session`。 - **`prototype`**:为每个请求创建一个新的Action实例。 - **`session`**:为每个会话创建一个新的Action实例。 示例配置如下: ```...
1. **ValueStack的作用**:`ValueStack`主要用来存储请求过程中的数据,特别是在处理Action类相关的数据时尤为重要。 2. **使用EL表达式获取ValueStack中的数据**:通过EL表达式的搜索机制,可以在未找到相应域对象...
#applicationContext, #session, #request等符号是OGNL在Struts2中的内置对象,分别代表了不同作用域的数据存储。#applicationContext用于访问应用范围的对象,#session访问会话范围的对象,#request访问请求范围的...
在使用Struts2框架时,首先需要在JSP页面中引入Struts2标签库: ```jsp <%@ taglib uri="/struts-tags" prefix="s" %> ``` 接下来我们将详细探讨以下八个重要的Struts2标签及其用途。 #### 三、Struts2标签详解 ...
- 将查询结果保存到请求或会话作用域中,以便在JSP页面中使用。 ```java public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) ...
在此例中,“userBean.name”是表单字段与Action类中的属性对应关系,以便在提交时将数据绑定到相应的Action属性。 #### 2. `<s:textarea>` — 多行文本输入标签 - **用途**:用于创建一个多行文本输入框,适用于...