在Struts中使用JavaBean和List(多行数据)类型属性

数据

 
在 Strust 中,我们可能经常要在 ActionForm 中使用其他 JavaBean 作为属性类型,这里就存在着如何使用好这些属性与 HTML Form 之间的数据交换,下面我们就这些问题做一讲解。

如在用户注册界面中,我们通常会将用户的联系方式形成一个单独的新的 Class ,如 Contact ,包含以下属性:电话 (tel) ,手机 (cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,这样条理也比较清晰,以下是这个 ActionForm 的部分代码:

public class RegisterForm extends ActionForm

{

private Integer id;

private String logonName;

private String realName;

private Contact contact=new Contact();

………..

}

在这里我们需要将 Contact 实例化(在 reset 函数中需要重新实例化),这主要因为 Struts 的机制:如我们将 HTML 的 Form 元素(如 email )值传给 ActionForm , Struts 需要执行的操作是 getContact().setEmail(String email) ,如果这时返回的 contact 对象为空的话,那么赋值如何进行,而且 Struts 也不会知道如何去实例化 Contact ,有时这些 JavaBean 的类型有可能是接口,实例化更是未知,所以关于 JavaBean 类型在 ActionForm 中的实例化,你需要自行完成,而且必须完成。至于在实际操作中判断 JavaBean 是否被进行过相关操作(不再是初始状态),你需要自行判断,其实也很简单,如可在 Contact 类中编写一个函数检验一下即可。

ActionForm 创建完毕后,我们需要在 Jsp Form 中引用这些 JavaBean 类型的属性值,那就很简单啦,只需采用“ Form 的属性名称”+“ . ”+“ JavaBean 中的属性名称”结构构成的名称付给相关元素即可。如:

<html:text property="contact.email"/>

通过这种方式我们就可以处理好 ActionForm 中的 JavaBean 类型的属性值了。

实际的情况可能更复杂些,我们有时可能要提交多行数据到后退,而且行内的数据是相关的,如我们需要提交多个用户的联系方式,这些行内的数据,如 email ,电话,手机,这些数据都是和用户编码相关的,现在我们修改一下 Contact 类,添加一个用户编码 (userId) 属性,这时我们构建的 ActionForm 中可能需要一个列表数据( List )类型来处理这种情况。以下是这个 ActionForm 的部分代码:

public class ModifyBatchContactForm extends ActionForm

{

private List contact =new AutoArrayList (Contact.class);

…..

}

在以上代码中,我们同样处理了 List 类型数据的初始化。 Struts 在给 List 中的对象赋值时,当然需要先获取 List 数据,然后在获取 List 中某一个对象(通过 Index ),最后给对象赋值。在这里想我们可以更详细点分析浏览器端传过来数据,字段值形式如下: contact[0].email=linux_china@hotmail.com , Struts 获取 ActionForm 中的 List 数据后,通过 Index (此时为 0 )来获取 List 中封装的 JavaBean 对象,然而此时 List 是空的(尽管初始化了,但是没有数据),是无法取得封装的对象的,因此我们要在 Struts 获取 List 中封装的对象的时候给它创建一个,这样就保证对象的获取和赋值的成功进行,所有我们新建一个 AutoArrayList 类,继承 ArrayList ,只要重写 get(int index) 方法即可,其实很简单,代码如下:

public class AutoArrayList extends ArrayList {

private Class itemClass;

public AutoArrayList(Class itemClass) {

this.itemClass = itemClass;

}

public Object get(int index) {

try {

while (index >= size()) {

add( itemClass.newInstance());

}

} catch (Exception e) {

e.printStackTrace();

}

return super.get(index);

}

}

这样我们就完成可以多行数据提交的 ActionForm 设计,这里还有点提醒,如果从浏览器端传过来的行索引是跳跃是的,如缺少中间行,而你不想要这些数据的话,且首尾行 index 相差很大的话,这种方式可能不太适合。这种多行提交形式比较适合对固定行的数据处理。如果行数不固定的话,你可以参考使用 MapForm 方式实现。

下面我们就看看如何在 Jsp 中使用这个 ActionForm ,其实只需要执行一个循环即可:

<logic:iterate id=" contact " name=" FormName " property=" contact " indexId="index">

<html:text name=" contact " property="userId" indexed="true" />

<html:text name=" contact " property="email" indexed="true"/>

</logic:iterate>

这里我们再讲解一下,代码中出现的“ contact ”(红色)都是 ActionForm 中的 List 数据类型变量名称,请确保一致,请不要更改名称,这也是方便提交到后台的数据接收。“ FormName ”为在 struts-config 中声明的 ActionForm 名称。 indexed="true" 可以确保生成的 html 元素的名称唯一,不要缺少这个声明。以上的 Jsp 代码,你也可以使用 JSTL 来完成,就看你习惯如何了。

通过以上步骤,我们完成了多行数据的提交所有环节,这样 Struts 就会完成其他所有的事情,我们的代码逻辑和实现也简单多了。

总结:通过以上两个例子,相以信对 ActionForm 中使用 JavaBean 和 List 类型数据不会再陌生,同时使用 Map 类型,这样可创建更好的 ActionForm 设计,关于 MapForm ,请参考 http://www.jetmaven.net/documents/j_mapformInStruts.php 。不过引入这种方式后,在 Validator 方面你可能要花点脑筋啦(如通过 XDoclet 生成 Validator 文件可能功能不全),可能你需要手写一些代码来完成相关工作。

时间: 2024-12-03 18:39:57

在Struts中使用JavaBean和List(多行数据)类型属性的相关文章

scala-spark中怎么将读取某几行数据合并成一行啊? 新手 谢谢 !

问题描述 spark中怎么将读取某几行数据合并成一行啊? 新手 谢谢 ! 例如图片里说的 谢谢啦 数据是读取的外部csv文件 麻烦啦 求大神指教一下 解决方案 sehll脚本将几行输出合并成一行显示 解决方案二: http://bbs.csdn.net/topics/391872110

简化繁琐的赋值——反射在Jdbc和Struts中的应用

缘起在Jdbc应用中,我们经常需要有这么样的一个Javabean:当我们从数据库里取值时,我们希望把对应的值赋给Javabean,而后再操作Javabean进行各种业务处理:而我们保存数据的时候,也希望把经过业务处理后的值赋给Javabean,再由该Javabean与Jdbc交互,将数据保存在数据库里. 而在Struts应用中,我们经常要跟ActionForm或DynaActionForm打交道,例如从业面取得用户输入的数据,在Struts应用中,我们实际上是从ActionForm中取得数据:而

jsp中使用javabean实例

  这篇文章主要介绍了jsp中使用javabean的实例,同时介绍了相关属性,需要的朋友可以参考下 test.jsp中的代码如下所示 代码如下: 消息: :表示定义一个java bean的实例,实例的名称是test,类的名称是SimleBean. :表示设置实例test的属性name,其值是"Hello JSP". :表示设置实例test的属性message,其值是"fuck JSP". :表示在页面中输出实例test的属性name的值. :示在页面中输出实例tes

JSP学习笔记(五)-----JSP中使用JavaBean

js|笔记 1. 该实例主要告诉我们怎么样在JSP代码中调用JavaBean构件2. 使用JavaBean的优点是简化了JSP代码,界面代码和逻辑代码互相分离,便于程序员查看和调试3. 该实例需要五个文件:login.jsp,test.jsp, userbean.class4. 首先看一下login.jsp <html><center><form method=post action="http://127.0.0.1:8000/test.jsp">

Struts中的Action类的工作机制

Struts中的Action类的工作机制  所有的Action类都是org.apache.struts.action.Action的子类.Action子类应该覆写父类的execute()方法.当ActionForm Bean被创建,并且表单验证顺利通过后,Struts框架就会调用Action类的execute()方法.execute()方法的定义如下:    public ActionForward execute(ActionMapping mapping                   

在struts中使用国际化(i18n)

在struts中使用国际化(i18n)    i18n可以满足对系统的国际化,它的原理就是将页面上的所有标志都放到一个消息资源文件中,不同的语言要提供不同的消息资源文件,当用户登录系统是,系统就是根据你登录的语言,选择不同的消息资源文件显示出来,这样你就可以看到不同的效果了.    一.配置文件的设置    其实i18n的使用还是比较简单的,首先你要在struts-config.xml配置文件中配置消息资源文件的路径,如下所示:----------------------------------

使用Acegi保护Java应用程序,第5部分: 保护JSF应用程序中的JavaBean

JSF 应用程序中使用的 bean 的可配置安全性 这个 系列 由五部分组成,介绍了 Acegi Security System,并演示了如何 使用 Acegi 保护企业级 Java 应用程序.本文是该系列的最后一部分,将继续 讨论使用 Acegi 保护 JSF 应用程序.在 第 4 部分 中,我介绍了如何在不编 写 Java 代码的情况下使用 Acegi 保护 JSF 页面.我还详细说明了部署 JSF- Acegi 应用程序和用户访问该程序时发生的事件.在本部分中,我将着重介绍在 JSF 应用

Struts中关于用户权限限定的建议

关于web系统的权限限定问题,可能有很多的办法,我在这里说一下自己的一些小技巧,起到抛砖引玉的作用,忘各位指正: 系统中一个角色包含多个用户,角色和用户之间最好采用一对多,以免发生混乱: 自系统初起的时候,系统只有一个超级用户(例如root),有两个默认角色,即游客角色和注册用户角色: 超级用户可以在后续管理中添加角色,默认角色不能删除,其他角色的删除中如果这个角色下有用户,可以采取不允许删除或删除后这些用户的角色自动转为注册用户角色: 每个角色用户访问系统某些功能模块的权利,某个角色是否可以访

Struts从零开始五、Struts中验证数据实例

一.Struts的ActionForm的表单验证 ActionForm类用于在视图层和控制层之间传递HTML表单数据.控制层可以从ActionForm Bean中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm Bean中,然后把数据返回给视图.即ActionForm Bean从HTML表单中获取用户输入的数据并将传递给Action类,也可以把从业务层返回的数据用来填充ActionForm Bean,然后JSP页面用它来为HTML表单提供各种输出字段的数据.此外,Act