`
小牛犊
  • 浏览: 97009 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Struts 1.x中批量封装对象

阅读更多

http://www.blogjava.net/max/archive/2006/12/08/86439.html

 

应用场景

本文使用《转》中的最后一个例子作为应用场景,即是批量发布产品信息。页面输出如下图所示:

图1 发布产品
图1 发布产品

图2 查看产品
图2 查看产品

具体实现

首先创建代表产品的类tipsAndTricks.Product,代码如下:

package tipsAndTricks;

import java.sql.Date;

public class Product {
   
private String name;
   
private double price;
   
private Date dateOfProduction;
   
   
public Date getDateOfProduction() {
       
return dateOfProduction;
   }

   
   
public void setDateOfProduction(Date dateOfProduction) {
       
this .dateOfProduction = dateOfProduction;
   }

   
   
public String getName() {
       
return name;
   }

   
   
public void setName(String name) {
       
this .name = name;
   }

   
   
public double getPrice() {
       
return price;
   }

   
   
public void setPrice( double price) {
       
this .price = price;
   }
   
}

与《转》例中的Product不同的是,本例子中的dateOfProduction属性使用了java.sql.Date,而不是java.util.Date。这是因为Struts 1.x不支持请求参数到java.util.Date的转换,归根到底是由于org.apache.commons.beanutils.ConvertUtilsBean.convert()不支持关于java.util.Date的转换。另外,值得注意的是common-beanutils是通过java.sql.Date.valueOf()方法工作的,所以在页面输入的字符串的格式必须为“yyyy-MM-dd”。

实现上述功能大概有三种方法,下面我会分别对这三种方法进行详细的讲述。

方法一、动态表单(Dynamic Actoin Form)+ 数组

首先,让我们来看一下Struts的配置文件WEB-INF/struts-config.xml,内容如下:

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" >

< struts-config >
   
< data-sources />
   
< form-beans >
       
< form-bean name ="dynaProductsForm"
            type
="org.apache.struts.action.DynaActionForm" >
           
< form-property name ="products"
                type
="tipsAndTricks.Product[]" size ="3" />
       
</ form-bean >

   
</ form-beans >

   
< global-exceptions />
   
< global-forwards />
   
< action-mappings >
       
< action attribute ="dynaProductsForm" input ="/addProducts.jsp"
            name
="dynaProductsForm" path ="/batchWrappingWithArray"
            scope
="request" type ="tipsAndTricks.BatchWrappingWithArrayAction"
            validate
="false" >
           
< forward name ="success" path ="/viewProducts.jsp" />
       
</ action >

   
</ action-mappings >

   
< message-resources parameter ="tipsAndTricks.ApplicationResources" />
</ struts-config >

我想这些配置应该用不着怎么解释了,有Struts 1.x验证的朋友对此都不会陌生。因此,接下来创建/addProducts.jsp文件,代码如下:

<% @ page language = " java " pageEncoding = " utf-8 " %>

<% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %>
<% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< title > Add Products </ title >
</ head >
< body >
< html:form action ="/batchWrappingWithArray" method ="post" >
   
< table border ="0" >
       
< tr style ="background-color:powderblue; font-weight:bold;" >
           
< td > Product Name </ td >
           
< td > Price </ td >
           
< td > Date of production </ td >
       
</ tr >
       
< c:forEach var ="products" items ="${dynaProductsForm.map.products}" >
           
< tr >
               
< td >< html:text indexed ="true" name ="products" property ="name" /></ td >
               
< td >< html:text indexed ="true" name ="products" property ="price" /></ td >
               
< td >< html:text indexed ="true" name ="products" property ="dateOfProduction" /></ td >
           
</ tr >
       
</ c:forEach >
       
< tr >
           
< td colspan ="3" >< html:submit /></ td >
       
</ tr >
   
</ table >
</ html:form >
</ body >
</ html >

例中,我使用了JSTL 1.1,如果大家还没有尝试过使用JSP 2.0的JSTL和EL,建议大家去看看相关文章。上面的<c:forEach />的作用是到dynaProductsForm的map属性中取出products数组,并对其进行遍历,再依靠<html:text />标志将products的元素的属性以输入框的形式输出。<html:text />标志的属性indexed="true"则表示在输出HTML时,将<input>的命名为类似products[0].name的名字。

然后,再创建/viewProducts.jsp页面,内容如下:

<% @ page language = " java " pageEncoding = " utf-8 " %>

<% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< title > View Products </ title >
</ head >
< body >
< table border ="0" >
   
< tr style ="background-color:powderblue; font-weight:bold;" >
       
< td > Product Name </ td >
       
< td > Price </ td >
       
< td > Date of production </ td >
   
</ tr >
   
< c:forEach var ="product" items ="${products}" >
       
< tr >
           
< td > ${product.name} </ td >
           
< td > ${product.price} </ td >
           
< td > ${product.dateOfProduction} </ td >
       
</ tr >
   
</ c:forEach >
</ table >
</ body >
</ html >

我想这份也不多作说明。不过大家可以通过上述代码看出使用JSTL + EL的确比Struts 1.x的logic + bean要方便和简洁。不仅如此,EL还支持一定的运算符和函数操作。

最后是建立Action文件tipsAndTricks.BatchWrappingWithArrayAction,代码如下:

package tipsAndTricks;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

public class BatchWrappingWithArrayAction extends Action {
   
public ActionForward execute(ActionMapping mapping, ActionForm form,
                 HttpServletRequest request, HttpServletResponse response)
{
           DynaActionForm dynaProductsForm
= (DynaActionForm) form;
           request.setAttribute(
" products " , dynaProductsForm.get( " products " ));
       
return mapping.findForward( " success " );
   }

}

此Action将动态表单传过来的products数组放到request中,转到/viewProducts.jsp。发布运行应用程序,在浏览器的地址栏中输入:http://localhost:8080/Struts1_Batch/addProducts.jsp。效果请参考如图1、图2。

在/addProducts.jsp的“Date of production”必须以(yyyy-MM-dd)的形式正确填写,且不能为空。

方法二、表单(Actoin Form)+ 列表(List)

方法一虽然简单,但是有一个明显的缺点——数组的长度已经固定,故我们不能在运行时通过程序设置对象数量。下面将要介绍的方法可以很好地解决这个问题。

首先,我们要创建类tipsAndTricks.AutoInitArrayList,代码如下:

package tipsAndTricks;

import java.util.ArrayList;

public class AutoInitArrayList < T > extends ArrayList < T > {
   
private static final long serialVersionUID = 1L
   
   
private Class < T > t = null ;
   
   
public AutoInitArrayList(Class < T > t) {
       
this .t = t;
   }

   
   @Override
   
public T get( int index) {
       
try {
           
while (index >= size()) {
               add(t.newInstance());
           }

       }
catch (Exception e) {
           e.printStackTrace();
       }

       
return super .get(index);
   }
   
}

AutoInitArrayList继承ArrayList并重载get()方法,作用就是在Struts 1.x框架调用这个方法时,如果index超出列表大小,则会实例化新项放到列表中,避免出现(IndexOutOfBoundsException)异常。

接着,让我们看Struts的配置,内容如下:

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" >

< struts-config >
   
< data-sources />
   
< form-beans >
       
< form-bean name ="dynaProductsForm"
            type
="org.apache.struts.action.DynaActionForm" >
           
< form-property name ="products"
                type
="tipsAndTricks.Product[]" size ="3" />
       
</ form-bean >
       
< form-bean name ="normalProductsForm"
            type
="tipsAndTricks.NormalProductsForm" />

   
</ form-beans >

   
< global-exceptions />
   
< global-forwards />
   
< action-mappings >
       
< action attribute ="dynaProductsForm" input ="/addProducts.jsp"
            name
="dynaProductsForm" path ="/batchWrappingWithArray"
            scope
="request" type ="tipsAndTricks.BatchWrappingWithArrayAction"
            validate
="false" >
分享到:
评论

相关推荐

    对struts1.x与struts2.x的区别的总结

    - **Struts2.x** 配置文件较少,主要为struts.xml,支持注解配置,减少XML配置的繁琐。 8. **插件与扩展性**: - **Struts1.x** 插件较少,扩展性相对较弱。 - **Struts2.x** 有丰富的插件系统,如Ajax、...

    Struts1.x常用的开发包,需要学习struts1.x朋友可以下载

    2. **Action类**:在Struts1.x中,每个HTTP请求都会映射到一个特定的Action类实例。Action类是Controller的实现,它处理用户请求,执行相应的业务逻辑,并返回一个表示结果的ActionForward对象。 3. **配置文件**:...

    struts1.x和struts2.x区别

    在Struts1.x中,Action是核心组件之一,它必须继承自org.apache.struts.action.Action类,并且需要覆盖execute方法。Action对象由框架创建和管理,每一个HTTP请求都对应一个Action实例。然而,在Struts2.x中,Action...

    struts1.x技术课程讲解.pdf

    1. **Action**:Struts1.x 中的 Action 类负责处理用户请求,执行业务逻辑,并返回一个 ActionForward 对象来控制页面流转。 - **DispatchAction**:一种特殊的 Action 类,可以将不同的 actionName 分派到不同的...

    Struts1.x系列教程(网摘-全)

    在Struts1.x中,Model代表业务逻辑,View负责数据展示,Controller处理用户请求并协调Model和View。 2. **Action类**:每个HTTP请求都对应一个Action类,这是Struts1.x的核心组件。Action类处理用户请求,执行相应...

    java Struts 1.x 框架 Web 开发

    2. **Action类**:在Struts 1.x中,Action 类是处理用户请求的核心组件。每个Action对应一个特定的用户动作,它接收HTTP请求,执行相应的业务逻辑,并通过ActionForward指定视图(JSP页面)进行响应。 3. **配置...

    Struts1.x_Project.zip

    在Struts1.x中,实现I18N(Internationalization)主要是通过资源文件(如*.properties)来管理不同语言的文本。这些文件按照语言和地区进行组织,例如,`message_en.properties`用于英文,`message_zh_...

    Struts1.x的登录示例

    在Struts1.x中,ActionServlet作为控制器,ActionForm对象作为模型和控制器之间的数据载体,而JSP页面作为视图。 2. **配置文件**: - **struts-config.xml**:这是Struts1.x的核心配置文件,定义了ActionMapping...

    struts1.x入门教程

    - Action是Struts1.x中处理用户请求的类。在这个例子中,我们创建一个LoginAction,它同样继承自Action基类。在execute方法中,我们检查用户名是否为"struts",如果是,则返回"loginSuccess",否则返回"login...

    struts1.x apps 所有最新的Struts1.x项目应用

    1. **安装和配置**:了解如何在项目中集成Struts1.x框架,配置web.xml和struts-config.xml文件。 2. **Action和ActionForm**:深入理解这两者的作用,如何编写和使用它们。 3. **视图渲染**:熟悉JSP页面和Struts...

    struts1.x 最简洁国际化 源代码

    Struts1.x是一个经典的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在国际化(i18n)方面,Struts1提供了强大的支持,使得应用程序可以适应不同语言和地区的用户需求。以下是关于Struts1.x国际化...

    搭建struts1.x的jar包

    在Struts 1.x中,如果需要在表单中处理文件上传,这个库是必不可少的。 搭建Struts 1.x环境的步骤通常包括以下几点: 1. 将这些jar包添加到你的项目类路径中。 2. 创建`struts-config.xml`配置文件,定义Action、...

    魔乐科技Struts2.x框架笔记

    **内置对象的获取**:Struts2.x中通过`ServletActionContext`对象来获取HTTP请求和响应等内置对象,这与Struts1.x中的做法有所不同。 **国际化资源文件**:为了支持多语言环境,可以通过在`struts.properties`文件...

    Struts1.x 中文帮助文档

    10. **Session和Request范围的对象管理**:Struts1.x提供了一种机制来管理请求和会话范围内的对象,避免在JSP页面中直接操作这些对象,保持代码的整洁。 学习Struts1.x时,你需要熟悉上述概念并掌握它们之间的交互...

    Struts 2.x权威指南(第3版)

    Struts 2.x权威指南(第3版)

    struts1.x多文件上传

    在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`&lt;input type="file"&gt;`字段,允许用户选择多个文件。每个文件输入字段应设置不同的name属性...

    freemarker for struts 1.x

    freemarker与struts 1.x 结合,生成html 在http://blog.csdn.net/chen1255 的web中有详细描述关于freemarker与struts1.x的结合

    Struts1.x_action

    1. **ActionForm**:在Struts1.x中,ActionForm是用于封装HTTP请求参数的类,它对应于视图层的表单数据。ActionForm实例化后,其属性会通过Struts的默认数据绑定机制从请求参数填充,便于Action类进行处理。 2. **...

    Struts1.x-Jdbc,学习Struts1.的曾删改查

    在Struts1.x中,JDBC(Java Database Connectivity)是常用于与数据库交互的技术,它允许开发者通过Java代码来执行SQL语句,实现数据的增删改查操作。下面将详细探讨Struts1.x框架结合JDBC进行数据库操作的知识点。 ...

Global site tag (gtag.js) - Google Analytics