MyEclipse6Java开发中文教程 第十一章开发 Spring+ Struts+ Hibernate 应用 第十一章开发 Spring+ Struts+ Hibernate应用. 111创建数据库 112快速开发 Struts应用 11.3添加 Hibernate功能 114添加Spng功能…… 12 115spng整合 Hibernate 116开发业务层代码 117 Spring整合 Struts 11.71给 Action类加入 message属性 1172在Suts配置文件中加入 Spring配置信息 1173在 Spring配置文件中加入Acon的bean定义 11.74测试,Asm出错和og4 j- properties文件 11.7.5 Spring整合Ss的其它方式 66g 11.8完成整合:修改Acon代码注入业务层 119测试运行 1110原理探索:模拟 Action代理类实现 Spring+ Struts 1111开发增删改查的综合用户管理例子 11.11.1创建新项目 11112用 Struts设计器制作前台业务流程 11.113设计业务层功能 11.114开发业务层和DAO层代码 11115开发前台页面流程 11116整合 Spring, Struts和 Hibernate 111布,运行,测试…… 11.118思考与练习 1112 collections. SequencedHashMap异常的解决方案 113小结 本章内容将会给大家介绍目前比较流行的开源软件架构:SSH,也就是 Spring+ Struts 1x+ Hibernate,或者常说的 Spring整合 Struts1.X, Hibernate开发。本章将会介绍在上 章的 Spring整合 Hibernate基础上阐述如何将 Spring和 Struts相整合(这是本章的重点内 容),来开发一个简单的用户登录功能(也就是将第九章开发 Struts1x应用所开发的用户 登录应用改用 Spring整合 Hibernate的方式来完成)。为了方便读者,我们先用最简单的方 式进行整合,然后再会讨论不同的 Spring+ Struts整合策略来作为扩展部分,让读者能有所 对比。最后我们会实现一个增删查改的用户管理应用。 我们先来探讨一个问题,为什么要用 Spring来整合 Struts呢?难道在Suts里面直接 新建一个 ApplicationContext然后通过 getBean0获取对应的DAO层不就也算完成整合了 刘长炯著
MyEclipse 6 Java 开发中文教程 1 刘长炯著 第十一章 开发 Spring+Struts+Hibernate 应用 第十一章 开发Spring+Struts+Hibernate应用..................................................................... 1 11.1 创建数据库 ........................................................................................................ 3 11.2 快速开发 Struts 应用 ........................................................................................ 3 11.3 添加 Hibernate 功能....................................................................................... 10 11.4 添加 Spring 功能 ............................................................................................ 12 11.5 Spring 整合 Hibernate..................................................................................... 12 11.6 开发业务层代码 ............................................................................................... 21 11.7 Spring 整合 Struts ........................................................................................... 23 11.7.1 给Action类加入message属性 ................................................................ 23 11.7.2 在 Struts 配置文件中加入Spring配置信息 ............................................ 24 11.7.3 在Spring配置文件中加入Action的bean定义........................................... 26 11.7.4 测试,Asm出错和log4j.properties 文件 ................................................ 26 11.7.5 Spring整合Struts的其它方式................................................................... 29 11.8 完成整合:修改Action代码注入业务层 ............................................................ 32 11.9 测试运行.......................................................................................................... 35 11.10 原理探索:模拟 Action 代理类实现 Spring + Struts..................................... 35 11.11 开发增删改查的综合用户管理例子................................................................. 38 11.11.1 创建新项目........................................................................................... 38 11.11.2 用Struts设计器制作前台业务流程 ........................................................ 38 11.11.3 设计业务层功能 ................................................................................... 43 11.11.4 开发业务层和DAO层代码..................................................................... 45 11.11.5 开发前台页面流程................................................................................ 53 11.11.6 整合Spring,Struts和Hibernate ........................................................... 68 11.11.7 发布,运行,测试................................................................................ 73 11.11.8 思考与练习........................................................................................... 74 11.12 collections.SequencedHashMap 异常的解决方案 ......................................... 74 11.13 小结 ............................................................................................................... 75 本章内容将会给大家介绍目前比较流行的开源软件架构:SSH,也就是Spring + Struts 1.x + Hibernate,或者常说的Spring 整合Struts1.x,Hibernate开发。本章将会介绍在上一 章的Spring整合Hibernate基础上阐述如何将Spring和Struts相整合(这是本章的重点内 容),来开发一个简单的用户登录功能(也就是将 第九章 开发Struts 1.x应用所开发的用户 登录应用改用Spring整合Hibernate的方式来完成)。为了方便读者,我们先采用最简单的方 式进行整合,然后再会讨论不同的Spring + Struts整合策略来作为扩展部分,让读者能有所 对比。最后我们会实现一个增删查改的用户管理应用。 我们先来探讨一个问题,为什么要用 Spring 来整合 Struts 呢?难道在 Struts 里面直接 新建一个ApplicationContext然后通过getBean()获取对应的DAO层不就也算完成整合了
MyEclipse6Java开发中文教程 嘛?没错,这样也算整合,但是显然这样一来,所有的 Struts类的代码都得改写,而且还有 个很大的缺陷:我们知道Web应用的访问是十分频繁的,例如有的站点一天要支持几百 万的访问量,每次都来创建一个新的 Spring容器类是十分消耗资源的,所以这种做法是比 较容易想到但是却不实用的。而我们的目的是尽量不改或者少改 Struts里面的代码来完成整 合功能,实际情况是让 Spring来创建 Action类,然后注入需要的DAO层等等的对象,也 就是说要把 Struts的 Action类变成 Spring配置文件中的一个普通Java类定义,可以用 property等标签来设置对应的属性。换句话说,就是要把 Action代码中的直接调用 Spring 类的代码 l/ StrutsXXXAction java public Action Forward execute(ActionMapping mapping, Action Form form, Http servletrEquest request Http servletResponse response)( ∥手工创建 Spring容器类 ApplicationContext ctx= new ClassPathXmlApplicationContext(applicationContext. xml") StudentDAo dao=( StudentDAO)ctx getBean( StudentDAO") dao. xxx0,/调用DAO 变成注入方式 private student DAo dao StudentDAo getstudentDAo () t return dao public void setstudentDAo (StudentDAo dao)( this dao =.dao; public ActionForward execute(ActionMapping mapping, ActionForm form, Httpservletrequest request HttpservletresponsE response //直接使用被 Spring注入的DAo的实例 dao.xxx();//调用DAO,或者用代码 getstudentDAO().xxx() 外加一个 Spring中的Bean定义: <bean name="/login" class="com.xxx. StrutsXXXAction"> <property name="studentDAO"> <ref bean="dao"/> property 2 刘长炯著
MyEclipse 6 Java 开发中文教程 2 刘长炯著 嘛?没错,这样也算整合,但是显然这样一来,所有的 Struts 类的代码都得改写,而且还有 一个很大的缺陷:我们知道 Web 应用的访问是十分频繁的,例如有的站点一天要支持几百 万的访问量,每次都来创建一个新的 Spring 容器类是十分消耗资源的,所以这种做法是比 较容易想到但是却不实用的。而我们的目的是尽量不改或者少改 Struts 里面的代码来完成整 合功能,实际情况是让 Spring 来创建 Action 类,然后注入需要的 DAO 层等等的对象,也 就是说要把 Struts 的 Action 类变成 Spring 配置文件中的一个普通 Java 类定义,可以用 property 等标签来设置对应的属性。换句话说,就是要把 Action 代码中的直接调用 Spring 类的代码: // StrutsXXXAction.java public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // 手工创建 Spring 容器类 ... ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); StudentDAO dao = (StudentDAO)ctx.getBean("StudentDAO"); dao.xxx();// 调用 DAO ... } 变成注入方式: private StudentDAO dao; public StudentDAO getStudentDAO() { return dao; } public void setStudentDAO (StudentDAO dao) { this.dao = dao; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //直接使用被 Spring 注入的 DAO 的实例 dao.xxx();// 调用 DAO,或者用代码 getStudentDAO().xxx(); ... } 外加一个 Spring 中的 Bean 定义: <bean name=”/login” class=”com.xxx. StrutsXXXAction”> <property name="studentDAO"> <ref bean="dao" /> </property> </bean>
MyEclipse6Java开发中文教程 注意bean的name属性,只有这个属性才能加入带特殊字符的路径名,而对应的属性 studentDAo则通过配置文件来注入上一章已经定义好的 Hibernate DAO类就可以了,而 这个DAO因为是Spng所定义的,所以可以和上一章的内容一样进行 Spring整合 Hibernate的自动事务代理功能开发,而bean的 class则指向写好的 Struts Action类。这 样,就可以解决上文所提到的性能问题 这就是整合的真正目的所在,稍后我们会讨论详细的过程 111创建数据库 我们的项目所用的表结构和以前的没有任何区别。这里我们使用 My SQL数据库来完成 练习。 建表的SQL如下所示: CREATE TABLE Student id int NoT nULl auto increment username varchar(200)NOT NULL, password varchar(20) NOT NULL, age int, PRIMARY KEY(id) )ENGINE=Myl SAM DEFAULT CHARSET=GBK 详细内容请参考52创建数据库表格一节的内容。 12快速开发 Struts应用形 第一阶段我们就是创建一个极其简单的登录功能的程序,前台采用 Struts,后台采用 Spring+ Hibernate完成。关于本节的详细操作说明可以参考第九章开发Stts1X应用。 这个应用的流程图(用 MyEclipse绘制,文件名是模型umr)如下所示: 首爽 显小欢遍信县 退由系统 暴小登录爽面 userLo gin js 登录成功爽面 判断登录 后台可以调用业务层来检查登录 UserLo gin Action. jav 图111登录应用的页面流程 首先我们新建一个Web项目ssh1,也就是 Spring+ Struts+ Hibernate第一个项目的意 思。选择菜单File>New> Web Project,可以启动创建Web项目的向导对话框,在对话 框的 Project Name中输入ssh1然后选中J2 EE Specification Level下面的 Java ee50 单选钮,最后点击 Finish按钮就可以建好这个Web项目了。 刘长炯著
MyEclipse 6 Java 开发中文教程 3 刘长炯著 注意 bean 的 name 属性,只有这个属性才能加入带特殊字符的路径名,而对应的属性 studentDAO 则通过配置文件来注入上一章已经定义好的 Hibernate DAO 类就可以了,而 这个 DAO 因为是 Spring 所定义的,所以可以和上一章的内容一样进行 Spring 整合 Hibernate 的自动事务代理功能开发,而 bean 的 class 则指向写好的 Struts Action 类。这 样,就可以解决上文所提到的性能问题。 这就是整合的真正目的所在,稍后我们会讨论详细的过程。 11.1 创建数据库 我们的项目所用的表结构和以前的没有任何区别。这里我们使用 MySQL 数据库来完成 练习。 建表的 SQL 如下所示: CREATE TABLE Student ( id int NOT NULL auto_increment, username varchar(200) NOT NULL, password varchar(20) NOT NULL, age int, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=GBK 。详细内容请参考 5.2 创建数据库表格一节的内容。 11.2 快速开发 Struts 应用 第一阶段我们就是创建一个极其简单的登录功能的程序,前台采用Struts,后台采用 Spring+Hibernate完成。关于本节的详细操作说明可以参考 第九章 开发Struts 1.x应用。 这个应用的流程图(用MyEclipse绘制,文件名是模型.umr)如下所示: 图 11.1 登录应用的页面流程 首先我们新建一个 Web 项目 ssh1,也就是 Spring+Struts+Hibernate 第一个项目的意 思。选择菜单 File > New > Web Project,可以启动创建 Web 项目的向导对话框,在对话 框的 Project Name 中输入 ssh1,然后选中 J2EE Specification Level 下面的 Java EE 5.0 单选钮,最后点击 Finish 按钮就可以建好这个 Web 项目了
MyEclipse6Java开发中文教程 Web项目创建完毕后,我们需要给它添加 Struts功能。这个操作可以通过在 Package Explorer视图的项目根节点上右键点击,选择上下文菜单中的 MyEclipse> Add struts Capabilities;或者选择菜单 My Eclipse> Project Capabilities> Add struts Capabilities,接着就启动了添加 Struts功能的向导。保持所有选项为默认值,选中 Struts specification右侧的Sus12这个单选钮,然后点击 Finish按钮关闭向导来完成添加 Struts开发功能的过程。这个过程结束之后, Struts的类库以及相应的配置文件将会出现在 项目的目录结构中 选择菜单File>New>JSP( Advanced Template)来创建 userLogin Succes」jsp页 面,详细操作请参考942创建登录成功页面,最后调整此页码的代码为如下所示: s page language="java"pageEncoding="GBK"9 <80tagliburi="http://struts.apacheorg/tags-bean"prefix="bea <atagliburi="http://struts.apacheorg/tags-html <html: html lang="true"> <head> <html: base / < title>登录结果页面</tit1e> </head> <body> 你好<bean: write name=" userName" scope=" session"/>,你已经登录成功! <br> < a href=" index.jsp">返回首页</a> </html: html> 这个代码和以前的不同点就是加入了一个返回首页的链接,这也是一个小小的原则:开发的 页码应该有入口,有出口,尽量不要让用户还得点后退才能返回刚开始的页面。 现在双击 WebRoot/wEB-INF/struts-config xml就可以打开 Struts配置文件编辑器,在 设计器网格面板上点击右键,选择菜单New>Fom, Action and jsP,启动创建 Action Form以及Acon和JSP的向导,请参考943使用新建Fom, Action和JSP的向导创 建关键组件一节的内容完成练习。完成后得到如下的几个文件:登录表单页面 WebRoot/userLogin jsp(表示层) page guan avapageEncoding="GBK> <号taglibur主Whttp://struts.apacheorg/tags-bean"prefix="bean"8> 8t16x1=htp:/trut. apache.0x/a9+hm1”prex=”htm1”8> <htm <title>jsP for UserLoginForm form</title> </head> <script type="text/javascri /验证输入不为空的脚本代码 function check Form(form)( if(form userName. valt a1ert("用户名不能为空!") form userName. focus ()i 刘长炯著
MyEclipse 6 Java 开发中文教程 4 刘长炯著 Web 项目创建完毕后,我们需要给它添加 Struts 功能。这个操作可以通过在 Package Explorer 视图的项目根节点上右键点击,选择上下文菜单中的 MyEclipse > Add Struts Capabilities ;或者选择菜单 MyEclipse > Project Capabilities > Add Struts Capabilities,接着就启动了添加 Struts 功能的向导。保持所有选项为默认值,选中 Struts specification 右侧的 Struts 1.2 这个单选钮,然后点击 Finish 按钮关闭向导来完成添加 Struts 开发功能的过程。这个过程结束之后,Struts 的类库以及相应的配置文件将会出现在 项目的目录结构中。 选择菜单 File > New > JSP(Advanced Template)来创建userLoginSuccess.jsp 页 面,详细操作请参考 9.4.2 创建登录成功页面,最后调整此页码的代码为如下所示: <%@ page language="java" pageEncoding="GBK"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <html:html lang="true"> <head> <html:base /> <title>登录结果页面</title> </head> <body> 你好 <bean:write name="userName" scope="session" />,你已经登录成功! <br> <a href="index.jsp">返回首页</a> </body> </html:html> 这个代码和以前的不同点就是加入了一个返回首页的链接,这也是一个小小的原则:开发的 页码应该有入口,有出口,尽量不要让用户还得点后退才能返回刚开始的页面。 现在双击WebRoot/WEB-INF/struts-config.xml就可以打开Struts配置文件编辑器,在 设计器网格面板上点击右键,选择菜单New > Form, Action and JSP,启动创建 ActionForm以及Action和JSP的向导,请参考 9.4.3 使用新建Form,Action和JSP的向导创 建关键组件 一节的内容完成练习。完成后得到如下的几个文件:登录表单页面 WebRoot/userLogin.jsp(表示层): <%@ page language="java" pageEncoding="GBK"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <html> <head> <title>JSP for UserLoginForm form</title> </head> <script type="text/javascript"> // 验证输入不为空的脚本代码 function checkForm(form) { if(form.userName.value == "") { alert("用户名不能为空!"); form.userName.focus();
MyEclipse6Java开发中文教程 if(form password value a1ext("密码不能为空!") form password. focus ()i return false; </script> <html: form action="/userLogin"onsubmit="return checkForm(this)i> 用户名:<htm1: text property=" userName"/xnm: errors property="userName"/><br/> a: <html: password property="password"/><html: errors <htm1: submit va1ue="登录"/>< html:cancel value="取消"/> </html: form> </body </html> 大家可以注意到这个文件也加入了 JavaScript来防止用户输入空的表单值,也就是说 Struts 的hm:om标签定义的表单输入组件也是完全可以来用 JavaScript来做提交验证的 Struts配置文件 WebRoot/EB-NF/ struts-config xm: < DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN http://strutsapache.org/dtds/struts-config_1_2.dtd"> beans form-bean name=userloginForm type="com yourcompany. struts form. UserLoginForm"/> </form-beans> <global-exceptions / <global-forwards / 刘长炯著
MyEclipse 6 Java 开发中文教程 5 刘长炯著 return false; } if(form.password.value == "") { alert("密码不能为空!"); form.password.focus(); return false; } return true; } </script> <body> <html:form action="/userLogin" onsubmit="return checkForm(this);"> 用户名: <html:text property="userName"/><html:errors property="userName"/><br/> 密码: <html:password property="password"/><html:errors property="password"/><br/> <html:submit value="登录"/><html:cancel value="取消"/> </html:form> </body> </html> 大家可以注意到这个文件也加入了 JavaScript 来防止用户输入空的表单值,也就是说 Struts 的 html:form 标签定义的表单输入组件也是完全可以来用 JavaScript 来做提交验证的。 Struts 配置文件 WebRoot/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="userLoginForm" type="com.yourcompany.struts.form.UserLoginForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <action