posts - 73,  comments - 55,  trackbacks - 0
Struts中ActionForm类型对象的javaBean属性何时初使化?
Struts中涉及到多行提交问题时如何处理?
(此方法可以处理多行相同数据的提交,但表单验证就需要在formbean中实现,不能用动态form的方法了)


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

如在注册书籍界面中,我们通常会将书籍的各种信息封装成一个单独的新的Class ,如BookBean ,包含以下属性:书籍编号 (bookId) ,书籍名称(bookName) ,出版社(company) ,作者(author) ,版本(state) 等等,这样条理也比较清晰,以下是这个 ActionForm 的部分代码:
public class RegisterBookForm extends ActionForm { 
        private String currentUsrId; 
        private Date currentDate; 
        private BookBean book = new BookBean();

        ………..
        public BookBean getBook() {
                  return book;
        }
}
其中BookBean为:
public class BookBean {
        private String bookId = null;
        private String bookName = null;
        private String company = null;
        private String author = null;
        private int state;
        public String getBookId() {
                 ........
        }
        public void setBookId(String bookId) {
                 .........
        }
        。。。。
}
在RegisterBookForm中我们需要将BookBean实例化(在reset 函数中需要重新实例化),这主要因为 Struts 的机制:如我们将 HTML 的 Form 元素(如 bookId )值传给 ActionForm ,Struts 需要执行的操作是 getBook().setBookId(String bookId) ,如果这时返回的book 对象为空的话,那么赋值如何进行,而且 Struts 也不会知道如何去实例化BookBean 。有时这些 JavaBean 的类型有可能是接口,实例化更是未知,所以关于 JavaBean 类型在 ActionForm 中的实例化,你需要自行完成,而且必须完成。至于在实际操作中判断 JavaBean 是否被进行过相关操作(不再是初始状态),你需要自行判断,其实也很简单,如可在BooBean 类中编写一个函数检验一下即可。

ActionForm 创建完毕后,我们需要在 Jsp Form 中引用这些 JavaBean 类型的属性值,那就很简单啦,只需采用“ Form 的属性名称”+“ . ”+“ JavaBean 中的属性名称”结构构成的名称付给相关元素即可。如:
<html:text property="book.bookId"/>
通过这种方式我们就可以处理好 ActionForm 中的 JavaBean 类型的属性值了。

实际的情况可能更复杂些,我们有时可能要提交多行数据到后台,而且行内的数据是相关的,如我们需要执行借书操作,要提交的是多本书的信息,这些行内的数据,如bookId ,bookName,company等都是和bookId相关的。这时我们构建的 ActionForm 中可能需要一个列表数据(ArrayList )类型来处理这种情况。以下是这个 ActionForm 的部分代码:
public class BorrowBookForm extends ActionForm {  
           private ArrayList books = new BorrowArrayList (); 
           …..
}

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


/**
 * <strong>BorrowArrayList</strong>
 * <p>书籍借阅时所有书籍列表</p>
 * 
 * @author  RenZW
 * @version 1.0 2005.09.2
 * @since   1.0
 */
public class BorrowArrayList extends ArrayList {
    /*
     * (non-Javadoc)
     *
     * @see java.util.List#get(int)
     */
    public Object get(int index) {
        while (index >= size()) {
            add(new BookBean());
        }
        return super.get(index);
    }
}这样我们就完成可以多行数据提交的 ActionForm 设计,这里还有点提醒,如果从浏览器端传过来的行索引是跳跃是的,如缺少中间行,且首尾行index 相差很大的话,这种方式可能不太适合。这种多行提交形式比较适合对固定行的数据处理。

下面我们就看看如何在 Jsp 中使用这个 ActionForm ,其实只需要执行一个循环即可:
<logic:iterate id="books"  name=" BorrowBookForm"  property="books " indexId="index">
      <html:text name="books" property="bookId" indexed="true" />
      <html:text name="books" property="bookName" indexed="true"/>
      .........
</logic:iterate>

这里我们再分析一下,代码中出现的“books”都是ActionForm 中的ArrayList 数据类型变量名称,请确保一致,这也是方便提交到后台的数据接收。indexed="true" 可以确保生成的 html 元素的名称唯一,不要缺少这个声明

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

posted on 2006-07-11 09:34 保尔任 阅读(411) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