`
hsyd
  • 浏览: 175496 次
  • 性别: Icon_minigender_1
  • 来自: 淄博
社区版块
存档分类
最新评论

Struts2:类型转换之批量封装Set集合类型的属性

阅读更多
文章出处:http://www.diybl.com/course/3_program/java/javajs/2007927/74827_4.html
本篇主要是讨论如何将页面上表单的值批量封装到一个Set集合中去,因为项目中用的是Hibernate,基本上所有的集合类型用的都是Set类型。至于如何批量封装数据到其它的集合类型如(List,Map)可以参看这篇文章,说的很详细了:http://hi.baidu.com/wava/blog/item/01d58926c42dac158b82a134.html。如何给这个Set属性赋值花费了我相当的时间,下面直接贴例子吧。
CustomerInserterAction.java:处理请求,含有一个Set类型的属性orders
package test.web; 
  
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
  
import test.persistence.Customer; 
import test.persistence.Order; 
import test.service.ICustomerService; 
  
import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ActionContext; 
  
/** 
 * @author zhukai 2007-8-31 
 *  
 */ 
public class CustomerInserterAction extends ActionSupport { 
    private Customer customer; 
  
    private Set<Order> orders=new HashSet(); 
  
    private ICustomerService customerService; 
  
    public Customer getCustomer() { 
       return customer; 
    } 
  
    public void setCustomer(Customer customer) { 
       //customer.setOrders(orders); 
       this.customer = customer; 
    } 
  
    public String execute() { 
       customer.setOrders(orders); 
       for(Order order:orders) 
           order.setCustomer(customer); 
       customerService.addCustomer(customer); 
       return SUCCESS; 
    } 
  
    public Set getOrders() { 
       return orders; 
    } 
  
    public void setOrders(Set orders) { 
       this.orders = orders; 
    } 
  
    public ICustomerService getCustomerService() { 
       return customerService; 
    } 
  
    public void setCustomerService(ICustomerService customerService) { 
       this.customerService = customerService; 
    } 
} 

Customer.java和Order.java:两个实体类,分别代表一个消费者和一个订单,并且一个消费
                         者可以有多个订单,而一个订单只属于一个消费者。
package test.persistence; 
  
import java.io.Serializable; 
import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; 
  
/** 
 * @author zhukai 
 */ 
  
public class Customer implements Serializable {
private Long id; 
  
    private String name; 
  
    private String email; 
  
    private String password; 
  
    private String phone; 
  
    private boolean married; 
  
    private String address; 
  
    private char sex; 
  
    private String description; 
  
    private Date birthday; 
  
    private Date registeredTime; 
  
    private Set orders = new HashSet(); 
  
    /** 
     * hibernate要求持久化类必须提供一个不带参数的默认构造方法 
     */ 
    public Customer() { 
       // TODO Auto-generated constructor stub 
    } 
  
    public Customer(String name) { 
       super(); 
       this.name = name; 
    } 
  
    public Customer(String name, Set orders) { 
       super(); 
       this.name = name; 
       this.orders = orders; 
    } 
  
    public String getAddress() { 
       return address; 
    } 
  
    public void setAddress(String address) { 
       this.address = address; 
    } 
  
    public String getDescription() { 
       return description; 
    } 
  
    public void setDescription(String description) { 
       this.description = description; 
    } 
  
    public Date getBirthday() { 
       return birthday; 
    } 
  
    public void setBirthday(Date birthday) { 
       this.birthday = birthday; 
    } 
  
    public String getEmail() { 
       return email; 
    } 
  
    public void setEmail(String email) { 
       this.email = email; 
    } 
  
    public Long getId() { 
       return id; 
    } 
  
    public void setId(Long id) { 
       this.id = id; 
    } 
    public String getName() { 
       return name; 
    } 
  
    public void setName(String name) { 
       this.name = name; 
    } 
  
    public String getPassword() { 
       return password; 
    } 
  
    public void setPassword(String password) { 
       this.password = password;// 
    } 
  
    public String getPhone() { 
       return phone; 
    } 
public void setPhone(String phone) { 
       this.phone = phone; 
    } 
  
    public Date getRegisteredTime() { 
       return registeredTime; 
    } 
  
    public void setRegisteredTime(Date registeredTime) { 
       this.registeredTime = registeredTime; 
    } 
  
    public char getSex() { 
       return sex; 
    } 
  
    public void setSex(char sex) { 
       this.sex = sex; 
    } 
  
    public Set getOrders() { 
       return orders; 
    } 
  
    public void setOrders(Set orders) { 
       this.orders = orders; 
    } 
  
    public boolean isMarried() { 
       return married; 
    } 
  
    public void setMarried(boolean married) { 
       this.married = married; 
    } 
  
} 

reg.jsp:前台页面,用于输入数据
<%@ page language="java" contentType="text/html; charset=utf-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title></title> 
</head> 
<body> 
<div style="color:red"> 
     <s:fielderror /> 
</div> 
<form action="register.action" method="post"> 
<table width="389" border="1" align="center"> 
  <tr> 
    <th height="30" colspan="4" scope="col"></th> 
    </tr> 
  <tr> 
    <td width="65" height="30">姓名</td> 
    <td width="68"><input name="customer.name" type="text" id="customer.name" size="10"></td> 
    <td width="75">电子邮箱</td> 
    <td width="153"><input name="customer.email" type="text" id="customer.email" size="10"></td> 
  </tr> 
  <tr> 
    <td height="30">地址</td> 
    <td><input name="customer.address" type="text" id="customer.address" size="10"></td> 
    <td>电话</td> 
    <td><input name="customer.phone" type="text" id="customer.phone" size="10"></td> 
  </tr> 
  <tr> 
    <td height="30">密码</td> 
    <td><input name="customer.password" type="text" id="customer.address" size="10"></td> 
    <td>性别</td> 
    <td><input name="customer.sex" type="radio" id="customer.sex" size="10" value="M" checked="checked">男&nbsp;<input name="customer.sex" type="radio" id="customer.sex" size="10" value="F">女</td> 
  </tr> 
   <tr> 
    <td height="30">出生日期</td> 
    <td><input name="customer.birthday" type="text" id="customer.address" size="10"></td> 
    <td>注册日期</td> 
    <td><input name="customer.registerTime" type="text" id="customer.phone" size="10"></td> 
  </tr> 
  <tr> 
    <td height="30" colspan="4">订单一</td> 
  </tr> 
  <tr> 
    <td height="30">订单号</td> 
    <td><input name="orders.makeNew[0].orderNumber" type="text"  size="10"></td> 
    <td>配送地址</td> 
    <td><input name="orders.makeNew[0].address" type="text"  size="10"></td> 
  </tr> 
  <tr> 
<td height="30" colspan="4">订单二</td> 
    </tr> 
  <tr> 
    <td height="30">订单号</td> 
    <td><input name="orders.makeNew[1].orderNumber" type="text"  size="10"></td> 
    <td>配送地址</td> 
    <td><input name="orders.makeNew[1].address" type="text"  size="10"></td> 
  </tr> 
  <tr> 
    <td height="30" colspan="4">订单三</td> 
    </tr> 
  <tr> 
    <td height="30">订单号</td> 
    <td><input name="orders.makeNew[2].orderNumber" type="text"  size="10"></td> 
    <td>配送地址</td> 
    <td><input name="orders.makeNew[2].address" type="text"  size="10"></td> 
  </tr> 
  <tr> 
    <td height="30" colspan="4"><input type="submit" value="提交"><input type="reset" value="重置"> </td> 
  </tr> 
  <tr> 
</table> 
  
</form> 
</body> 
</html> 

CustomerInserterAction-conversion.properties:类型转换的配置文件,我的内容如下
    KeyProperty_orders=id
    Element_orders=test.persistence.Order
    CreateIfNull_orders=true
有几个要说明的地方,这时封装Set集合时必须要注意的:
1.CustomerInserterAction.java中对orders必须要初始化,如下所示:
   private Set<Order> orders=new HashSet();
2.在jsp页面中给变量命名时必须要按照如下的格式:
   <input name="orders.makeNew[0].orderNumber" type="text"  size="10">
   必须要使用makeNew运算符,这样ognl才能帮我创建新的对象,否则orders会为空。当时如果集合类型是List,就不必这样,直接name="orders[0].orderNumber"就可以了。
3.在Class-conversion.properties文件中加上KeyProperty_orders=id,这是封装Set时必须的。这个主要是用来设置检索集合中元素时的索引,具体含义可以参看http://wiki.javascud.org/display/ww2cndoc/Type%20Conversion,它里面对类型转换配置文件做了详细的介绍。

文章出处:http://www.diybl.com/course/3_program/java/javajs/2007927/74827_4.html
分享到:
评论
1 楼 imouse728 2010-07-28  
网友你好,你这套代码不错,但是那个属性文件,我也加上了,为什么仍然不行啊。
那个属性文件需要别的配置,在那个地文加裁的啊?
我的邮箱:wowgenit@gmail.com
非常期待您的帮助。

相关推荐

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    总之,Struts2的类型转换机制是其强大功能之一,它简化了数据绑定过程,使得开发者能够专注于业务逻辑,而不是数据转换的细节。理解并熟练掌握Struts2的类型转换,将有助于提高开发效率和代码质量。在实际项目中,应...

    Struts2实例 国际化 类型转换 struts标签

    类型转换(Type Conversion)是Struts2的一项重要特性,它能自动将请求参数转换为Action属性的预期类型。例如,用户输入的字符串可以自动转换为整数或日期。如果Struts2内置的转换器无法满足需求,开发者还可以...

    Struts批量类型转换

    张龙老师的讲解中提到了批量类型转换,这通常是指在处理批量操作时,如批量插入数据库记录,需要对一组数据进行统一的类型转换。在不改动任何代码的情况下进行类型转换,可能意味着利用Struts2的拦截器(Interceptor...

    struts2自定义类型转换器

    这就是"struts2自定义类型转换器"的主题。 首先,理解Struts2的类型转换机制。当Struts2接收到HTTP请求时,它会尝试将请求参数与Action类的属性进行绑定。这个过程涉及到了类型转换,Struts2内置了一套转换器机制,...

    struts2简单实例(类型转换)

    在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...

    struts2 类型转换器

    在Struts2中,类型转换器(Type Converter)是框架的一个关键特性,用于处理Action类中属性的自动类型转换。这个特性使得开发者无需手动进行数据类型之间的转换,从而提高了开发效率和代码的可读性。 标题中的...

    Struts2自定义类型转换

    ### Struts2自定义类型转换:深入解析与实践 #### 引言 在Web开发中,数据类型转换是一项常见的需求,特别是在用户输入的数据与后端处理的数据类型不一致时。Struts2框架提供了强大的类型转换机制,允许开发者...

    Struts2 ConverterType类型转换 案例源码

    类型转换是Struts2框架中一个重要的特性,它允许我们把前端表单提交的数据自动转换为后端Java对象的属性。在这个案例中,我们将深入探讨Struts2中的ConverterType,以及如何实现一个自定义的类型转换器来处理坐标(x...

    STRUTS2类型转换

    Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...

    struts2数据类型转换

    ### Struts2 数据类型转换详解 #### 一、引言 在Web开发中,特别是使用Struts2框架进行开发时,数据类型转换是一项至关重要的功能。由于Web应用程序的基础通信协议HTTP仅支持字符串形式的数据传输,因此,服务器端...

    实验4 Struts2的类型转换与OGNL表达式语言.doc

    ### Struts2的类型转换与OGNL表达式语言 #### 一、Struts2的类型转换类型 在Struts2框架中,类型转换是处理用户输入数据时的一个关键环节。Struts2支持多种内置的数据类型转换,同时也允许开发人员自定义类型转换...

    struts2简单实例(类型转换方法对比)

    本实例主要探讨了在Struts2中进行类型转换的三种方法:局部类型转换、全局类型转换以及大量数据类型的转换。对于初学者来说,理解并掌握这些转换方式至关重要,因为它们能够帮助我们处理用户输入的数据,并将其转化...

    第2讲 --Struts2的类型转换

    总结来说,Struts2的类型转换机制是其核心功能之一,它有效地解决了HTTP请求数据与Action属性之间的类型不匹配问题。理解并掌握Struts2的类型转换,对于提升Java web应用的开发效率和质量具有重要意义。通过学习和...

    Struts处理类型转换错误,如时间转换

    在处理用户输入时,Struts2框架需要将请求参数转换为对应的Java对象属性,这个过程就涉及到类型转换。然而,当用户输入的数据格式不正确时,就会出现类型转换错误,例如在尝试将字符串转换为日期时。本篇文章将深入...

    struts2的类型转换详解

    Struts2 的类型转换是其框架中的一个重要特性,它允许开发者轻松地将用户提交的字符串数据转换为应用程序所需的各类数据类型。在 MVC 框架中,用户输入的数据通常是字符串形式,而Java作为强类型语言,需要将这些...

    struts2自定义数据类型转换练习

    本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...

    Struts2 自定类型转换器(三十四)

    在Struts2框架中,自定义类型转换器是开发者为了满足特定需求,对框架默认的类型转换机制进行扩展的一种方式。Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据...

    Struts 1.x中批量封装对象

    2. **ActionForm设计**:接着,你需要在ActionForm中定义一个属性,该属性是上述集合类的类型。例如,`private List&lt;MyObject&gt; myList;`,并为其提供getter和setter。 3. **JSP页面**:在JSP页面中,你可以使用...

Global site tag (gtag.js) - Google Analytics