- 浏览: 534182 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
rgqancy:
终于明白为啥XML里要带jdbcType=XXXX了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
rzh0001:
Thanks a lot
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
guji528:
学习了,谢谢
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
AKka:
彻底清楚这个错误的原因了。向楼主学习了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
远去的渡口:
武汉小吃,我最爱热干面和鸭脖,想念啊~~
过年时候还学习编程, ...
过年的心情
转载自:隔叶黄鹂
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
配置
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
- "http://struts.apache.org/dtds/struts-config_1_3.dtd">
- < struts-config >
- < form-beans >
- < form-bean name = "accountStockForm"
- type = "com.unmi.form.AccountStockForm" />
- </ form-beans >
- < action-mappings >
- < action path = "/showStock" name = "accountStockForm"
- type = "com.unmi.action.AccountStockAction" scope = "request" >
- < forward name = "show" path = "/show.jsp" />
- </ action >
- </ action-mappings >
- </ struts-config >
二
: 输入页面 input.jsp
, 注意表单域命名
- < html:form action = "/showStock" >
- < h3 > 记录持有的股票 < br > </ h3 >
- < fieldset > s < legend > 基本信息 </ legend >
- < table width = "100%" border = 0 > < tr >
- < td > 帐户名: < html:text property = "account.name" /> </ td >
- < td > 资金帐号: < html:text property = "account.number" /> </ td >
- </ tr > </ table >
- </ fieldset >
- < br >
- < fieldset > < legend > 持有股票 </ legend >
- < table width = 100 % border = 0 id = "stockTable" >
- < tr >
- < td > < input type = "checkbox" onclick = "checkAll(this)" > </ td >
- < td > 股票代码 </ td >
- < td > 股票名称 </ td >
- < td > 成本价 </ td >
- < td > 股票数量 </ td >
- </ tr >
- < tr >
- < td > < input type = "checkbox" name = "check" > </ td >
- < td > < input name = "stocks[0].code" size = "15" > </ td >
- < td > < input name = "stocks[0].name" size = "15" > </ td >
- < td > < input name = "stocks[0].price" size = "15" > </ td >
- < td > < input name = "stocks[0].quantity" size = "15" > </ td >
- </ tr >
- </ table >
- </ html:form >
例如输入框名 account.name 提交后能设置到 accountStockForm 的account的name属性
输入框名为 stocks[0].code 提交后会设置到 accountStockForm 的 List stocks的第一个元素的code属性.以此类推
在提交表单前要重排行层的索引,从 0 起, 否则到后右的 Form 会一些空数据.
三: AccountStockForm
的关键代码
- private Account account = new Account();
- private List stocks = new AutoArrayList(Stock. class );
- public void setStocks(List stocks)
- {
- this .stocks.clear();
- this .stocks.addAll(stocks);
- }
定
义了两个属性,分别是一个bean(Account,接受基本信息)和一个List(stocks,接受股票行信息),注意这两个属性必须初始化,不然在
表单提交后会出现空指针错误. setStocks方法是让stocks属性永远保有持是一个 AutoArrayList 实例.
这样在表单提交后设置值是总能调用 AutoArrayList 的 get(int index) 方法.
四
: 自定义的 AutoArrayList
- 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);
- }
- }
理
解为什么要继承一个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
中可以打印出提交的数据
- AccountStockForm asForm = (AccountStockForm)form;
- Account account = asForm.getAccount();
- System.out.println("Account Name:" +account.getName()+
- " Number:" +account.getNumber());
- List stocks = asForm.getStocks();
- for ( int i= 0 ; i<stocks.size() ;i++)
- {
- Stock stock = (Stock)stocks.get(i);
- System.out.println("Stock[" +i+ "]Code:" +stock.getCode()+
- " Name:" +stock.getName()+
- " Price:" +stock.getPrice()+
- " Quantity:" +stock.getQuantity());
- }
- return mapping.findForward( "show" );
在Action中就能直接取用提交来的数据了,不需要 getParameterValues()了.
六
: 最后一步, 对于这样的 ActionForm 我们应该如何显示出来呢,我们用了 nested 标签 (show.jsp
)
- < html:form action = "/showStock" >
- < h3 > 修改持有的股票 < br > </ h3 >
- < fieldset > < legend > 基本信息 </ legend >
- < table width = "100%" border = 0 > < tr >
- < nested:nest property = "account" >
- < td > 帐户名: < nested:text property = "name" readonly = "true" /> </ td >
- < td > 资金帐号: < nested:text property = "number" readonly = "true" /> </ td >
- </ nested:nest >
- </ tr > </ table >
- </ fieldset >
- < br >
- < fieldset > < legend > 持有股票 </ legend >
- < table width = 100 % border = 0 id = "stockTable" >
- < tr >
- < td > < input type = "checkbox" onclick = "checkAll(this)" > </ td >
- < td > 股票代码 </ td >
- < td > 股票名称 </ td >
- < td > 成本价 </ td >
- < td > 股票数量 </ td >
- </ tr >
- < nested:iterate id = "stock" property = "stocks" >
- < tr >
- < td > < input type = "checkbox" name = "check" > </ td >
- < td > < nested:text property = "code" size = "15" /> </ td >
- < td > < nested:text property = "name" size = "15" /> </ td >
- < td > < nested:text property = "price" size = "15" /> </ td >
- < td > < nested:text property = "quantity" size = "15" /> </ td >
- </ tr >
- </ nested:iterate >
- </ table >
- </ 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 的运行时具体类型不变
发表评论
-
四位计算机的原理及其实现
2015-09-05 19:23 942你是否想过,计算机为什么会加减乘除?或者更直接一点,计算机的原 ... -
ubuntu13.04安装mysql5.6RPM包1、使用的安装包MySQL-5.6.12-2.l
2014-11-20 23:08 1032ubuntu13.04安装mysql5.6 RPM包 1、 ... -
字典树相关代码
2014-08-10 18:21 1012package com.myway.study; i ... -
两有序数组求交集
2014-05-01 00:27 1082package com.myway.study; i ... -
JVM垃圾收集器异同
2014-04-22 09:48 1270VM 垃圾收集器有3类,这里主要介绍我们常用的 并行和并发收集 ... -
idea 11 如何实现热部署
2014-02-17 13:37 1045idea 如何配置 热部署呢? 如图: 然后配置 t ... -
java位操作符总结
2013-08-04 20:42 938二进制负数以它正值的 ... -
快速排序简要算法
2013-07-21 22:21 1113package math; import jav ... -
memcached安装
2013-03-10 09:32 4864今天 ,心血来潮 想安装下memcached 先给自己测试一下 ... -
温习温习 aop的原理
2013-02-11 22:23 1449在我工作这几年里,spring aop 用得最多的有两点 1 ... -
URL编码以及GET和POST提交乱码解决方案
2012-09-14 16:59 16981. 什么是URL编码。 ... -
Struts2 IF 判断 SESSION值
2012-08-16 15:12 1212<s:if test="ticke ... -
@me 如何处理
2012-07-28 22:37 1170红薯 分享了这个代码 ,我觉得很好 在这个社区与大家分享 。 ... -
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
2012-07-27 22:59 161813前天遇到一个问题 异常显示如下: 引用 Exception i ... -
猜测 javaye的分页设计
2012-07-05 21:32 1152非常喜欢javaeye的分页 ,自己也写了一个 按照逻辑测试了 ... -
java控制事务级别
2012-06-18 20:40 1172JDBC事务并发产生的问题和事务隔离级别 原子操作使用事务,一 ... -
ibatis / mybatis 存储过程调用 区别 以及例子
2012-06-11 21:16 1596ibatis: 如下: xml配置文件: 请看 ... -
java timerTask timer分析
2012-06-07 20:37 1571首先看一看 timer timerTask如何调用 ? ... -
MapWrapper 学习
2012-01-04 16:25 1583MetaObject 有一个 setValue方法 这个方 ... -
mybatis 学习
2011-12-24 22:59 2458这篇博客是我学习mybatis的心得。也是对自己的鞭策。 这些 ...
相关推荐
这个过程涉及到如何将客户端的数据组织成一个集合,如List,并将其绑定到ActionForm的属性上。在本篇中,我们将详细探讨如何实现这一目标。 首先,ActionForm是Struts框架中用于接收和验证用户输入的数据的类。它...
这个Bean应该包含一个List属性,例如`List<Product>`,其中Product是另一个Bean,包含了商品的各个属性。在表单提交后,Struts的默认数据绑定机制会尝试将请求参数自动绑定到ActionForm的属性上。 接着,Action类会...
在ActionForm或Action类中,我们定义一个List变量,并且List的元素类型为Map。例如: ```java private List, String>> productList; // 相应的getter和setter方法 public List, String>> getProductList() { ...
例如,我们可以定义一个FileItem类,它包含了文件名、文件内容等信息,并在ActionForm中创建一个List类型的属性,如`private List<FileItem> files;` 在HTML页面中,我们使用Struts1的表单标签库来创建文件上传的...
这个类包含了两个主要属性:`username`用于存储用户的名称,而`list`则是一个`List`类型的集合,用于存储用户上传的所有文件。 ```java public class UpfileForm extends ActionForm { private String username; ...
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { YourForm yourForm = (YourForm) form; String ...
这里,`${form.options}`引用了ActionForm中的List,`var="option"`定义了循环变量,`value="${option}"`和`${option}`分别表示选项的值和文本。 另外,对于多选下拉框,可以使用`html:multibox`标签,它的用法与`...
public void setUserList(List<User> userList) { this.userList = userList; } } ``` 3. **填充集合数据**:在 `SampleAction.java` 中,通过查询数据库来填充 `userList`: ```java public ActionForward ...
public ActionForward addCall(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ServletContext context = this.getServlet().getServletContext(); //...
通过`list`属性,可以将选项数据源绑定到ActionForm的属性,从而动态生成选项列表。 在实际应用中,`StrutsMapActionForm`可能是ActionForm的一个实例,它包含了一个或者多个Map对象来存储这些HTML标签的值。例如,...
以下是一个简单的`upload`方法实现,它接收`ActionForm`并从中获取`List<FormFile>`,然后将文件保存到服务器指定的路径: ```java public ActionForward upload(ActionMapping mapping, ActionForm form, ...
List<PageBean> list = new ArrayList(); newgetResouce newgetresouce = new newgetResouce(); //通过显示页面传递一个pagetype对象和PaginationBean对象 Page page = new Page(request.getParameter(...
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { GoodsDAO dao = new GoodsDAO(); List list = dao.find...
3. **JSP 页面**:包括登录界面(如`login.jsp`)、邮件列表展示页面(如`mailList.jsp`)和邮件详情页面(如`mailDetail.jsp`)。这些页面通过Struts标签库(例如`<html:form>`、`<logic:iterate>`等)与ActionForm...
ActionForm类是Struts框架中用于封装表单数据的对象,它继承自`ActionForm`基类。在本例中,`LoginForm`用于封装登录表单的数据,包含用户名和密码字段。通过getter和setter方法提供访问和修改属性值的能力。 ```...
`<logic:present>`用来检查ActionForm中的某个属性是否存在或非空,如果`sampleForm`的`userList`属性有值,那么包含它的内容才会被渲染。而`<logic:iterate>`则用于遍历集合属性,如`userList`,对于每个元素(在...
java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确?...
在Struts配置文件(struts-config.xml)中,你需要添加一个定制的`ActionForm`类,该类扩展了`org.apache.struts.action.ActionForm`,并包含用于存储上传文件的属性。 例如,一个简单的`ActionForm`类可能如下所示...