一个简单的主从表的增删改,采用 struts+hibernate

         网上有关主从表提交的资料非常的少,可怜我刚刚入门,一切都得自己想办法解决,经过N天的努力,总算是搞定了。程序写的有点徒省事,所以请别见笑。
        本来想用struts-nested标签来实现的,折腾了7个小时都搞不定,最后还是用jstl的方式搞定,最然笨了点,但是看着比较容易懂。
         下面的代码是主要部分,完整代码请送附件下载(注意编码为utf-8)
用了以下包 dom4j,hibernate3,struts1.2,junit,几个常用apache-commons包,cglib,ehcache,mysql-connector,附件代码里面没有把这些库打包,如果要运行请自己网上下载吧,反正都是开源的

参考文章 www.learntechnology.net/struts-nested.do

这是CustomerAction的部分代码

java 代码
 
  1. public class CustomerAction extends DispatchAction {  
  2.     /** 
  3.      * 打开客户增加页面 
  4.      * @param mapping 
  5.      * @param form 
  6.      * @param request 
  7.      * @param response 
  8.      * @return 
  9.      * @throws Exception 
  10.      */  
  11.     public ActionForward openAddCustomer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {  
  12.         CustomerValueObject customer = new CustomerValueObject();  
  13.         request.setAttribute(Constants.customerBean, customer);  
  14.         return mapping.findForward("toAddCustomer");  
  15.     }  
  16.   
  17.     /** 
  18.      * 保存客户信息 
  19.      * @param mapping 
  20.      * @param form 
  21.      * @param request 
  22.      * @param response 
  23.      * @return 
  24.      * @throws Exception 
  25.      */  
  26.     public ActionForward saveCustomer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {  
  27.         CustomerForm customerForm = (CustomerForm)form;  
  28.         Customers customer = null;  
  29.         long customerId = customerForm.getCustomer().getId();  
  30.         //根据customers.id是否为空判断是插入还是更新  
  31.         if (customerForm.getCustomer().getId() == 0){  
  32.             customer = this.customerValueObject2Customers(customerForm.getCustomer());  
  33.         }else if (customerForm.getCustomer().getId() > 0){  
  34.             String hqlString = "select c from Customers c left join fetch c.orderses o where c.id = ?";  
  35.             customer = customerDao.getObject(hqlString, new Object[]{new Long(customerId)});  
  36.             //或许这里可以用BeanUtils.copyProperty来复制bean的属性,但我试过了,总是报错,索性自己赋值了  
  37.             customer.setName(customerForm.getCustomer().getName());  
  38.             customer.getOrderses().clear();  
  39.             for(Iterator it = customerForm.getCustomer().getOrderses().iterator(); it.hasNext();){  
  40.                 OrderValueObject orderVo = it.next();  
  41.                 Orders o = new Orders();  
  42.                 BeanUtils.copyProperties(o, orderVo);  
  43.                 customer.getOrderses().add(o);  
  44.                 o.setCustomers(customer);  
  45.             }  
  46.         }  
  47.         customerDao.saveObject(customer);  
  48.         return mapping.findForward("toList");  
  49.     }  
<ordervalueobject>

下面是用于接收客户信息的值对象的完整代码

</ordervalueobject>
java 代码
 
  1. package demo.struts.valueobjects;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.commons.collections.Factory;  
  7. import org.apache.commons.collections.ListUtils;  
  8. /** 
  9.  * 客户值对象,用于接收表单提交的客户和订单信息 
  10.  * @author Administrator 
  11.  * 
  12.  */  
  13. public class CustomerValueObject implements java.io.Serializable {  
  14.     private static final long serialVersionUID = -5142724257544817298L;  
  15.   
  16.     private long id;  
  17.   
  18.     private String name;  
  19.   
  20.     /** 
  21.      * 这是关键的一部分,也是和hibernate所用的pojo的唯一区别,这样做是为了解决在没有列表项目的时候,前端页面会报获取第0个元素失败的异常, 
  22.      * 这个工具类很好的解决了这个问题,它可以在你访问越界下标元素的时候动态的填充越界的部分,这样就不会报异常了。 
  23.      * 下面是这个LazyList的关键代码 
  24.      *     public Object get(int index) { 
  25.         int size = getList().size(); 
  26.         if (index < size) { 
  27.             // within bounds, get the object 
  28.             Object object = getList().get(index); 
  29.             if (object == null) { 
  30.                 // item is a place holder, create new one, set and return 
  31.                 object = factory.create(); 
  32.                 getList().set(index, object); 
  33.                 return object; 
  34.             } else { 
  35.                 // good and ready to go 
  36.                 return object; 
  37.             } 
  38.         } else { 
  39.             // we have to grow the list 
  40.             for (int i = size; i < index; i++) { 
  41.                 getList().add(null); 
  42.             } 
  43.             // create our last object, set and return 
  44.             Object object = factory.create(); 
  45.             getList().add(object); 
  46.             return object; 
  47.         } 
  48.     } 
  49.       */  
  50.     @SuppressWarnings("unchecked")  
  51.     private List orderses = (List)ListUtils.lazyList(new ArrayList(), new Factory(){  
  52.         public OrderValueObject create() {  
  53.             return new OrderValueObject();  
  54.         }  
  55.     });  
  56.   
  57.     public CustomerValueObject() {  
  58.     }  
  59.   
  60.     public long getId() {  
  61.         return this.id;  
  62.     }  
  63.   
  64.     public void setId(long id) {  
  65.         this.id = id;  
  66.     }  
  67.   
  68.     public String getName() {  
  69.         return this.name;  
  70.     }  
  71.   
  72.     public void setName(String name) {  
  73.         this.name = name;  
  74.     }  
  75.   
  76.     public List getOrderses() {  
  77.         return this.orderses;  
  78.     }  
  79.   
  80.     public void setOrderses(List orderses) {  
  81.         this.orderses = orderses;  
  82.     }  
  83. }  
<ordervalueobject><ordervalueobject>
下面是表单bean的完整代码,我不知道用动态bean能不能实现,如果你试成功了,请不要忘了告诉我一声。
</ordervalueobject></ordervalueobject>
java 代码
 
  1. package demo.struts.forms;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import org.apache.struts.action.*;  
  5. import demo.struts.valueobjects.*;  
  6.   
  7. /** 
  8.  * ActionForm的代码,里面负责维护一个客户的值对象 
  9.  */  
  10. public class CustomerForm extends ActionForm {  
  11.     private static final long serialVersionUID = -2128506741766449352L;  
  12.   
  13.     private CustomerValueObject customer;  
  14.   
  15.     public CustomerValueObject getCustomer() {  
  16.         return this.customer;  
  17.     }  
  18.   
  19.     public void setCustomer(CustomerValueObject customer) {  
  20.         this.customer = customer;  
  21.     }  
  22.   
  23.     /** 
  24.      * 必须在reset中创建客户对象 
  25.      */  
  26.     @Override  
  27.     public void reset(ActionMapping mapping, HttpServletRequest request) {  
  28.         customer = new CustomerValueObject();  
  29.         super.reset(mapping, request);  
  30.     }  
  31.   
  32.     @Override  
  33.     public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {  
  34.         return super.validate(mapping, request);  
  35.     }  
  36. }  


这是创建客户信息的jsp页面
xml 代码
 
<%@ page language="java" pageEncoding="UTF-8"%>   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>   <%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested"%>      >   <html>       <head>           <html:base />              <title>新客户和订单title>              <meta http-equiv="pragma" content="no-cache">           <meta http-equiv="cache-control" content="no-cache">           <meta http-equiv="expires" content="0">           <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">           <meta http-equiv="description" content="This is my page">                      <script type="text/javascript">           function onAddOrder(url){               frmCustomer.action = url;               frmCustomer.target = "_self";               frmCustomer.submit();           }              function onDeleteOrder(url){               frmCustomer.action = url;               frmCustomer.submit();           }              function onSaveCustomer(url){               frmCustomer.action = url;               frmCustomer.submit();           }       script>       head>       <body>           <table>               <form name="frmCustomer" method="post">                   <input type="hidden" name="customer.id" value="${customer.id}" />                   <table>                       <tr>                           <td>                               客户名                           td>                           <td>                               <input name="customer.name" value="${customer.name}" />                           dh>                       tr>                       <tr>                           <td colspan="2">                               订单列表                           td>                       tr>                       <tr>                           <div id="orderList">                               <table bgcolor="#C0C0C0" width="250px">                                   <tr>                                       <td>                                                                                   td>                                       <td>                                           订单号                                       td>                                   tr>                                       <c:forEach items="${customer.orderses}" var="order" varStatus="orderItems">                                           <tr>                                               <td>                                                   <input type="hidden" name="customer.orderses[${orderItems.index}].id" value="${order.id}" />                                               td>                                               <td>                                                   <input type="text" name="customer.orderses[${orderItems.index}].orderNumber" value="${order.orderNumber}" />                                               td>                                               <td>                                                   <c:url var="deleteOrderUrl" value="/customers.do?method=deleteOrder">                                                       <c:param name="index" value="${orderItems.index}" />                                                       <c:param name="action" value="add" />                                                   c:url>                                                   <a href="javascript:onDeleteOrder('${deleteOrderUrl}');">删除订单a>                                               td>                                           tr>                                       c:forEach>                                   <tr>                                       <td align="right" colspan="2">                                           <c:url var="addOrderUrl" value="/customers.do?method=addOrder">                                               <c:param name="action" value="add" />                                           c:url>                                           <a href="javascript:onAddOrder('${addOrderUrl}');">添加订单a>                                       td>                                   tr>                               table>                           div>                       tr>                   table>               form>               <tr>                   <td colspan="2">                       <c:url var="saveCustomerUrl"                           value="/customers.do?method=saveCustomer" />                       <html:link href="javascript:onSaveCustomer('${saveCustomerUrl}');">保存客户表单html:link>                   td>               tr>           table>       body>   html> 
<c:url var="saveCustomerUrl">
</c:url>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值