网上有关主从表提交的资料非常的少,可怜我刚刚入门,一切都得自己想办法解决,经过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的部分代码
<ordervalueobject>
下面是用于接收客户信息的值对象的完整代码
</ordervalueobject>
<ordervalueobject><ordervalueobject>
下面是表单bean的完整代码,我不知道用动态bean能不能实现,如果你试成功了,请不要忘了告诉我一声。
</ordervalueobject></ordervalueobject>
这是创建客户信息的jsp页面
<c:url var="saveCustomerUrl">
</c:url>
本来想用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 代码
- public class CustomerAction extends DispatchAction {
- /**
- * 打开客户增加页面
- * @param mapping
- * @param form
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- public ActionForward openAddCustomer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
- CustomerValueObject customer = new CustomerValueObject();
- request.setAttribute(Constants.customerBean, customer);
- return mapping.findForward("toAddCustomer");
- }
- /**
- * 保存客户信息
- * @param mapping
- * @param form
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- public ActionForward saveCustomer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
- CustomerForm customerForm = (CustomerForm)form;
- Customers customer = null;
- long customerId = customerForm.getCustomer().getId();
- //根据customers.id是否为空判断是插入还是更新
- if (customerForm.getCustomer().getId() == 0){
- customer = this.customerValueObject2Customers(customerForm.getCustomer());
- }else if (customerForm.getCustomer().getId() > 0){
- String hqlString = "select c from Customers c left join fetch c.orderses o where c.id = ?";
- customer = customerDao.getObject(hqlString, new Object[]{new Long(customerId)});
- //或许这里可以用BeanUtils.copyProperty来复制bean的属性,但我试过了,总是报错,索性自己赋值了
- customer.setName(customerForm.getCustomer().getName());
- customer.getOrderses().clear();
- for(Iterator it = customerForm.getCustomer().getOrderses().iterator(); it.hasNext();){
- OrderValueObject orderVo = it.next();
- Orders o = new Orders();
- BeanUtils.copyProperties(o, orderVo);
- customer.getOrderses().add(o);
- o.setCustomers(customer);
- }
- }
- customerDao.saveObject(customer);
- return mapping.findForward("toList");
- }
下面是用于接收客户信息的值对象的完整代码
</ordervalueobject>
java 代码
- package demo.struts.valueobjects;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.commons.collections.Factory;
- import org.apache.commons.collections.ListUtils;
- /**
- * 客户值对象,用于接收表单提交的客户和订单信息
- * @author Administrator
- *
- */
- public class CustomerValueObject implements java.io.Serializable {
- private static final long serialVersionUID = -5142724257544817298L;
- private long id;
- private String name;
- /**
- * 这是关键的一部分,也是和hibernate所用的pojo的唯一区别,这样做是为了解决在没有列表项目的时候,前端页面会报获取第0个元素失败的异常,
- * 这个工具类很好的解决了这个问题,它可以在你访问越界下标元素的时候动态的填充越界的部分,这样就不会报异常了。
- * 下面是这个LazyList的关键代码
- * public Object get(int index) {
- int size = getList().size();
- if (index < size) {
- // within bounds, get the object
- Object object = getList().get(index);
- if (object == null) {
- // item is a place holder, create new one, set and return
- object = factory.create();
- getList().set(index, object);
- return object;
- } else {
- // good and ready to go
- return object;
- }
- } else {
- // we have to grow the list
- for (int i = size; i < index; i++) {
- getList().add(null);
- }
- // create our last object, set and return
- Object object = factory.create();
- getList().add(object);
- return object;
- }
- }
- */
- @SuppressWarnings("unchecked")
- private List orderses = (List)ListUtils.lazyList(new ArrayList(), new Factory(){
- public OrderValueObject create() {
- return new OrderValueObject();
- }
- });
- public CustomerValueObject() {
- }
- public long getId() {
- return this.id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getName() {
- return this.name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public List getOrderses() {
- return this.orderses;
- }
- public void setOrderses(List orderses) {
- this.orderses = orderses;
- }
- }
下面是表单bean的完整代码,我不知道用动态bean能不能实现,如果你试成功了,请不要忘了告诉我一声。
</ordervalueobject></ordervalueobject>
java 代码
- package demo.struts.forms;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts.action.*;
- import demo.struts.valueobjects.*;
- /**
- * ActionForm的代码,里面负责维护一个客户的值对象
- */
- public class CustomerForm extends ActionForm {
- private static final long serialVersionUID = -2128506741766449352L;
- private CustomerValueObject customer;
- public CustomerValueObject getCustomer() {
- return this.customer;
- }
- public void setCustomer(CustomerValueObject customer) {
- this.customer = customer;
- }
- /**
- * 必须在reset中创建客户对象
- */
- @Override
- public void reset(ActionMapping mapping, HttpServletRequest request) {
- customer = new CustomerValueObject();
- super.reset(mapping, request);
- }
- @Override
- public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
- return super.validate(mapping, request);
- }
- }
这是创建客户信息的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>
- struts-hibernate-nested-demo.zip (888 KB)
- 描述: 不好意思,上次漏传了数据库脚本,这次又重新打包了
- 下载次数: 623
相关推荐
网上有关主从表提交的资料非常的少,可怜我刚刚入门,一切都得自己想办法解决,经过N天的努力,总算是搞定了。程序写的有点徒省事,所以请别见笑。 本来想用struts-nested标签来实现的,折腾了7个小时都搞不定,...
这是我用JSP+struts+hibernate+Sql Server做的一个简单的图书管理系统,用Myeclipse开发,只做了后台代码,页面没做美化。 系统实现了管理员和读者信息的增删改,以及图书的增、删、查询、外借、还回等功能模块。
`Hibernate` 是一个强大的ORM(Object-Relational Mapping,对象关系映射)框架,它可以将Java对象映射到数据库表,简化了数据库操作。在SSH架构中,Hibernate负责与数据库交互,处理数据的增、删、改、查操作。 在...
Struts主要处理MVC(Model-View-Controller)架构中的控制层,Hibernate则专注于持久化数据到数据库,而Spring作为一个全能框架,不仅提供了依赖注入和面向切面编程,还整合了其他两者,形成了一种强大的企业级应用...
Struts2是一款基于MVC(Model-View-Controller)设计模式的开源框架,用于构建可维护性高、结构清晰的Web应用程序,而Hibernate则是一个对象关系映射(ORM)工具,它简化了数据库操作,将Java对象与数据库表进行映射...
总之,"spring+struts2+hibernate框架双表增删改查"项目为初学者提供了一个完整的实战平台,通过这个项目,学习者可以深入理解这三个框架如何协同工作,实现复杂的数据操作,同时掌握Java Web开发的基本流程和技巧。...
综上所述,"struts2+hibernate实现登录及增删改操作"涉及到的是如何利用这两个框架构建一个完整的Java Web应用,包括用户身份验证、数据库操作以及对数据的增删改等核心功能。这个小案例可以帮助开发者理解并熟练...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责应用程序的不同层面,共同构建了一个强大的MVC(Model-View-Controller)架构。在这个“用struts2+ spring+ hibernate编写的增删改程序”中,...
Struts是MVC(Model-View-Controller)架构模式的一个实现,主要负责处理用户的请求和展示数据,而Hibernate则是一个对象关系映射(ORM)工具,用于简化数据库操作。 在"struts+hibernate学生管理系统"项目中,...
这个"struts+hibernate+spring添删改查源码示例"是针对这三大框架集成使用的一个实践教程,帮助开发者理解和学习如何在实际项目中进行数据的增删改查操作。 1. **Struts**:Struts 是一个基于MVC(Model-View-...
这个例子展示了如何将这三个框架整合在一起,实现一个简单的图书管理系统的增删改操作。 **Struts2** 是一个基于MVC设计模式的Web应用框架,它提供了一种组织应用程序的方式,使得业务逻辑与展示层分离。Struts2的...
Struts、Hibernate和Spring是Java开发中非常经典的三个框架,它们各自在Web应用的不同层面上发挥作用,共同构建了一个强大的企业级应用开发模型。这个"struts+hibernate+spring添删改查示例源码"是用于演示如何在...
Struts则是一个MVC(Model-View-Controller)框架,专注于处理用户的请求和展示结果。它将用户的交互与业务逻辑分离,使得系统更加模块化和易于维护。 Hibernate作为ORM(Object-Relational Mapping)工具,负责...
本教程通过一个简单的Demo,展示了如何将这两个框架整合,实现基本的CRUD(创建、读取、更新、删除)操作,并结合登录注册功能,为初学者提供了很好的学习资源。 首先,Struts2是基于Action的MVC框架,它处理用户...
【简要说明】:系统自身具有强大、完善的网站后台管理功能,可以为每个科局(科室\部门)设定不同的管理权限,动态增删改栏目,有如WORD文档处理般的图文混排功能,操作方便。系统前台的栏目、菜单、功能入口等全部...
3. 购物车:用户可以将商品添加到购物车,Struts处理购物车的增删改操作,Hibernate负责在后台数据库中同步这些变化。 4. 订单处理:用户提交订单后,系统需要处理订单状态(如待支付、已支付、已发货等)。Struts...
【购物车实例(Struts+Hibernate)】是一个典型的Web应用开发案例,主要针对那些刚开始学习Struts和Hibernate框架的开发者。这个实例通过实现一个在线购物车的功能,帮助开发者理解这两个框架如何协同工作来构建实际...
4. **Action和Result**:Struts2的Action类是处理用户请求的核心,它负责接收请求、调用业务逻辑(如服务层的方法,这些方法可能使用Hibernate进行数据库交互)并返回一个Result。Result决定如何处理Action的结果,...