- 浏览: 124295 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
zczjdyj123:
大神啊,我在tomcat定是任务里面抓取新闻,这种方式实现不了 ...
httpclient 中文乱码的解决方案 -
zczjdyj123:
str=new String(str.getBytes(),& ...
httpclient 中文乱码的解决方案 -
Ralfc:
http://tomcat.apache.org/connec ...
apache与 tomcat 集群配置与session共享 -
lengyueheiying:
我注册登录就是为了感谢你,你帮我解决了我2天没有搞定的问题谢谢 ...
httpclient 中文乱码的解决方案 -
litxuf:
------------------ 可恶的64k 2w汉字 ...
DSA签名在java与.net平台的互联互通问题
WEB 应用中一般都会处理主从表的信息, 或者称之为头层与行层的一对多的关系数据,如订单头/订单明细. 对于这种关系数据提交到后台的 Struts 的 ActionForm 的话, 这个 ActionForm 就要好好的设计一下, 不然会给自已带来许多额外的代码. 比如有的人的处理方法就是把页面提交到后台的毫无关系的散装数据非常吃力的拼凑一对多的关系对象出来.
下面举一个如今非常现实的关于股票的例子, 简单的应用场景是: 记录某个帐户所持有的股票信息,提交到后台,然后显示出来. 输入页面如下图
帐户信息包括帐户名和资金帐号;持有股票的每一行信息包括股票代码, 股票名称, 成本价, 股票数量. 股票行可以动态增删.

输入页面 input.jsp

后台处理类图
为了简化不必要的代码, 我们要实现的终及目标是: 在输入页面上点击 "保存数据" 按钮, 由 Struts 的 RequestProcessor.processPopulate() 方法把页面提交的基本信息组装到 AccountStockForm 的 account 的对应属性中,股票行信息对应生成一个 Stock 实例加到 AccountStockForm的 List 属性 stocks 中, 后续在 AccountStockAction 中直接处理account和stocks属性就非常简单了. AccountStockForm在这里只作为一个壳.
下面从前台到后台说明关键性的代码, 完整的 MyEclipse 工程包可以点击 TestStruts135.zip下载到.
一: struts-config.xml 配置
01.
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
02.
<!DOCTYPE struts-config PUBLIC
03.
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
05.
<
struts-config
>
06.
<
form-beans
>
07.
<
form-bean
name
=
"accountStockForm"
08.
type
=
"com.unmi.form.AccountStockForm"
/>
09.
</
form-beans
>
10.
<
action-mappings
>
11.
<
action
path
=
"/showStock"
name
=
"accountStockForm"
12.
type
=
"com.unmi.action.AccountStockAction"
scope
=
"request"
>
13.
<
forward
name
=
"show"
path
=
"/show.jsp"
/>
14.
</
action
>
15.
</
action-mappings
>
16.
</
struts-config
>
二: 输入页面 input.jsp, 注意表单域命名
01.
<
html:form
action
=
"/showStock"
>
02.
<
h3
>记录持有的股票<
br
></
h3
>
03.
<
fieldset
>s<
legend
>基本信息</
legend
>
04.
<
table
width
=
"100%"
border
=
0
><
tr
>
05.
<
td
>帐户名:<
html:text
property
=
"account.name"
/></
td
>
06.
<
td
>资金帐号:<
html:text
property
=
"account.number"
/></
td
>
07.
</
tr
></
table
>
08.
</
fieldset
>
09.
<
br
>
10.
<
fieldset
><
legend
>持有股票</
legend
>
11.
<
table
width
=
100
%
border
=
0
id
=
"stockTable"
>
12.
<
tr
>
13.
<
td
><
input
type
=
"checkbox"
onclick
=
"checkAll(this)"
></
td
>
14.
<
td
>股票代码</
td
>
15.
<
td
>股票名称</
td
>
16.
<
td
>成本价</
td
>
17.
<
td
>股票数量</
td
>
18.
</
tr
>
19.
<
tr
>
20.
<
td
><
input
type
=
"checkbox"
name
=
"check"
></
td
>
21.
<
td
><
input
name
=
"stocks[0].code"
size
=
"15"
></
td
>
22.
<
td
><
input
name
=
"stocks[0].name"
size
=
"15"
></
td
>
23.
<
td
><
input
name
=
"stocks[0].price"
size
=
"15"
></
td
>
24.
<
td
><
input
name
=
"stocks[0].quantity"
size
=
"15"
></
td
>
25.
</
tr
>
26.
</
table
>
27.
</
html:form
>
例如输入框名 account.name 提交后能设置到 accountStockForm 的account的name属性
输入框名为 stocks[0].code 提交后会设置到 accountStockForm 的 List stocks的第一个元素的code属性.以此类推
在提交表单前要重排行层的索引,从 0 起, 否则到后右的 Form 会一些空数据.
三: AccountStockForm 的关键代码
1.
private
Account account =
new
Account();
2.
private
List stocks =
new
AutoArrayList(Stock.
class
);
3.
4.
public
void
setStocks(List stocks)
5.
{
6.
this
.stocks.clear();
7.
this
.stocks.addAll(stocks);
8.
}
定义了两个属性,分别是一个bean(Account,接受基本信息)和一个List(stocks,接受股票行信息),注意这两个属性必须初始化,不然在表单提交后会出现空指针错误. setStocks方法是让stocks属性永远保有持是一个 AutoArrayList 实例. 这样在表单提交后设置值是总能调用 AutoArrayList 的 get(int index) 方法.
四: 自定义的 AutoArrayList
01.
public
class
AutoArrayList
extends
ArrayList {
02.
03.
private
Class itemClass;
04.
05.
public
AutoArrayList(Class itemClass) {
06.
this
.itemClass = itemClass;
07.
}
08.
09.
public
Object get(
int
index) {
10.
try
{
11.
while
(index >= size()) {
12.
add(itemClass.newInstance());
13.
}
14.
}
catch
(Exception e) {
15.
e.printStackTrace();
16.
}
17.
return
super
.get(index);
18.
}
19.
}
理解为什么要继承一个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 中可以打印出提交的数据
01.
AccountStockForm asForm = (AccountStockForm)form;
02.
03.
Account account = asForm.getAccount();
04.
System.out.println(
"Account Name:"
+account.getName()+
05.
" Number:"
+account.getNumber());
06.
07.
List stocks = asForm.getStocks();
08.
for
(
int
i=
0
; i<stocks.size() ;i++)
09.
{
10.
Stock stock = (Stock)stocks.get(i);
11.
System.out.println(
"Stock["
+i+
"]Code:"
+stock.getCode()+
12.
" Name:"
+stock.getName()+
13.
" Price:"
+stock.getPrice()+
14.
" Quantity:"
+stock.getQuantity());
15.
}
16.
17.
return
mapping.findForward(
"show"
);
在Action中就能直接取用提交来的数据了,不需要 getParameterValues()了.
六: 最后一步, 对于这样的 ActionForm 我们应该如何显示出来呢,我们用了 nested 标签 (show.jsp)
01.
<
html:form
action
=
"/showStock"
>
02.
<
h3
>修改持有的股票<
br
></
h3
>
03.
<
fieldset
><
legend
>基本信息</
legend
>
04.
<
table
width
=
"100%"
border
=
0
><
tr
>
05.
<
nested:nest
property
=
"account"
>
06.
<
td
>帐户名:<
nested:text
property
=
"name"
readonly
=
"true"
/></
td
>
07.
<
td
>资金帐号:<
nested:text
property
=
"number"
readonly
=
"true"
/></
td
>
08.
</
nested:nest
>
09.
</
tr
></
table
>
10.
</
fieldset
>
11.
<
br
>
12.
<
fieldset
><
legend
>持有股票</
legend
>
13.
<
table
width
=
100
%
border
=
0
id
=
"stockTable"
>
14.
<
tr
>
15.
<
td
><
input
type
=
"checkbox"
onclick
=
"checkAll(this)"
></
td
>
16.
<
td
>股票代码</
td
>
17.
<
td
>股票名称</
td
>
18.
<
td
>成本价</
td
>
19.
<
td
>股票数量</
td
>
20.
</
tr
>
21.
<
nested:iterate
id
=
"stock"
property
=
"stocks"
>
22.
<
tr
>
23.
<
td
><
input
type
=
"checkbox"
name
=
"check"
></
td
>
24.
<
td
><
nested:text
property
=
"code"
size
=
"15"
/></
td
>
25.
<
td
><
nested:text
property
=
"name"
size
=
"15"
/></
td
>
26.
<
td
><
nested:text
property
=
"price"
size
=
"15"
/></
td
>
27.
<
td
><
nested:text
property
=
"quantity"
size
=
"15"
/></
td
>
28.
</
tr
>
29.
</
nested:iterate
>
30.
</
table
>
31.
</
html:form
>
可以查看生成的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 的运行时具体类型不变
原帖地址:http://www.blogjava.net/Unmi/articles/124168.html
发表评论
-
tomcat 连接池配置整理 (JNDI C3P0)
2013-02-18 17:54 1658简单的归纳整理一下各种几种连接池的配置方式 以便查询 ... -
(转载)Spring管理iBatis事务
2011-07-25 17:48 1467<sqlMapConfig> ... -
使Maven 2在package、install等阶段跳过运行Test的配置
2011-06-28 18:25 2069方法1:To skip running the tests f ... -
DSA签名在java与.net平台的互联互通问题(2)
2011-06-13 15:49 846//DSA JAVA平台签名转成.net可以认识的 ... -
转】eclipse快捷键 10个最有用的快捷键
2011-04-25 15:27 1534一个Eclipse骨灰级开发者总结了他认为最 ... -
设计模式——单例模式
2010-03-11 17:16 861单例模式的要点:1、某个类只能有一个实例;2、必须自行创建自己 ... -
httpclient 中文乱码的解决方案
2009-08-26 12:00 7644最近写个httpclient post的方法如下 pu ... -
Unicode、UTF-8 和 ISO8859-1到底有什么区别
2009-08-17 14:44 1899Unicode、UTF-8 和 ISO8859-1 ... -
编码简介:ASCII,Unicode,UTF-8,GB2312
2009-08-17 14:25 10151. ASCII码 我们知道,在计算机内部,所有的信息最终都 ... -
Java 异常机制
2009-06-03 10:30 932Java 语言要求 java 程序中(无论是谁写的代码),所有 ... -
JAVA-用HttpClient来模拟浏览器GET,POST
2009-03-03 10:19 2235一般的情况下我们都是使用IE或者Navigator浏览器来访问 ... -
java的移位运算
2009-02-26 13:00 1039一 基本概念 所有的整 ... -
日志操作之 log4J
2009-02-26 12:59 1055在应用程序中输出日志有有三个目的: (1)监视代码中变量的变 ... -
Java正则表达式详解
2009-02-26 12:55 857如果你曾经用过Perl或任何其他内建正则表达式支持的语言 ...
相关推荐
11. `<s:property>`:显示模型数据,可以用来输出ActionForm或Action中的属性值。 三、标签使用示例 以下是一个简单的用户登录表单的示例: ```jsp <%@ taglib prefix="s" uri="/struts-tags" %> 登录页面 ...
- `<html:text>`、`<html:password>`、`<html:textarea>`:分别用于创建文本输入框、密码输入框和多行文本区域,它们会绑定到ActionForm的属性上。 - `<html:submit>`、`<html:image>`:用于创建提交按钮和图像...
Struts标签是Apache Struts框架中的重要组成部分,它提供了一种声明式编程的方式,使得开发者在JSP页面中能够更加方便、简洁地处理业务逻辑和数据展示。这些标签主要用于简化视图层的开发,减少Java代码的使用,提高...
### Struts标签、动态ActionForm、上传组件及Struts验证框架知识点详解 #### 一、Struts标签 **Struts** 是一款基于 **MVC**(Model-View-Controller)设计模式的开源Java Web框架,它能够帮助开发者构建可扩展且...