Java中多属性怎么提交_多行数据提交到Struts的ActionForm的List属性中

今天遇到提交多行数据问题, 在网上找了一点资料:

WEB 应用中一般都会处理主从表的信息, 或者称之为头层与行层的一对多的关系数据,如订单头/订单明细. 对于这种关系数据提交到后台的 Struts 的 ActionForm 的话, 这个 ActionForm 就要好好的设计一下, 不然会给自已带来许多额外的代码. 比如有的人的处理方法就是把页面提交到后台的毫无关系的散装数据非常吃力的拼凑一对多的关系对象出来.

下面举一个如今非常现实的关于股票的例子, 简单的应用场景是: 记录某个帐户所持有的股票信息,提交到后台,然后显示出来. 输入页面如下图

帐户信息包括帐户名和资金帐号;持有股票的每一行信息包括股票代码, 股票名称, 成本价, 股票数量. 股票行可以动态增删.

为了简化不必要的代码, 我们要实现的终及目标是: 在输入页面上点击 “保存数据” 按钮, 由 Struts 的 RequestProcessor.processPopulate() 方法把页面提交的基本信息组装到 AccountStockForm 的 account 的对应属性中,股票行信息对应生成一个 Stock 实例加到 AccountStockForm的 List 属性 stocks 中, 后续在 AccountStockAction 中直接处理account和stocks属性就非常简单了. AccountStockForm在这里只作为一个壳.

下面从前台到后台说明关键性的代码, 完整的 MyEclipse 工程包可以点击 TestStruts135.zip下载到.

一: struts-config.xml 配置

Java代码

struts-config PUBLIC

“-//Apache Software Foundation//DTD Struts Configuration 1.3//EN”

“http://struts.apache.org/dtds/struts-config_1_3.dtd”>

type=“com.unmi.form.AccountStockForm”/>

type=“com.unmi.action.AccountStockAction”scope=“request”>

struts-config PUBLIC

“-//Apache Software Foundation//DTD Struts Configuration 1.3//EN”

“http://struts.apache.org/dtds/struts-config_1_3.dtd”>

type=“com.unmi.form.AccountStockForm”/>

type=“com.unmi.action.AccountStockAction”scope=“request”>

二: 输入页面 input.jsp, 注意表单域命名

Java代码

记录持有的股票

s基本信息
帐户名:资金帐号:
持有股票
股票代码股票名称成本价股票数量

记录持有的股票

s基本信息
帐户名:资金帐号:
持有股票
股票代码股票名称成本价股票数量

例如输入框名 account.name 提交后能设置到 accountStockForm 的account的name属性

输入框名为 stocks[0].code 提交后会设置到 accountStockForm 的 List stocks的第一个元素的code属性.以此类推

在提交表单前要重排行层的索引,从 0 起, 否则到后右的 Form 会一些空数据.

三: AccountStockForm 的关键代码

Java代码

privateAccount account =newAccount();

privateList stocks =newAutoArrayList(Stock.class);

publicvoidsetStocks(List stocks)

{

this.stocks.clear();

this.stocks.addAll(stocks);

}

privateAccount account =newAccount();

privateList stocks =newAutoArrayList(Stock.class);

publicvoidsetStocks(List stocks)

{

this.stocks.clear();

this.stocks.addAll(stocks);

}

定义了两个属性,分别是一个bean(Account,接受基本信息)和一个List(stocks,接受股票行信息),注意这两个属性必须初始化,不然在表单提交后会出现空指针错误. setStocks方法是让stocks属性永远保有持是一个 AutoArrayList 实例. 这样在表单提交后设置值是总能调用 AutoArrayList 的 get(int index) 方法.

四: 自定义的 AutoArrayList

Java代码

publicclassAutoArrayListextendsArrayList {

privateClass itemClass;

publicAutoArrayList(Class itemClass) {

this.itemClass = itemClass;

}

publicObject get(intindex) {

try{

while(index >= size()) {

add(itemClass.newInstance());

}

}catch(Exception e) {

e.printStackTrace();

}

returnsuper.get(index);

}

}

