Struts 2 + Spring 2 + Hibernate 3 整合入门详解(转载)
详情参考附件. word 文档, 供部分需要的同学参考. 转载内容, 其正确性无担保. http://blog.youkuaiyun.com/doliu6/archive/2007/08/06/1728019.aspx Struts 2 + Spring 2 + Hibernate 3 整合入门详解(转载) 看完之后发点感慨: 不知道搞这么多配置文件算不算增加了程序员的负担呢? 而且任意一个地方写错都不能通过. Spring, 应该向 Java EE 5 的标注开发学习学习, 每种框架和 Spring 整合都要写各式各样的配置文件, 天啊, 配置文件的海洋. 如果这也叫所谓的高端 Java 技术, 我只能说 Shit! JSP 也没搞的这样折磨人过. 作者: Liu Liu 转载请注明出处 基本概念和典型实用例子。一、基本概念 Struts:作为基于 MVC 模式的 Web 应用最经典框架,两个项目Struts 和webwork已经集成,成为现在的Struts2。目前的最新版本是2.0.9(2007-7)。 Spring:是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。 Hibernate 是一个纯 Java 的对象关系映射和持久性框架,它允许您用 XML 配置文件把普通 Java 对象映射到关系数据库表。使用 Hibernate 能够节约大量项目开发时间,因为整个 JDBC 层都由这个框架管理。这意味着您的应用程序的数据访问层位于 Hibernate 之上,完全是从底层数据模型中抽象出来的。 三种技术到目前已经比较成熟,而且他们都是免费的!让我们对三者集成进行一个初览(简单而不专业): 我们用Struts实现从Web(网页,MVC中的View)到后台系统的映射(WebAction),然后由Spring管理这些Action,把它们作为Bean和其他对象一起处理。这些Bean之间处理业务逻辑、数据、系统状态等,且它们被Spring统一管理,为了区分,就算大概包括MVC的MC部分吧。然后需要持久化的数据由Spring和Hibernate之间的接口交由Hibernate处理(这个属于持久层)。 必须基础:只要Java基础,一点HTML知识、XML基础就可以了。本文的目的就是从零开始建立第一个Struts+Spring+Hibernate应用。即使它是最简单的,我们也希望初学者能够从中理解一些思想,其中也包括系统架构的设计思想。 二、环境搭建 我们坚持免费才是硬道理,开源才是好事情,所以我们全部使用开源免费的工具和软件。如果使用MyEclipse,其中的工具将有助于简化下面演示的工程开发,但本文不用。 所需软件包如下表:序号包下载地址和文件(包)名说明 1JDK5.0http://java.sun.com/javase/downloads/index.jsp JDK5.0 2Eclipse WTPEclipse IDE for Java EE Developers 下载All in One,这样不用自己下载其他插件包含网站开发的Eclipse,v3.3,下载All in One 3HibernateSynchronizer-3.1.9https://sourceforge.net/project/showfiles.php?group_id=99370 帮助开发Hibernate应用的Eclipse插件 4Hibernate3http://sourceforge.net/project/showfiles.php?group_id=40712hibernate3所指示的包Hibernate支持包 5Springhttp://sourceforge.net/project/showfiles.php?group_id=73357 spring-framework-2.0.6-with-dependencies.zip 6SpringIDE(可选)http://springide.org/updatesite/包名如 springide_updatesite_2.0.1_v200707300600.zip 7Strutshttp://struts.apache.org/download.cgi 为了较全的例子和文档,建议下载 struts-2.0.9-all.zip否则只下载lib:struts-2.0.9-lib.zip 8Tomcathttp://tomcat.apache.org?建议下载v5.5以上版本,应用服务器(支持JSP等)Apache项目之一 9MySQL Hibernate演示需要 1、下载了eclipse以后安装。在所安装的目录下有两个子目录plugins和features,这是两个放eclipse插件的目录,即可以通过拷贝需要的文件到这些目录里面,从而给eclipse添加新的功能。 2、将第3、6的包解压,将其中的plugins目录直接复制到eclipse安装目录下,选择“全部”替换。 3、运行eclipse,选择一个空目录作为工作区(WorkSpace),启动以后可以看到Welcome.html的欢迎界面。现在建立新工程FileNew
roject,在打开的New Project窗口中选择WebDynamic Web Project。输入Project name,在Target Runtime一项选择新建(New),选择你所安装的Apache Tomcat,在弹出窗口输入相关信息(Tomcat安装目录等)。 新建工程流程如下图。 工程结构如下: 其中我们要写的Java代码在Java Resource: src(以后直接称src)下,网站根目录内容在WebContent下,类所在根目录是WEB-INF/classes,Eclipse会自动将build/classes里面已经编译的类同步过去。向WEB-INF下的lib目录添加如下所列的jar包。 (1)这些包在下载解压后Spring,Struts,Hibernate的lib目录或者dist/module目录下面(如果不在,可以到网上google一把。列表中mysql-*.jar包是MySQL数据库的JDBC Driver)。也可以把所有lib和dist下的jar包拷贝过来(可以在系统复制这些jar包,然后到Eclipse里面选中WEB-INF里面的lib包,然后粘帖就可以了)。但要注意全拷贝可能会存在冲突,如struts*plugin.jar等包不能引入,否则不能运行。(2)这些Jar包是: antlr-2.7.2.jar cglib-nodep-2.1_3.jar commons-beanutils-1.6.jar commons-chain-1.1.jar commons-collections-2.1.1.jar commons-dbcp.jar commons-digester.jar commons-logging-1.0.4.jar commons-logging-api-1.1.jar commons-pool.jar commons-validator-1.3.0.jar dom4j-1.6.1.jar el-api.jar el-ri.jar freemarker-2.3.8.jar hibernate3.jar jsf-api.jar jta.jar mysql-connector-java-3.0.14-production-bin.jar ognl-2.6.11.jar oro-2.0.8.jar spring-hibernate3.jar spring.jar struts-config.xml struts-core-1.3.5.jar struts2-codebehind-plugin-2.0.9.jar struts2-config-browser-plugin-2.0.9.jar struts2-core-2.0.9.jar struts2-jasperreports-plugin-2.0.9.jar struts2-jfreechart-plugin-2.0.9.jar struts2-jsf-plugin-2.0.9.jar struts2-pell-multipart-plugin-2.0.9.jar struts2-plexus-plugin-2.0.9.jar struts2-sitegraph-plugin-2.0.9.jar struts2-sitemesh-plugin-2.0.9.jar struts2-spring-plugin-2.0.9.jar struts2-struts1-plugin-2.0.9.jar struts2-tiles-plugin-2.0.9.jar tiles-api-2.0.4.jar tiles-core-2.0.4.jar tiles-jsp-2.0.4.jar xwork-2.0.4.jar 三、开始工作在WebContent下建立index.jsp,建立方式如图。 index.jsp的内容如表,我们暂时不分析。
This is my JSP page.
用户名: 密码: 此时就可以运行该工程,忙了这么久,看看效果吧。运行方式:右键点击index.jsp,选择Run/Debug AsRun on Server,在弹出窗口中默认我们使用的Tomcat Server,点击finish完成。可以看到eclipse中内嵌的浏览器显示我们的网页。其中表单的输入在我们的工程中将得到输入数据(用户名和密码),这些数据会传给我们将要建立的Action处理。 现在来看看如何建立我们的Action。在src下新建一个package(包)名为action用于保存响应Web请求的Action类。在action包下新建Action类LoginAction(action.LoginAction)如下,注意类的继承关系。 package action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.validator.DynaValidatorForm; import org.springframework.web.struts.ActionSupport; //我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport publicclassLoginActionextendsActionSupport{ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("success"); } } 但是现在index.jsp的内容怎么和LoginAction的数据匹配呢,我们看到LoginAction的execute方法有一个属性ActionForm,于是我们建立一个类forms.UserInfoForm如下,继承ActionForm。 package forms; import org.apache.struts.action.ActionForm; publicclass UserInfoForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } publicvoid setUsername(String username) { this.username = username; } public String getPassword() { return password; } publicvoid setPassword(String password) { this.password = password; } } 有了两个头,又有了保持内容的类,现在看看我们如何用struts把他们联系起来吧。现在需要在WEB-INF下建立文件struts-config.xml。其中form-beans定义了表单是如何映射的,这里用我们刚刚定义的forms.UserInfoForm。 在 中定义了我们的Action。它的属性attribute指出Action的内容输入是我们自定义的ActionForm,path给Action赋予一个路径,input指明只接受index.jsp的输入, Struts2+Spring2+Hibernate3 simple example by Doer Liu@UTstarcom
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
struts
org.apache.struts2.dispatcher.FilterDispatcher
struts
/struts2spring2hib3bydoer/*
/*
org.springframework.web.context.ContextLoaderListener
doertest
org.apache.struts.action.ActionServlet
1
doertest
*.do
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp 通过web.xml两者联系上了。现在它们各自还需要一些配置。 Struts在我们的例子里比较简单,在build/class下面(最终会被eclipse同步到网站的WEB-INF/classes下面)建立struts.xml:
Spring的默认配置文件是WEB-INF/applicationContext.xml,目前其内容很简单,我们只是把struts的Bean放进来,如下:映射的规则:bean的name属性必须等于struts-config.xml里面定义的action的path属性,class就是这个bean的类action.LoginAction。
现在在WebContent下面建立success时重定向的目标success.html,方法和index.jsp类似,但选择THML类型,随便输入内容以便测试。这时候struts和Spring就简单的连接起来了。先停掉刚才运行起来的Tomcat,重新启动,运行index.jsp,点击网页中的按钮<添加>,看看有什么效果。现在,然我们简略描述一下数据和请求的流程。点击<添加>,index.jsp的这个表单发送的请求是login.do(

用户名: 密码: 此时就可以运行该工程,忙了这么久,看看效果吧。运行方式:右键点击index.jsp,选择Run/Debug AsRun on Server,在弹出窗口中默认我们使用的Tomcat Server,点击finish完成。可以看到eclipse中内嵌的浏览器显示我们的网页。其中表单的输入在我们的工程中将得到输入数据(用户名和密码),这些数据会传给我们将要建立的Action处理。 现在来看看如何建立我们的Action。在src下新建一个package(包)名为action用于保存响应Web请求的Action类。在action包下新建Action类LoginAction(action.LoginAction)如下,注意类的继承关系。 package action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.validator.DynaValidatorForm; import org.springframework.web.struts.ActionSupport; //我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport publicclassLoginActionextendsActionSupport{ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("success"); } } 但是现在index.jsp的内容怎么和LoginAction的数据匹配呢,我们看到LoginAction的execute方法有一个属性ActionForm,于是我们建立一个类forms.UserInfoForm如下,继承ActionForm。 package forms; import org.apache.struts.action.ActionForm; publicclass UserInfoForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } publicvoid setUsername(String username) { this.username = username; } public String getPassword() { return password; } publicvoid setPassword(String password) { this.password = password; } } 有了两个头,又有了保持内容的类,现在看看我们如何用struts把他们联系起来吧。现在需要在WEB-INF下建立文件struts-config.xml。其中form-beans定义了表单是如何映射的,这里用我们刚刚定义的forms.UserInfoForm。 在 中定义了我们的Action。它的属性attribute指出Action的内容输入是我们自定义的ActionForm,path给Action赋予一个路径,input指明只接受index.jsp的输入, Struts2+Spring2+Hibernate3 simple example by Doer Liu@UTstarcom