ActionForm中动态长度的List

转载 2012年03月30日 17:51:04

转载自http://qingbo.net/blog/post322.html 

某些情况下,一个表单中提交的内容数量是不一定的。比如Facebook的编辑照片界面,可以把整个相册的照片(最多60张)放在一起进行批量编辑,或者把一次上传的若干张照片一起编辑。这种情况下,如何用ActionForm来获取这些数据呢?

这个ActionForm(假设名为PhotoForm)应该有一个字段:

List<Photo> photos;

生成这个表单的时候很简单,服务器端当然清楚有多少张照片要被编辑,于是对这些照片遍历一遍,生成表单。实际上,struts form的设计考虑了链表数据的提交。以照片编辑页面为例,生成表单时,可以这样:

<logic:iterate id=”photo” name=”photos”>
<html:hidden name=”photo” property=”id” indexed=”true” />
<html:text name=”photo” property=”name” indexed=”true” />
</logic:iterate>

indexed属性便是专为链表设计的。这样的jsp代码生成的HTML类似:

<input type=”hidden” value=”5″ name=”photo[4].id”/>
<input type=”text” value=”编辑前的名字” name=”photo[4].name”/>

然而在用户将修改过的信息提交的时候,由于HTTP协议的stateless特性,服务器端已经“忘记”有多少张照片了(除非你在session中记录了这个数字,不过处于性能考虑大多数人在避免使用session,另外,假如用户在编辑信息的途中出去玩了几小时,回来继续提交的话,session已经不存在了)。

photos这个List即使放在对应的ActionForm中也无济于事,因为用户看到表单时,这个ActionForm对象已经消失了(当然,不要在那个mapping中设置scope=”session”)。

究其源,溯其本,很容易解决这种问题。请求提交给struts,struts首先根据mapping创建一个对应的ActionForm对象,当它看到表单中的属性名为photo[4].id,就会调用PhotoForm的getPhoto(4).setId(xxx)来填充表单。

注意,struts不是生成一个Photo对象,把id、name填充进去,再加到photos这个List中,它不知道要生成Photo对象。它只知道利用发射机制调用getPhoto(4).setId(xxx)。

所以我们应该在PhotoForm的getPhoto这个方法里做文章,根据参数将List扩展到适当的大小避免IndexOutOfBoundException,并且生成Photo对象保证不出现NullPointerException. 示例如下:

public Photo getPhoto(int index) {
	// 如果链表不存在则创建
	if (photos == null) {
		photos = new ArrayList<Photo>(index + 1);
	}

	// 如果链表长度不够,扩展
	if (photos.size() < index + 1) {
		for (int i = photos.size(); i < index + 1; i++) {
			photos.add(null);
		}
	}

	// 取得photo,如果为空则创建
	Photo photo = photos.get(index);
	if (photo == null) {
		photo = new Photo();
		photos.set(index, photo);
	}
	return photo;
}

这样就可以了,没有用到session. 看起来比较繁琐,其实道理很简单,明白了struts form的填充方式,就没什么困难了。

另一个例子是客户端可以用JavaScript生成一堆这样的file input:

<input type=”file” name=”file[0]” />
<input type=”file” name=”file[1]” />
<input type=”file” name=”file[2]” />
<input type=”file” name=”file[3]” />

struts怎么填充呢?它会首先读取文件数据,创建FormFile对象,然后调用对应的ActionForm的setFile(index, file)方法填充,index就是那个“数组下标”。所以你需要写一个setFile方法来正确处理。

 

多行数据提交到Struts的ActionForm的List属性中

转自] http://extjs2.javaeye.com/blog/460926 今天遇到提交多行数据问题, 在网上找了一点资料: WEB 应用中一般都会处理主从表的信息, 或者称之为头层与行层...

Struts高级开发_动态ActionForm.avi

  • 2014年09月30日 12:41
  • 11.56MB
  • 下载

SSH:Struts1框架(动态ActionForm)

使用ActionForm可以给开发者在处理HTML表单时带来极大的帮助,它简化了代码的编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。  首先,如果ActionFo...

Struts旅程(三)Struts表单处理器ActionForm(静态动态)

上篇我们以登录为例讲解了struts配置,实现了使用struts框架进行登录的示例。一些名词已经在脑海中飘荡了。 ActionServlet:struts的控制器,负责截取URL或分发。提供Model...

Struts---- 动态ActionForm

1、动态ActionForm动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能* 在struts-confi...

自学SSH框架之---struts(五):动态的ActionForm(DynaActionForm)

在一个大的项目里面,actionForm会很多,那么有没有什么方法避免actionForm的膨胀呢?有,那就是DynaActionForm,,它不用写actionForm类了(可以称为标准或者静态ac...

Struts中静态动态ActionForm的使用(一)

目录 登录例子 区别 时间属性 验证机制         在Struts1中,我们经常接触ActionForm为静态ActionForm。静态是指开发者在使用struts框架时...

一口一口吃掉Struts(六)——动态ActionForm .

使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便。 但是,ActionForm也存在一些明显的不足: 1、如果ActionForm...

动态ActionForm

在Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据,自定义的ActionForm必需符合 JavaBean规范,并继承Struts的ActionF...

06-struts-动态ActionForm

1.ActionForm (1)继承org.apache.struts.action.ActionForm。(2)有getXXX()和setXXX()方法。(3)在将数据从ActionForm传递给A...
  • yyywyr
  • yyywyr
  • 2011年07月22日 09:33
  • 892
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActionForm中动态长度的List
举报原因:
原因补充:

(最多只允许输入30个字)