publicclassAutoArrayListextendsArrayList {

privateClass itemClass;

publicAutoArrayList(Class itemClass) {

this.itemClass = itemClass;

}

publicObject get(intindex) {

try{

while(index >= size()) {

add(itemClass.newInstance());

}

} catch(Exception e) {

e.printStackTrace();

}

returnsuper.get(index);

}

}

理解为什么要继承一个ArrayList, 覆写get(int index)方法要简单了解 Struts 处理提交数据的工作原理: 大致如下: 页面提交后, 由 ActionServlet交给RequestProcessor的processPopulate()方法,由processPopulate()方法收集请求数据,放在map中,key为表单域的name属性,如 name, account.name, stocks[0].code. 然后借助于 Common-beanutils 工具包设置到 ActionForm

的相应属性中

如果key是简单的’name’,直接form.setName(map.get(‘name’));

如果key是’account.name’, 执行的操作是 form.getAccount().setName(map.get(‘account.name’);

如果key是’stocks[0].code’, 它可以对应到数据或集合中,如对于数组 form.stocks[0].code=map.get(‘stocks[0].code’); 对于集合((List)form.getStocks()).get(0).setCode(map.get(‘stocks[0].code’))

从上也能理解为什么 form 中的那两个属性必须实始化,不然会出现空指针错. 而且为什么 stocks 要用 AutoArrayList 实例化, 避免出现索引越界的错误.

五: 在 AccountStockAction 中可以打印出提交的数据

Java代码

AccountStockForm asForm = (AccountStockForm)form;

Account account = asForm.getAccount();

System.out.println(“Account Name:”+account.getName()+

” Number:”+account.getNumber());

List stocks = asForm.getStocks();

for(inti=0; i

{

Stock stock = (Stock)stocks.get(i);

System.out.println(“Stock[“+i+“]Code:”+stock.getCode()+

” Name:”+stock.getName()+

” Price:”+stock.getPrice()+

” Quantity:”+stock.getQuantity());

}

returnmapping.findForward(“show”);

AccountStockForm asForm = (AccountStockForm)form;

Account account = asForm.getAccount();

System.out.println(“Account Name:”+account.getName()+

” Number:”+account.getNumber());

List stocks = asForm.getStocks();

for(inti=0; i

{

Stock stock = (Stock)stocks.get(i);

System.out.println(“Stock[“+i+“]Code:”+stock.getCode()+

” Name:”+stock.getName()+

” Price:”+stock.getPrice()+

” Quantity:”+stock.getQuantity());

}

returnmapping.findForward(“show”);

在Action中就能直接取用提交来的数据了,不需要 getParameterValues()了.

六: 最后一步, 对于这样的 ActionForm 我们应该如何显示出来呢,我们用了 nested 标签 (show.jsp)

Java代码

修改持有的股票

基本信息
帐户名:资金帐号:
持有股票
股票代码股票名称成本价股票数量

修改持有的股票

基本信息
帐户名:资金帐号:
持有股票
股票代码股票名称成本价股票数量

可以查看生成的HTML源文件, 你就能更好理解 input.jsp 中的表单域为什么要那么命名了.

小结的内容是请注意以下几个重点:

1. 输入信息的页面 input.jsp 没有使用 Struts 标签,目的是让大家理解,表单域应如何命名才能对应上 ActionForm 中的哪一个属性

2. 显示数据的页面是用的 Struts 标签,并留意 nested 标签的应用. 可以从生成的 HTML 源文件中体会出什么

3. 提交数据前要重新编排行层中输入框 Name 属性的下标植.

4. 回味为什么要引入 ArrayList 的子类 AutoArrayList, 关键在 get(int index) 方法的覆写

5. 最后是 ActionForm 中 List 属性 stocks 的 setter 方法的实现, 保持那个 List 的运行时具体类型不变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值