Struts2+Spring+Hibernate整合入门详解

10年02月04日

  1. 基本概念和典型实用例子。 
  2.  
  3. 一、基本概念  
  4.  
  5.      Struts:作为基于 MVC 模式的 Web 应用最经典框架,两个项目Struts 和webwork已经集成,成为现在的Struts2。目前的最新版本是2.0.92007-7)。 
  6.  
  7.      Spring: 是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。 
  8.  
  9.      Hibernate 是一个纯 Java 的对象关系映射和持久性框架,它允许您用 XML 配置文件把普通 Java 对象映射到关系数据库表。使用 Hibernate 能够节约大量项目开发时间,因为整个 JDBC 层都由这个框架管理。这意味着您的应用程序的数据访问层位于 Hibernate 之上,完全是从底层数据模型中抽象出来的。  
  10.  
  11.      三种技术到目前已经比较成熟,而且他们都是免费的!让我们对三者集成进行一个初览(简单而不专业): 
  12.  
  13.      我们用Struts实现从Web(网页,MVC中的View)到后台系统的映射(WebàAction),然后由Spring管理这些Action,把它们作为Bean和其他对象一起处理。这些Bean之间处理业务逻辑、数据、系统状态等,且它们被Spring统一管理,为了区分,就算大概包括MVC的MC部分吧。然后需要持久化的数据由Spring和Hibernate之间的接口交由Hibernate处理(这个属于持久层)。 
  14.  
  15.      必须基础:只要Java基础,一点HTML知识、XML基础就可以了。本文的目的就是从零开始建立第一个Struts+Spring+Hibernate应用。即使它是最简单的,我们也希望初学者能够从中理解一些思想,其中也包括系统架构的设计思想。  
  16.  
  17. 二、环境搭建  
  18.  
  19.      我们坚持免费才是硬道理,开源才是好事情,所以我们全部使用开源免费的工具和软件。如果使用MyEclipse,其中的工具将有助于简化下面演示的工程开发,但本文不用。 
  20.  
  21.      所需软件包如下表: 
  22.  
  23. 序号 
  24. 包 
  25. 下载地址和文件(包)名 
  26. 说明 
  27.   
  28. 1 
  29. JDK5.0 
  30. http://java.sun.com/javase/downloads/index.jsp 
  31. JDK5.0 
  32.   
  33. 2 
  34. Eclipse WTP 
  35. Eclipse IDE for Java EE Developers 
  36.  
  37. 下载All in One,这样不用自己下载其他插件 
  38. 包含网站开发的Eclipse,v3.3,下载All in One 
  39.   
  40. 3 
  41. HibernateSynchronizer-3.1.9 
  42. https://sourceforge.net/project/showfiles.php?group_id=99370 
  43. 帮助开发Hibernate应用的Eclipse插件 
  44.   
  45. 4 
  46. Hibernate3 
  47. http://sourceforge.net/project/showfiles.php?group_id=40712 à hibernate3所指示的包 
  48. Hibernate支持包 
  49.   
  50. 5 
  51.  Spring 
  52. http://sourceforge.net/project/showfiles.php?group_id=73357 
  53.  
  54.   
  55.  spring-framework-2.0.6-with-dependencies.zip 
  56.   
  57. 6 
  58. SpringIDE(可选) 
  59. http://springide.org/updatesite/ 包名如 
  60. springide_updatesite_2.0.1_v200707300600.zip 
  61.   
  62. 7 
  63. Struts 
  64. http://struts.apache.org/download.cgi 
  65.  
  66.   
  67. 为了较全的例子和文档,建议下载 
  68. struts-2.0.9-all.zip否则只下载lib:struts-2.0.9-lib.zip 
  69.   
  70. 8 
  71. Tomcat 
  72. http://tomcat.apache.org? 
  73. 建议下载v5.5以上版本,应用服务器(支持JSP等)Apache项目之一 
  74.   
  75. 9 
  76. MySQL 
  77.    
  78. Hibernate演示需要  
  79.   
  80.  
  81.      1、下载了eclipse以后安装。在所安装的目录下有两个子目录plugins和features,这是两个放eclipse插件的目录,即可以通过拷贝需要的文件到这些目录里面,从而给eclipse添加新的功能。 
  82.  
  83.      2、将第36的包解压,将其中的plugins目录直接复制到eclipse安装目录下,选择“全部”替换。 
  84.  
  85.  
  86.  
  87.  
  88.      3、运行eclipse,选择一个空目录作为工作区(WorkSpace),启动以后可以看到Welcome.html的欢迎界面。现在建立新工程FileàNewàProject,在打开的New Project窗口中选择WebàDynamic Web Project。输入Project name,在Target Runtime一项选择新建(New),选择你所安装的Apache Tomcat,在弹出窗口输入相关信息(Tomcat安装目录等)。 
  89.  
  90.      新建工程流程如下图。 
  91.  
  92.  
  93.  
  94.  
  95. 工程结构如下: 
  96.  
  97.    
  98.  
  99. 其中我们要写的Java代码在Java Resource: src(以后直接称src)下,网站根目录内容在WebContent下,类所在根目录是WEB-INF/classes,Eclipse会自动将build/classes里面已经编译的类同步过去。 
  100.  
  101. 向WEB-INF下的lib目录添加如下所列的jar包。  
  102.  
  103. 1)这些包在下载解压后Spring,Struts,Hibernate的lib目录或者dist/module目录下面(如果不在,可以到网上google一把。列表中mysql-*.jar包是MySQL数据库的JDBC Driver)。也可以把所有lib和dist下的jar包拷贝过来(可以在系统复制这些jar包,然后到Eclipse里面选中WEB-INF里面的lib包,然后粘帖就可以了)。但要注意全拷贝可能会存在冲突,如struts*plugin.jar等包不能引入,否则不能运行。 
  104.  
  105. 2)这些Jar包是: 
  106.  
  107. antlr-2.7.2.jar 
  108.  
  109. cglib-nodep-2.1_3.jar 
  110.  
  111. commons-beanutils-1.6.jar 
  112.  
  113. commons-chain-1.1.jar 
  114.  
  115. commons-collections-2.1.1.jar 
  116.  
  117. commons-dbcp.jar 
  118.  
  119. commons-digester.jar 
  120.  
  121. commons-logging-1.0.4.jar 
  122.  
  123. commons-logging-api-1.1.jar 
  124.  
  125. commons-pool.jar 
  126.  
  127. commons-validator-1.3.0.jar 
  128.  
  129. dom4j-1.6.1.jar 
  130.  
  131. el-api.jar 
  132.  
  133. el-ri.jar 
  134.  
  135. freemarker-2.3.8.jar 
  136.  
  137. hibernate3.jar 
  138.  
  139. jsf-api.jar 
  140.  
  141. jta.jar 
  142.  
  143. mysql-connector-java-3.0.14-production-bin.jar 
  144.  
  145. ognl-2.6.11.jar 
  146.  
  147. oro-2.0.8.jar 
  148.  
  149. spring-hibernate3.jar 
  150.  
  151. spring.jar 
  152.  
  153. struts-config.xml 
  154.  
  155. struts-core-1.3.5.jar 
  156.  
  157. struts2-codebehind-plugin-2.0.9.jar 
  158.  
  159. struts2-config-browser-plugin-2.0.9.jar 
  160.  
  161. struts2-core-2.0.9.jar 
  162.  
  163. struts2-jasperreports-plugin-2.0.9.jar 
  164.  
  165. struts2-jfreechart-plugin-2.0.9.jar 
  166.  
  167. struts2-jsf-plugin-2.0.9.jar 
  168.  
  169. struts2-pell-multipart-plugin-2.0.9.jar 
  170.  
  171. struts2-plexus-plugin-2.0.9.jar 
  172.  
  173. struts2-sitegraph-plugin-2.0.9.jar 
  174.  
  175. struts2-sitemesh-plugin-2.0.9.jar 
  176.  
  177. struts2-spring-plugin-2.0.9.jar 
  178.  
  179. struts2-struts1-plugin-2.0.9.jar 
  180.  
  181. struts2-tiles-plugin-2.0.9.jar 
  182.  
  183. tiles-api-2.0.4.jar 
  184.  
  185. tiles-core-2.0.4.jar 
  186.  
  187. tiles-jsp-2.0.4.jar 
  188.  
  189. xwork-2.0.4.jar 
  190.  
  191. 三、开始工作  
  192.  
  193. 在WebContent下建立index.jsp,建立方式如图。 
  194.  
  195.  
  196.  
  197.  
  198. index.jsp的内容如表,我们暂时不分析。 
  199.  
  200. <%@ page contentType="text/html; charset=UTF-8" %> 
  201.  
  202. <html> 
  203.  
  204.   <head> <title>Example by Doer Liu@UTStarcom sz </title></head> 
  205.  
  206.   <body> 
  207.  
  208.     This is my JSP page. <br> 
  209.  
  210.     <form name="userInfoForm" action="login.do" method="post"
  211.  
  212.     用户名:  
  213.  
  214.     <input name="username" type="text" /> 
  215.  
  216.     密码: 
  217.  
  218.     <input name="password" type="password"
  219.  
  220.     <input name="sub" type="submit" value="增加" /> 
  221.  
  222.     <input name="res" type="reset" value="重置" /> 
  223.  
  224.   </form> 
  225.  
  226.   </body> 
  227.  
  228. </html> 
  229.   
  230.  
  231. 此时就可以运行该工程,忙了这么久,看看效果吧。 
  232.  
  233. 运行方式:右键点击index.jsp,选择Run/Debug AsàRun on Server,在弹出窗口中默认我们使用的Tomcat Server,点击finish完成。可以看到eclipse中内嵌的浏览器显示我们的网页。其中表单的输入在我们的工程中将得到输入数据(用户名和密码),这些数据会传给我们将要建立的Action处理。 
  234.  
  235.    
  236.  
  237. 现在来看看如何建立我们的Action。在src下新建一个package(包)名为action用于保存响应Web请求的Action类。在action包下新建Action类LoginAction(action.LoginAction)如下,注意类的继承关系。 
  238.  
  239. package action; 
  240.  
  241. import javax.servl, et.http.HttpServletRequest; 
  242.  
  243. import javax.servlet.http.HttpServletResponse; 
  244.  
  245. import org.apache.struts.action.ActionForm; 
  246.  
  247. import org.apache.struts.action.ActionForward; 
  248.  
  249. import org.apache.struts.action.ActionMapping; 
  250.  
  251. import org.apache.struts.validator.DynaValidatorForm; 
  252.  
  253. import org.springframework.web.struts.ActionSupport;  
  254.  
  255. //我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport 
  256.  
  257. public class LoginAction extends ActionSupport{  
  258.  
  259.     public ActionForward execute( 
  260.  
  261.              ActionMapping mapping, 
  262.  
  263.              ActionForm form, 
  264.  
  265.              HttpServletRequest request, 
  266.  
  267.              HttpServletResponse response) { 
  268.  
  269.        return mapping.findForward("success"); 
  270.  
  271.         
  272.  
  273.     } 
  274.  
  275.   
  276.  
  277. 但是现在index.jsp的内容怎么和LoginAction的数据匹配呢,我们看到LoginAction的execute方法有一个属性ActionForm,于是我们建立一个类forms.UserInfoForm如下,继承ActionForm。 
  278.  
  279. package forms; 
  280.  
  281. import org.apache.struts.action.ActionForm; 
  282.  
  283. public class UserInfoForm extends ActionForm { 
  284.  
  285.     private String username; 
  286.  
  287.     private String password;  
  288.  
  289.     public String getUsername() { return username; } 
  290.  
  291.     public void setUsername(String username)  
  292.  
  293.     { this.username = username; }  
  294.  
  295.     public String getPassword() { return password; } 
  296.  
  297.     public void setPassword(String password)  
  298.  
  299.     { this.password = password; } 
  300.  
  301. }  
  302.   
  303.  
  304. 有了两个头,又有了保持内容的类,现在看看我们如何用struts把他们联系起来吧。 
  305.  
  306. 现在需要在WEB-INF下建立文件struts-config.xml。其中form-beans定义了表单是如何映射的,这里用我们刚刚定义的forms.UserInfoForm。 
  307.  
  308. <?xml version=”1.0” encoding="ISO-8859-1"?> 
  309.  
  310. <!DOCTYPE struts-config PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 
  311.         "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">  
  312.  
  313. <struts-config> 
  314.  
  315.     <form-beans> 
  316.  
  317.        <form-bean name="userInfoForm" type="forms.UserInfoForm"/> 
  318.  
  319.     </form-beans>      
  320.  
  321.     <action-mappings> 
  322.  
  323.        <action attribute="userInfoForm" path="/login" input="/index.jsp" 
  324.                type="org.springframework.web.struts.DelegatingActionProxy" 
  325.  
  326.               name="userInfoForm" scope="session" validate="false"
  327.  
  328.            <forward name="success" path="/success.html"/> 
  329.  
  330.        </action> 
  331.  
  332.     </action-mappings> 
  333.  
  334. </struts-config> 
  335.   
  336.  
  337. 在<action-mappings>中定义了我们的Action。它的属性attribute指出Action的内容输入是我们自定义的ActionForm,path给Action赋予一个路径,input指明只接受index.jsp的输入,<forward标签定义了当Action返回"success"的时候,将定向到/success.html这个网页。 最重要的是type,它定义了这个处理这个请求的Action类,本来应该是我们自定义的LoginAction,但我们却用了spring的一个Action,为什么?因为我们要用Spring管理我们自定义的Action。看,struts和Spring在这里就开始连接起来了。  
  338.  
  339. 但还有两个问题,Struts和Spring又是如何知道对方的存在,如何沟通呢?Spring如何知道把控制权交给我们自定义的LoginAction呢? 
  340.  
  341. 我们先来解决第一个问题,web.xml是Tomcat这些应用服务器管理的,因此我们在这里将struts和Spring配置联系起来。这是整个web.xml。请看注释。 
  342.  
  343. <?xml version="1.0" encoding="UTF-8"?> 
  344.  
  345. <web-app version="2.5" id="WebApp" 
  346.  
  347.     xmlns="http://java.sun.com/xml/ns/javaee"  
  348.  
  349.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  350.  
  351.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  352.  
  353.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
  354.  
  355. <display-name> Struts2+Spring2+Hibernate3 simple example by Doer Liu@UTstarcom</display-name> 
  356.  
  357. <!– filter就理解为一些对网页请求的过滤吧 –> 
  358.  
  359. <!– encodingFilter是为了处理国际化,交由Spring处理,设置为UTF-8 –> 
  360.  
  361. <filter> 
  362.  
  363. <filter-name>encodingFilter</filter-name> 
  364.  
  365. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class
  366.  
  367. <init-param> 
  368.  
  369. <param-name>encoding</param-name> 
  370.  
  371. <param-value>UTF-8</param-value> 
  372.  
  373. </init-param>  
  374.  
  375. </filter> 
  376.  
  377. <!– struts 是struts的filter,这个定义就将可以将请求交给struts过滤一番了 –> 
  378.  
  379. <filter> 
  380.  
  381. <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class
  382.  
  383. </filter>  
  384.  
  385. <!– 那么哪些请求交给struts过滤呢,这里包括 /struts2spring2hib3bydoer下和根目录/下的所有请求–> 
  386.  
  387. <filter-mapping> 
  388.  
  389. <filter-name>struts</filter-name> 
  390.  
  391. <url-pattern>/struts2spring2hib3bydoer/*</url-pattern> 
  392.  
  393. <url-pattern>/*</url-pattern> 
  394.  
  395. </filter-mapping>  
  396.  
  397. <!– 定义一个监听器,处理整个WebContext,简单的理解为整个网站的上下文环境监听器吧 这个属于Spring–> 
  398.  
  399. <listener> 
  400.  
  401.   <listener-class> 
  402.  
  403.    org.springframework.web.context.ContextLoaderListener 
  404.  
  405.   </listener-class> 
  406.  
  407. </listener>  
  408.  
  409. <!– servlet定义一个servlet为struts的ActionServlet –> 
  410.  
  411.     <servlet> 
  412.  
  413.        <servlet-name>doertest</servlet-name> 
  414.  
  415.        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
  416.  
  417.        <load-on-startup>1</load-on-startup> 
  418.  
  419.     </servlet>  
  420.  
  421. <!– servlet-mapping将servlet和请求对应起来,这里是所有*.do的请求交由上面定义的doertest处理 –> 
  422.  
  423.     <servlet-mapping> 
  424.  
  425.        <servlet-name>doertest</servlet-name> 
  426.  
  427.         <url-pattern>*.do</url-pattern> 
  428.  
  429.     </servlet-mapping>  
  430.  
  431. <!– 定义默认返回页,如输入http://127.0.0.1/那么根目录下的index.html或者其他文件就被请求 –> 
  432.  
  433.     <welcome-file-list> 
  434.  
  435.        <welcome-file>index.html</welcome-file> 
  436.  
  437.        <welcome-file>index.htm</welcome-file> 
  438.  
  439.        <welcome-file>index.jsp</welcome-file> 
  440.  
  441.        <welcome-file>default.html</welcome-file> 
  442.  
  443.        <welcome-file>default.htm</welcome-file> 
  444.  
  445.        <welcome-file>default.jsp</welcome-file> 
  446.  
  447.     </welcome-file-list> 
  448.  
  449. </web-app>  
  450.   
  451.  
  452. 通过web.xml两者联系上了。现在它们各自还需要一些配置。 
  453.  
  454. Struts在我们的例子里比较简单,在build/class下面(最终会被eclipse同步到网站的WEB-INF/classes下面)建立struts.xml: 
  455.  
  456. <!DOCTYPE struts PUBLIC 
  457.  
  458.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
  459.  
  460.         "http://struts.apache.org/dtds/struts-2.0.dtd">  
  461.  
  462. <struts> 
  463.  
  464.     <include file="struts-default.xml" /> 
  465.  
  466. </struts> 
  467.   
  468.  
  469. Spring的默认配置文件是WEB-INF/applicationContext.xml,目前其内容很简单,我们只是把struts的Bean放进来,如下: 
  470.  
  471. 映射的规则:bean的name属性必须等于struts-config.xml里面定义的action的path属性,class就是这个bean的类action.LoginAction。 
  472.  
  473. <?xml version="1.0" encoding="UTF-8"?>   
  474.  
  475. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">    
  476.  
  477. <beans> 
  478.  
  479.   <!– Action Bean , 对应的部分 struts-config.xml form-bean and action-mappings –> 
  480.  
  481.   <bean name="/login" class="action.LoginAction " singleton="false">    
  482.  
  483.   </property> 
  484.  
  485.   </bean>   
  486.  
  487. </beans> 
  488.   
  489.  
  490. 现在在WebContent下面建立success时重定向的目标success.html,方法和index.jsp类似,但选择THML类型,随便输入内容以便测试。这时候struts和Spring就简单的连接起来了。先停掉刚才运行起来的Tomcat,重新启动,运行index.jsp,点击网页中的按钮<添加>,看看有什么效果。 
  491.  
  492. 现在,然我们简略描述一下数据和请求的流程。 
  493.  
  494. 点击<添加>,index.jsp的这个表单发送的请求是login.do(<form name="userInfoForm" action="login.do" method="post">),请求被传给后台,生成了doertest(处理*.do的请求)集合的一个servlet,然后传到path为/login的action,被Spring的org.springframework.web.struts.DelegatingActionProxy处理,该类找到name是/login的Bean,转交处理权,等待结果。这个Bean就是我们的action.LoginAction。我们的execute中返回一个forward是"success"对应的网页,就是success.html。所以……,你已经看到了,struts和spring已经联系起来了。OK!  
  495.  
  496. 下面我们需要把hibernate整合进来了,本来考虑到例子的简单性,打算用更简单的类,但既然用三者整合,就是要有良好的设计。我们需要以下几个层次的设计:表现层,业务层,持久层。表现层就是网页;表现层和业务层之间的接口就是网页和action的接口,由struts处理了;业务层包括业务逻辑和事务管理等,由Spring管理,我们只是建立具体处理对象;业务层和持久层之间由数据访问对象DAO处理,持久层交给hibernate处理。贯穿这些层的是领域对象(domain object),即表示现实世界的对象(base object),如订单对象,人物信息对象等等。现在看看我们需要的剩余设计结构。 
  497.  
  498. 业务层:放进包service 
  499.  
  500. 数据访问对象: 放进包dao 
  501.  
  502. 持久层:hibernate 
  503.  
  504. 领域对象:放进包bo 
  505.  
  506. 既然领域对象是最基本的对象,我们就得首先建立,本例中,可以借助HibernateSynchronizer生成: 
  507.  
  508. 首先在mysql中创建表 
  509.  
  510. CREATE TABLE `userinfo` (                                                                                                                                                      
  511.  
  512.             `id` int(11) primary key auto_increment,                                                                                                                                        
  513.  
  514.             `username` varchar(20) default NULL,                                                                                                                                          
  515.  
  516.             `Password` varchar(20) default NULL                                                                                                                                        
  517.  
  518.           ) 
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525. 在Eclipse中,建立hibernate的map文件:右键点击WEB-INF(或其他目录都可,后面会提到如何使用该文件),选择newàother,在弹出窗口中选择Hibernate Mapping File。在弹出窗口输入url,用户名和密码后点击Refresh,可以看到你选择的数据库的表,选中userinfo表。输入包bo,用来保存从数据库提取的领域对象。在Properties中将Id generator改为native。 
  526.  
  527. HibernateSynchronizer将在WEB-INF下生成Uerinfo.hbm.xml文件。 
  528.  
  529.   
  530.  
  531.  
  532. 右键点击该文件,选择Hibernate SynchronizeràSynchronize Files。将自动生成bo.base.BaseUserinfo和bo.Userinfo类。这两个就是领域对象。工具正好啊! 
  533.  
  534. 现在bo包里面的对象自动生成了。 
  535.  
  536. 下面建立dao包中对象dao.UserinfoDAO: 
  537.  
  538. package dao; 
  539.  
  540. import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
  541.  
  542. import bo.Userinfo; 
  543.  
  544. //从HibernateDaoSupport继承,从而可以使用getHibernateTemplate().save保存数据。 
  545.  
  546. public class UserinfoDAO extends HibernateDaoSupport {  
  547.  
  548.     public void save(Userinfo userinfo) { 
  549.  
  550.        System.out.println("saved!"); 
  551.  
  552.        getHibernateTemplate().save(userinfo); 
  553.  
  554.     }  
  555.  
  556. }  
  557.   
  558.  
  559. 再建立service包中的业务对象,service.UserinfoService: 
  560.  
  561. package service; 
  562.  
  563. import dao.UserinfoDAO; 
  564.  
  565. import bo.Userinfo; 
  566.  
  567. package service; 
  568.  
  569. public class LoginService { 
  570.  
  571.     private UserinfoDAO userinfoDAO;  
  572.  
  573.     public UserinfoDAO getUserinfoDAO() { 
  574.  
  575.        System.out.println("shit"); 
  576.  
  577.        return userinfoDAO; 
  578.  
  579.     }  
  580.  
  581.     public void setUserinfoDAO(UserinfoDAO userinfoDAO) { 
  582.  
  583.        System.out.println("LoginService:setAdminDAO"); 
  584.  
  585.        this.userinfoDAO = userinfoDAO; 
  586.  
  587.     }  
  588.  
  589.     public void saveinfo(Userinfo userinfo) { 
  590.  
  591.          //进行相关业务处理,比如validate之类的。 
  592.  
  593.        userinfoDAO.save(userinfo); 
  594.  
  595.     } 
  596.  
  597. } 
  598.   
  599.  
  600. 好了,所有我们应该建立的对象都生成了,现在把hibernate整合进来再进行一些后续处理。 
  601.  
  602. 首先,在applicationContext.xml文件中加入必需的Bean定义,成为如下内容,注意其中注释。 
  603.  
  604. <?xml version="1.0" encoding="UTF-8"?>   
  605.  
  606. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">    
  607.  
  608. <beans> 
  609.  
  610.   <!– Action Bean , 对应的部分 struts-config.xml form-bean and action-mappings –> 
  611.  
  612.   <bean name="/login" class="action.LoginAction" singleton="false"> 
  613.  
  614.   <!– property是该bean的属性,如下面的property,在类LoginAction 中必有字段定义LoginService loginService;和getLoginService()以及setLoginService方法–> 
  615.  
  616.   <property name="loginService"> 
  617.  
  618.     <ref bean="loginService" /> 
  619.  
  620.   </property>   
  621.  
  622.   </bean>   
  623.  
  624. <!– 定义DBCP的数据库连接属性,该数据源会被hibernate使用,DBCP是连接池开源包,其中的url,username,password需要替换成你的数据库访问属性 –> 
  625.  
  626. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  627.    destroy-method="close"> 
  628.  
  629.   <property name="driverClassName"> 
  630.  
  631.    <value>com.mysql.jdbc.Driver</value> 
  632.  
  633.   </property> 
  634.  
  635.   <property name="url"> 
  636.  
  637.    <value>jdbc:mysql://localhost/mysql</value> 
  638.  
  639.   </property> 
  640.  
  641.   <property name="username"> 
  642.  
  643.    <value>root</value> 
  644.  
  645.   </property> 
  646.  
  647.   <property name="password"> 
  648.  
  649.    <value>doerliu</value> 
  650.  
  651.   </property> 
  652.  
  653. </bean>  
  654.  
  655. <!– 配置sessionFactory, 为Hibernate配置属性  –> 
  656.  
  657. <bean id="sessionFactory" class="org.springframework
  658.                        .orm.hibernate3.LocalSessionFactoryBean"> 
  659.  
  660.   <property name="dataSource"> 
  661.  
  662.    <ref local="dataSource" /> 
  663.  
  664.   </property> 
  665.  
  666.   <property name="mappingResources"> 
  667.  
  668.    <list> 
  669.  
  670.     <!—Hibernate的map 文件在这里配置了,注意文件的相对位置。 –> 
  671.  
  672.     <value>../Userinfo.hbm.xml</value> 
  673.  
  674.    </list> 
  675.  
  676.   </property> 
  677.  
  678.   <property name="hibernateProperties"> 
  679.  
  680.    <props> 
  681.  
  682.     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
  683.  
  684.     <prop key="hibernate.show_sql">true</prop> 
  685.  
  686.    </props> 
  687.  
  688.   </property> 
  689.  
  690. </bean>  
  691.  
  692. <!– 业务层的事务管理由该bean管理–> 
  693.  
  694. <bean id="transactionManager" class="org.springframework
  695.                   .orm.hibernate3.HibernateTransactionManager"> 
  696.  
  697.   <property name="sessionFactory"> 
  698.  
  699.    <ref local="sessionFactory" /> 
  700.  
  701.   </property> 
  702.  
  703. </bean>  
  704.  
  705. <!– 事务处理环境(代理)配置,为业务处理LoginService定义一个事务处理*****–> 
  706.  
  707. <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
  708.  
  709.   <property name="transactionManager"> 
  710.  
  711.    <ref bean="transactionManager" /> 
  712.  
  713.   </property> 
  714.  
  715.   <property name="target"> 
  716.  
  717.    <ref local="loginService" /> 
  718.  
  719.   </property> 
  720.  
  721.   <property name="transactionAttributes"> 
  722.  
  723.    <props> 
  724.  
  725.     <prop key="save*">PROPAGATION_REQUIRED</prop> 
  726.  
  727.     <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
  728.  
  729.     <prop key="is*">PROPAGATION_REQUIRED,readOnly</prop> 
  730.  
  731.    </props> 
  732.  
  733.   </property> 
  734.  
  735. </bean>  
  736.  
  737. <!– 业务处理Bean定义 –> 
  738.  
  739. <bean id="loginService" class="service.LoginService"> 
  740.  
  741.   <property name="userinfoDAO"> 
  742.  
  743.    <ref bean="userinfoDAO" /> 
  744.  
  745.   </property> 
  746.  
  747. </bean>  
  748.  
  749. <!– 数据访问对象的Bean –> 
  750.  
  751. <bean id="userinfoDAO" class="dao.UserinfoDAO"> 
  752.  
  753.   <property name="sessionFactory"><ref local="sessionFactory"/></property> 
  754.  
  755. </bean>  
  756.  
  757. </beans> 
  758.   
  759.  
  760. 最后,LoginAction可以处理请求并和业务层进行交流了。因此需要增加实质性内容: 
  761.  
  762. package action;  
  763.  
  764. /* @sample for training. 
  765.  
  766. * @author doer.liu@utstarcom 
  767.  
  768. * @date 2007-7-30 
  769.  
  770. */ 
  771.  
  772. import javax.servlet.http.HttpServletRequest; 
  773.  
  774. import javax.servlet.http.HttpServletResponse;  
  775.  
  776. import org.apache.struts.action.ActionForm; 
  777.  
  778. import org.apache.struts.action.ActionForward; 
  779.  
  780. import org.apache.struts.action.ActionMapping; 
  781.  
  782. import org.springframework.web.struts.ActionSupport;  
  783.  
  784. import bo.Userinfo;  
  785.  
  786. import forms.UserInfoForm;  
  787.  
  788. import service.LoginService;  
  789.  
  790. //我们继承spring提供的Action衍生类org.springframework.web.struts.ActionSupport 
  791.  
  792. public class LoginAction extends ActionSupport {  
  793.  
  794.      LoginService loginService;  
  795.  
  796.      public ActionForward execute(ActionMapping mapping, ActionForm form, 
  797.  
  798.               HttpServletRequest request, HttpServletResponse response) { 
  799.  
  800.          UserInfoForm userInfoForm = (UserInfoForm) form; 
  801.  
  802.          String username = userInfoForm.getUsername(); 
  803.  
  804.          String password = userInfoForm.getPassword(); 
  805.  
  806.          Userinfo userinfo = new Userinfo(); 
  807.  
  808.          userinfo.setUsername(username); 
  809.  
  810.          userinfo.setPassword(password); 
  811.  
  812.          loginService.saveinfo(userinfo);// 保存前台的数据,插入数据库 
  813.  
  814.          return mapping.findForward("success"); //返回页。 
  815.  
  816.      }  
  817.  
  818.      public LoginService getLoginService() { 
  819.  
  820.          return loginService; 
  821.  
  822.      }  
  823.  
  824.      public void setLoginService(LoginService loginService) { 
  825.  
  826.           System.out.println("setLoginService=" + loginService); 
  827.  
  828.          this.loginService = loginService; 
  829.  
  830.      } 
  831.  
  832.   
  833.  
  834. Ok!整个流程到此就走通了。运行看看吧。还有什么说的呢,动手开始吧,在此基础上不断修改测试,再参考相关文档,一切都将越来越简单!——有问题,看日志! 






相关文章:

  1. Struts 与 Spring, Hibernate集成的大概思路
  2. 【Struts2学习要点】如何设置开发模式
  3. 通过java.net.URL类抓取某个网页的内容
  4. Apache+Tomcat+Php+Mysql的集成
  5. 初学者如何学习J2SE直到J2EE相关进阶视频点评



  • 原文链接: http://www.astesys.com/softdev/java/633.html
  • 转载文章请注明: 爱思特
  • Tags: , , 分类: Java

    发表评论