ssh整合方法 含源码

二、最简单的SSH程序

概要
本文将完成最常见的login功能。
1.最简单的Struts程序
2.集成Spring和Hibernate
3.数据访问层采用JPA


1.最简单的Struts程序
说它是Struts程序是因为没有Struts运行不了,说它最简单是因为仅仅执行了一个转发。
1)配置Struts
1.1)在web.xml文件中加入以下配置:

  1. <filter>
  2.         <filter-name>Struts2</filter-name>
  3.         <filter-class>
  4.             org.apache.struts2.dispatcher.FilterDispatcher
  5.         </filter-class>
  6.     </filter>
  7.  
  8.     <filter-mapping>
  9.         <filter-name>Struts2</filter-name>
  10.         <url-pattern>/*</url-pattern>
  11.  </filter-mapping>

添加后的完整web.xml如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app id="bitrac" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  3.     <display-name>Bitrac Blog</display-name>
  4.    
  5.     <filter>
  6.         <filter-name>Struts2</filter-name>
  7.         <filter-class>
  8.             org.apache.struts2.dispatcher.FilterDispatcher
  9.         </filter-class>
  10.     </filter>
  11.  
  12.     <filter-mapping>
  13.         <filter-name>Struts2</filter-name>
  14.         <url-pattern>/*</url-pattern>
  15.     </filter-mapping>
  16.     
  17.     <welcome-file-list>
  18.         <welcome-file>index.jsp</welcome-file>
  19.     </welcome-file-list>
  20. </web-app>

1.2)在Bitrac/src下新建struts.xml文件(注:不带盘符的指在Eclipse中操作,以后不再说明),内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.    
  6. <struts>
  7.     <constant name="struts.devMode" value="true" />
  8.     <constant name="struts.configuration.xml.reload" value="true" />
  9.     <constant name="struts.action.extension" value="jspx" />
  10.    
  11.     <package name="default" extends="struts-default">
  12.         <action name="admin">
  13.             <result>/admin/index.jsp</result>
  14.         </action>     
  15.     </package>  
  16. </struts>

2)新建/admin/index.jsp文件(这样的形式指在Bitrac/WebRoot新建目录admin和文件index.jsp)内容如下:
  1. <%@ page contentType="text/html; charset=UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6.     <head>
  7.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8.         <title> Struts Test</title>
  9.     </head>
  10.     <body>
  11.         <p>Hello From Struts</p>
  12.     </body>
  13. </html>

修改/index.jsp,内容如下:
  1. <%@ page contentType="text/html; charset=UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7.     <meta http-equiv="refresh" content="0;url=admin.jspx" />
  8. </head>
  9. <body>
  10.     <p>Loading ...</p>
  11. </body>
  12. </html>

3)  运行
点击eclipse工具条上的按钮启动Tomcat,
浏览http://localhost:8080/bitrac/,正常的话应该会看到“Hello From Struts”。
2.集成Spring和Hibernate
1)  Struts2和Spring2集成
1.1)将D:/JavaTools/struts-2.1.2/lib/下的
struts2-spring-plugin-2.1.2.jar复制到
D:/Project/Bitrac/WebRoot/WEB-INF/lib/
1.2)在web.xml文件中加入Spring配置:
<!--默认加载/WEB-INF 目录下的applicationContext.xml -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
加入后完整的文件内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app id="bitrac" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  3.     <display-name>Bitrac Blog</display-name>
  4.    
  5.     <filter>
  6.         <filter-name>Struts2</filter-name>
  7.         <filter-class>
  8.             org.apache.struts2.dispatcher.FilterDispatcher
  9.         </filter-class>
  10.     </filter>
  11.  
  12.     <filter-mapping>
  13.         <filter-name>Struts2</filter-name>
  14.         <url-pattern>/*</url-pattern>
  15.     </filter-mapping>
  16.    
  17.     <!--默认加载/WEB-INF 目录下的applicationContext.xml -->
  18.     <listener>
  19.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  20.     </listener>
  21.    
  22.     <welcome-file-list>
  23.         <welcome-file>index.jsp</welcome-file>
  24.     </welcome-file-list>
  25.  
  26. </web-app>

    1.3)新建Struts配置文件Bitrac/src/default.xml,内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.    
  6. <struts>
  7.     <package name="default" extends="struts-default">
  8.         <action name="admincp">
  9.             <result>/admin/login.jsp</result>
  10.         </action>     
  11.     </package>
  12. </struts>

这个配置文件将用来存放前台的action配置
    1.4)新建Struts配置文件Bitrac/src/admin.xml,内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.    
  6. <struts>
  7.     <package name="admin" extends="struts-default" namespace="/admin">
  8.         <action name="login" class="adminAction" method="login">
  9.             <result name="success">/admin/index.jsp</result>
  10.             <result name="input">/admin/login.jsp</result>
  11.         </action>     
  12.     </package>
  13. </struts>

这个文件将用来存放后台管理界面的Action配置
    1.5)修改Bitrac/src/struts.xml,内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  5.    
  6. <struts>
  7.     <constant name="struts.devMode" value="true" />
  8.     <constant name="struts.configuration.xml.reload" value="true" />
  9.     <constant name="struts.action.extension" value="jspx" />
  10.    
  11.     <include file="default.xml" />
  12.     <include file="admin.xml" />
  13. </struts>

这里配置了一些全局常量,struts.action.extentsion是访问action时的后缀,通常用的有action或者do,我的习惯是用jspx,例如/admin/login.jspx,将调用admin.xml里定义的login action。
   1.6)新建Spring配置文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:aop="http://www.springframework.org/schema/aop"
  5.     xmlns:tx="http://www.springframework.org/schema/tx"
  6.     xsi:schemaLocation="
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  9.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  10.  
  11.     <bean name="adminAction" class="com.albertsong.bitrac.action.AdminAction" />
  12. </beans>

注意这里的bean name是adminAction,再看Bitrac/src/admin.xml里的class="adminAction",Spring和Struts的结合点就在这里,后台处理这一结合的是struts2-spring-plugin-2.1.2.jar。如果不使用spring,在admin.xml中将是class="com.albertsong.bitrac.action.AdminAction"。
1.7)新建AdminAction类
新建文件Bitrac/src/com/albertsong/bitrac/action/AdminAction.java,(以后所有XXAction都放在相同的目录下,不再重复说明)内容如下:
  1. package com.albertsong.bitrac.action;
  2.  
  3. import com.albertsong.bitrac.dao.Member;
  4. import org.apache.commons.logging.Log;
  5. import org.apache.commons.logging.LogFactory;
  6.  
  7. public class AdminAction {
  8.    
  9.     private Log log = LogFactory.getLog(AdminAction.class);
  10.     private Member member;
  11.  
  12.     public Member getMember() {
  13.         return member;
  14.     }
  15.     public void setMember(Member member) {
  16.         this.member = member;
  17.     }
  18.  
  19.     public String login(){
  20.         log.debug("member.username="+member.getUsername());
  21.         log.debug("member.password="+member.getPassword());
  22.         return "success";
  23.     }
  24.    
  25. }

要让log起作用需要将
D:/JavaTools/spring-framework-2.5.5/lib/log4j/log4j-1.2.15.jar
D:/JavaTools/spring-framework-2.5.5/lib/jakarta-commons/commons-logging.jar
复制到/WEB-INF/lib下
将commons-logging.jar改名为commons-logging-1.1.1.jar,并将commons-logging-api-1.1.jar删掉。(我们只需要同一个组件的最新版本,多余的将被删除,以后不再重复说明,如果大家发现加入到/WEB-INF/lib里的后来又没了,那就是删除了)。
然后在Eclipse里点选Bitrac,按F5刷新,这时工程的文件列表已经更新。Alt+Enter打开工程属性对话框。Java Build PathLibrariesAdd JARs…将commons-logging-1.1.1.jar添加到编译路径,log4j-1.2.15.jar不需要添加,这个是在运行时起作用,编译时不需要。添加好以后,编译的错误提示应该都消失了。
做好这些以后还需要对Log4j做一些配置。
在/WEB-INF/web.xml文件中添加
<context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>bitrac.root</param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>
    <listener>    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
bitrac.root定义了一个代表Web应用程序根目录的变量,这个变量会在log4j.properties中使用。
加好以后完整的web.xml如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app id="bitrac" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  3.     <display-name>Bitrac Blog</display-name>
  4.    
  5.     <context-param>
  6.         <param-name>webAppRootKey</param-name>
  7.         <param-value>bitrac.root</param-value>
  8.     </context-param>
  9.  
  10.     <context-param>
  11.         <param-name>log4jConfigLocation</param-name>
  12.         <param-value>/WEB-INF/classes/log4j.properties</param-value>
  13.     </context-param>
  14.    
  15.     <filter>
  16.         <filter-name>Struts2</filter-name>
  17.         <filter-class>
  18.             org.apache.struts2.dispatcher.FilterDispatcher
  19.         </filter-class>
  20.     </filter>
  21.  
  22.     <filter-mapping>
  23.         <filter-name>Struts2</filter-name>
  24.         <url-pattern>/*</url-pattern>
  25.     </filter-mapping>
  26.     <listener>
  27.         <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  28.     </listener>
  29.    
  30.     <!--默认加载/WEB-INF 目录下的applicationContext.xml -->
  31.     <listener>
  32.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  33.     </listener>
  34.    
  35.     <welcome-file-list>
  36.         <welcome-file>index.jsp</welcome-file>
  37.     </welcome-file-list>
  38.  
  39. </web-app>

新建Bitrac/src/log4j.properties文件,内容如下:
log4j.rootLogger=INFO, stdout, logfile
log4j.logger.com.albertsong=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${bitrac.root}/WEB-INF/log/bitrac.log
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
新建目录/WEB-INF/log

新建com.albertsong.bitrac.dao.Member.Java,内容如下:
  1. package com.albertsong.bitrac.dao;
  2.  
  3. import java.util.Date;
  4.  
  5. /**
  6. * @author Albert
  7. *
  8. */
  9. public class Member {
  10.     private int id;
  11.     private short grade;
  12.     private String username;
  13.     private String password;
  14.     private String validate;
  15.     private boolean conserve;
  16.     private String contact;
  17.     private String picture;
  18.     private String explain;
  19.     private int numPost;
  20.     private int numComm;
  21.     private int numFile;
  22.     private Date publish;
  23.     private String address;
  24.     public int getId() {
  25.         return id;
  26.     }
  27.     public void setId(int id) {
  28.         this.id = id;
  29.     }
  30.     public short getGrade() {
  31.         return grade;
  32.     }
  33.     public void setGrade(short grade) {
  34.         this.grade = grade;
  35.     }
  36.     public String getUsername() {
  37.         return username;
  38.     }
  39.     public void setUsername(String username) {
  40.         this.username = username;
  41.     }
  42.     public String getPassword() {
  43.         return password;
  44.     }
  45.     public void setPassword(String password) {
  46.         this.password = password;
  47.     }
  48.     public String getValidate() {
  49.         return validate;
  50.     }
  51.     public void setValidate(String validate) {
  52.         this.validate = validate;
  53.     }
  54.     public boolean isConserve() {
  55.         return conserve;
  56.     }
  57.     public void setConserve(boolean conserve) {
  58.         this.conserve = conserve;
  59.     }
  60.     public String getContact() {
  61.         return contact;
  62.     }
  63.     public void setContact(String contact) {
  64.         this.contact = contact;
  65.     }
  66.     public String getPicture() {
  67.         return picture;
  68.     }
  69.     public void setPicture(String picture) {
  70.         this.picture = picture;
  71.     }
  72.     public String getExplain() {
  73.         return explain;
  74.     }
  75.     public void setExplain(String explain) {
  76.         this.explain = explain;
  77.     }
  78.     public int getNumPost() {
  79.         return numPost;
  80.     }
  81.     public void setNumPost(int numPost) {
  82.         this.numPost = numPost;
  83.     }
  84.     public int getNumComm() {
  85.         return numComm;
  86.     }
  87.     public void setNumComm(int numComm) {
  88.         this.numComm = numComm;
  89.     }
  90.     public int getNumFile() {
  91.         return numFile;
  92.     }
  93.     public void setNumFile(int numFile) {
  94.         this.numFile = numFile;
  95.     }
  96.     public Date getPublish() {
  97.         return publish;
  98.     }
  99.     public void setPublish(Date publish) {
  100.         this.publish = publish;
  101.     }
  102.     public String getAddress() {
  103.         return address;
  104.     }
  105.     public void setAddress(String address) {
  106.         this.address = address;
  107.     }
  108. }

这里将Member.java放在dao下面,文件如何组织,包括类如何设计,完全是人为的,所谓的惯例和标准只是大家都公认的一些比较好的做法而已。我认为,目前将Member.java放在这里就可以了。


1.8)修改/index.jsp,内容如下:
  1. <%@ page contentType="text/html; charset=UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7.     <meta http-equiv="refresh" content="0;url=admincp.jspx" />
  8. </head>
  9. <body>
  10.     <p>Loading ...</p>
  11. </body>
  12. </html>

1.9)新建文件/admin/login.jsp,内容如下:
  1. <%@ page contentType="text/html; charset=UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s" %>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5.  
  6. <html xmlns="http://www.w3.org/1999/xhtml">
  7.     <head>
  8.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  9.         <title> Bitrac Demo Site - 管理员控制面板</title>
  10.     </head>
  11.     <body>
  12.         <div id="content">
  13.             <div id="AdmEnter">
  14.                 <s:actionerror />
  15.                 <s:form action="login" namespace="/admin">
  16.                     <fieldset><legend>管理登录</legend>
  17.                     <s:textfield label="用户名" name="member.username" />
  18.                     <s:password label="密码" name="member.password" />
  19.                     <s:submit value="登录" />
  20.                     </fieldset>
  21.                 </s:form>
  22.             </div>
  23.         </div>
  24.         <div id="footer">
  25.             <p>Powered by <a href="http://www.albertsong.com" target="_blank">Bitrac(J) v0.1</a>. Designed by <a href="mailto:loveyuki@gmail.com">Loveyuki</a> &Programmed by <a href="mailto:albertsong.com@gmail.com">Albert Song</a></p>
  26.         </div>
  27.     </body>
  28. </html>

这里使用了struts的标签来将视图层(JSP)和控制层(Action)关联在一起。注意到<s:form action="login" namespace="/admin">中的action和namespace就是我们在admin.xml中定义的。通过name="member.username"这样的形式就可以将Action中的member成员和界面元素关联起来。
1.10)启动Tomcat,浏览http://localhost:8080/bitrac/
如果上面的操作步骤都正确,那么会看到一个登录页面,点登录按钮会转到另一个页面。现在Struts2和Spring2已经集成在一起了。不过login里面我们还什么都没写,这个程序还没有任何有用的功能。如果在用户名和密码框中填入内容,点登录以后在Eclipse的Console里会看到相应的调试信息。
这里有很多警告,原因不清楚,不想看到它们并不难,在log4j.properties文件中log4j.logger.com.albertsong=DEBUG的下面加一行
log4j.logger.com.opensymphony.xwork2=ERROR
好了,现在清静了。
   2)Spring2和Hibernate集成
    2.1)复制必要的jar
   将
D:/JavaTools/spring-framework-2.5.5/lib/j2ee/jta.jar
   D:/JavaTools/spring-framework-2.5.5/lib/c3p0/c3p0-0.9.1.2.jar
D:/JavaTools/hibernate-3.2/lib/antlr-2.7.6.jar
D:/JavaTools/hibernate-3.2/lib/asm.jar
D:/JavaTools/hibernate-3.2/lib/asm-attrs.jar
D:/JavaTools/hibernate-3.2/lib/cglib-2.1.3.jar
D:/JavaTools/hibernate-3.2/lib/commons-collections-2.1.1.jar
D:/JavaTools/hibernate-3.2/lib/dom4j-1.6.1.jar
D:/JavaTools/hibernate-3.2/lib/ehcache-1.2.3.jar
D:/JavaTools/hibernate-3.2/lib/jaxen-1.1-beta-7.jar
   复制到/WEB-INF/lib下
    2.2)修改配置文件
在/WEB-INF/applicationContext.xml中加入Hibernate相关配置。
  <bean id="dataSource" 
        class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/bitrac" /> 
        <property name="user" value="root" />
        <property name="password" value="" />
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>com/albertsong/bitrac/dao/Member.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="show_sql">true</prop>
            </props>
        </property>
    </bean>
加入数据访问类的配置
<bean id="memberDao" class="com.albertsong.bitrac.dao.MemberDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
给<bean name="adminAction" class="com.albertsong.bitrac.action.AdminAction" />
添加属性<property name="memberDao" ref="memberDao" />
完成以后完整的applicationContext.xml如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:aop="http://www.springframework.org/schema/aop"
  5.     xmlns:tx="http://www.springframework.org/schema/tx"
  6.     xsi:schemaLocation="
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  9.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  10.  
  11.     <bean id="dataSource" 
  12.         class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  13.         <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
  14.         <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/bitrac" /> 
  15.         <property name="user" value="root" />
  16.         <property name="password" value="" />
  17.     </bean>
  18.     <bean id="sessionFactory"
  19.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  20.         <property name="dataSource" ref="dataSource" />
  21.         <property name="mappingResources">
  22.             <list>
  23.                 <value>com/albertsong/bitrac/dao/Member.hbm.xml</value>
  24.             </list>
  25.         </property>
  26.         <property name="hibernateProperties">
  27.             <props>
  28.                 <prop key="hibernate.dialect">
  29.                     org.hibernate.dialect.MySQLDialect
  30.                 </prop>
  31.                 <prop key="show_sql">true</prop>
  32.             </props>
  33.         </property>
  34.     </bean>
  35.     <bean id="memberDao" class="com.albertsong.bitrac.dao.MemberDaoImpl">
  36.         <property name="sessionFactory" ref="sessionFactory" />
  37.     </bean>
  38.     <bean name="adminAction" class="com.albertsong.bitrac.action.AdminAction" scope="prototype">
  39.         <property name="memberDao" ref="memberDao" />
  40.     </bean>
  41. </beans>

(要注意的是如果没有scope="prototype",则登录出错以后,不能再正确登录,原因显然是AdminAction缓存了member的数据,具体原理暂不研究)
 新建Bitrac/src/com/albertsong/bitrac/dao/Member.hbm.xml,这是Hibernate的数据映射文件,内容如下
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.albertsong.bitrac.dao">
  7.  
  8.     <class name="Member" table="BT_Member">
  9.         <id name="id" column="id">
  10.             <generator class="native"/>
  11.         </id>
  12.         <property name="grade" />
  13.         <property name="username" />
  14.         <property name="password" />
  15.         <property name="validate" />
  16.         <property name="conserve" />
  17.         <property name="contact" />
  18.         <property name="picture" />
  19.         <property name="explain" />
  20.         <property name="numPost" />
  21.         <property name="numComm" />
  22.         <property name="numFile" />
  23.         <property name="publish" />
  24.         <property name="address" />
  25.  
  26.     </class>
  27.  
  28. </hibernate-mapping>

这里使用了package,如果不使用package,则class的name要使用com.albertsong.bitrac.dao.Member这样的。property的name和Member的属性对应,因为表BT_Member的列名和Member的属性一样,所以不需要使用<column />标签。
2.3)新建DAO类文件
新建MemberDao.java,内容如下:
  1. package com.albertsong.bitrac.dao;
  2.  
  3. public interface MemberDao {
  4.     boolean exist(String username,String password);
  5. }

新建MemberDaoImpl.Java内容如下:
  1. package com.albertsong.bitrac.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  6.  
  7. public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
  8.  
  9.     @SuppressWarnings("unchecked")
  10.     @Override
  11.     public boolean exist(String username,String password) {
  12.         List ls=getHibernateTemplate().find("from Member m where m.username=? and m.password=MD5(?)",
  13.                 new Object[]{username,password});
  14.         return ls.size()==1?true:false;
  15.     }
  16.  
  17. }

修改AdminAction.java,内容如下:
  1. package com.albertsong.bitrac.action;
  2.  
  3. import com.albertsong.bitrac.dao.Member;
  4. import com.albertsong.bitrac.dao.MemberDao;
  5. import com.opensymphony.xwork2.ActionSupport;
  6.  
  7. import org.apache.commons.logging.Log;
  8. import org.apache.commons.logging.LogFactory;
  9.  
  10. @SuppressWarnings("serial")
  11. public class AdminAction extends ActionSupport {
  12.    
  13.     private Log log = LogFactory.getLog(AdminAction.class);
  14.     private Member member;
  15.     private MemberDao memberDao;
  16.  
  17.     public Member getMember() {
  18.         return member;
  19.     }
  20.     public void setMember(Member member) {
  21.         this.member = member;
  22.     }
  23.     public MemberDao getMemberDao() {
  24.         return memberDao;
  25.     }
  26.     public void setMemberDao(MemberDao memberDao) {
  27.         this.memberDao = memberDao;
  28.     }
  29.     public String login(){
  30.         log.debug("member.username="+member.getUsername());
  31.         log.debug("member.password="+member.getPassword());
  32.        
  33.         if(memberDao.exist(member.getUsername(), member.getPassword())){
  34.             return "success";
  35.         }else{
  36.             addActionError("username or passowrd is not correct.");
  37.             return "input";
  38.         }
  39.     }
  40.    
  41. }

3)转换和导入数据库
怎么转换的就不说了,这个和本教程没有关系,有兴趣的可以看看
http://www.loveyuki.com/Article/Bitrac_Alpha_Update_List.aspx
建目录D:/Project/Bitrac/doc,转换后的文件create_bitrac_db.sql放到这个目录下。(sql文件的内容这里不再重复,下载源代码包以后可以找到)。
先执行D:/mysql-5.0.51b/bin/mysqld-nt.exe启动mysql数据库。
运行D:/MySQL GUI Tools 5.0/MySQLQueryBrowser.exe,
File-->Open Script...,打开sql脚本文件,执行,创建bitrac数据库。

下载mysql的jdbc驱动MySQL Connector/J 5.1.6
下载页面:
http://dev.mysql.com/downloads/connector/j/5.1.html
下载链接:
http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.6.zip/from/http://ftp.iij.ad.jp/pub/db/mysql/
将下载的文件解压,将其中的mysql-connector-java-5.1.6-bin.jar复制到/WEB-INF/lib下。

4)运行程序
如果以上每一步都没有做错的话,现在我们已经有了一个简单的可以登录的程序了。
启动tomcat,浏览http://localhost:8080/bitrac/,输入用户名Admin,密码Admin888试试吧。
当然这个程序目前还相当简单,虽然写得已经很长了,但可能还是没有看到你想看的东西吧。我也突然觉得要写这个教程的工程相当庞大,随便一个组件拉出来都得写一本好几百页的书。怎样才能写得简单又清楚,确实是一个问题。但有一个目标是很明确的,那就是使用最简单的,最新的技术。上面讲的Hibernate使用了老式的配置方法及一般的dataSource访问方式,没有涉及到事务。下面将其改成基于Spring Schema配置的JPA访问方式。(以后一般不会提供两种不同的方法的比较,将直接采用我认为较好的方法,当然可能我写完了发现还有更好的,那么就会有两种甚至两种以上的方法)。
3.    数据访问层采用JPA
1) jar准备
Hibernate EntityManager
下载页面:
http://hibernate.org/30.html
下载链接:
http://sourceforge.net/project/showfiles.php?group_id=40712&package_id=156160
下载的文件hibernate-entitymanager-3.4.0.GA.zip放在D:/JavaTools下
解压后将
    D:/JavaTools/hibernate-entitymanager-3.4.0.GA/hibernate-entitymanager.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/javassist.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/ejb3-persistence.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/hibernate-annotations.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/hibernate-commons-annotations.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/hibernate-core.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/ slf4j-api.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/test/slf4j-log4j12.jar
D:/JavaTools/hibernate-entitymanager-3.4.0.GA/lib/test/commons-collections.jar
复制到/WEB-INF/lib
然后给各个文件改名,加上版本号,即javassist-3.4.jar
ejb3-persistence-1.0.2GA.jar
hibernate-annotations-3.4.0GA.jar
hibernate-commons-annotations-3.1.0GA.jar
hibernate-core-3.3.0SP1.jar
hibernate-entitymanager-3.4.0GA.jar
版本号可以在jar文件中的META-INF/MANIFEST.MF文件中找到。然后将同名的版本较低的jar删除,选中项目名称,按F5刷新,这时可能会有错误提示,因为旧的jar被删除了,这时需要重新添加jar,这一操作过程以后不再重复说明。
2)Class文件修改
2.1)在Package Explorer树形列表中选中Member.java文件,点右键,Refactor-->Move…-->Create Package…,包名com.albertsong.bitrac.model,Finish,OK。
通过以上步骤,我们已经使用Eclipse的重构功能移动了Member.java的位置。
2.2)在Java Build Path中加入ejb3-persistence-1.0.2GA.jar,编译使用了JPA的类时要用到。
2.3)修改后的Member.java
  1. package com.albertsong.bitrac.model;
  2.  
  3. import java.util.Date;
  4.  
  5. import javax.persistence.Entity;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.Id;
  8. import javax.persistence.Table;
  9.  
  10. @Entity
  11. @Table(name="BT_Member")
  12. public class Member {
  13.     @Id
  14.     @GeneratedValue
  15.     private int id;
  16.     private short grade;
  17.     private String username;
  18.     private String password;
  19.     private String validate;
  20.     private boolean conserve;
  21.     private String contact;
  22.     private String picture;
  23.     private String explain;
  24.     private int numPost;
  25.     private int numComm;
  26.     private int numFile;
  27.     private Date publish;
  28.     private String address;
  29.     public int getId() {
  30.         return id;
  31.     }
  32.     public void setId(int id) {
  33.         this.id = id;
  34.     }
  35.     public short getGrade() {
  36.         return grade;
  37.     }
  38.     public void setGrade(short grade) {
  39.         this.grade = grade;
  40.     }
  41.     public String getUsername() {
  42.         return username;
  43.     }
  44.     public void setUsername(String username) {
  45.         this.username = username;
  46.     }
  47.     public String getPassword() {
  48.         return password;
  49.     }
  50.     public void setPassword(String password) {
  51.         this.password = password;
  52.     }
  53.     public String getValidate() {
  54.         return validate;
  55.     }
  56.     public void setValidate(String validate) {
  57.         this.validate = validate;
  58.     }
  59.     public boolean isConserve() {
  60.         return conserve;
  61.     }
  62.     public void setConserve(boolean conserve) {
  63.         this.conserve = conserve;
  64.     }
  65.     public String getContact() {
  66.         return contact;
  67.     }
  68.     public void setContact(String contact) {
  69.         this.contact = contact;
  70.     }
  71.     public String getPicture() {
  72.         return picture;
  73.     }
  74.     public void setPicture(String picture) {
  75.         this.picture = picture;
  76.     }
  77.     public String getExplain() {
  78.         return explain;
  79.     }
  80.     public void setExplain(String explain) {
  81.         this.explain = explain;
  82.     }
  83.     public int getNumPost() {
  84.         return numPost;
  85.     }
  86.     public void setNumPost(int numPost) {
  87.         this.numPost = numPost;
  88.     }
  89.     public int getNumComm() {
  90.         return numComm;
  91.     }
  92.     public void setNumComm(int numComm) {
  93.         this.numComm = numComm;
  94.     }
  95.     public int getNumFile() {
  96.         return numFile;
  97.     }
  98.     public void setNumFile(int numFile) {
  99.         this.numFile = numFile;
  100.     }
  101.     public Date getPublish() {
  102.         return publish;
  103.     }
  104.     public void setPublish(Date publish) {
  105.         this.publish = publish;
  106.     }
  107.     public String getAddress() {
  108.         return address;
  109.     }
  110.     public void setAddress(String address) {
  111.         this.address = address;
  112.     } 
  113. }

2.4)修改后的MemberDaoImpl.java
  1. package com.albertsong.bitrac.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7. import javax.persistence.Query;
  8.  
  9. import org.apache.commons.logging.Log;
  10. import org.apache.commons.logging.LogFactory;
  11. import org.springframework.transaction.annotation.Transactional;
  12.  
  13. @Transactional
  14. public class MemberDaoImpl implements MemberDao {
  15.    
  16.     private Log log = LogFactory.getLog(MemberDaoImpl.class);
  17.    
  18.     private EntityManager em;
  19.    
  20.     @PersistenceContext
  21.     public void setEntityManager(EntityManager em) {
  22.         this.em = em;
  23.     }
  24.    
  25.     private EntityManager getEntityManager(){
  26.         return em;
  27.     }
  28.  
  29.     @SuppressWarnings("unchecked")
  30.     @Override
  31.     public boolean exist(String username,String password) {
  32.         StringBuffer buffer = new StringBuffer("select m from Member m ");
  33.         buffer.append(" where m.username='").append(username).append("'");
  34.         buffer.append(" and m.password=MD5('").append(password).append("')");
  35.         log.debug(buffer.toString());
  36.         Query query = getEntityManager().createQuery(buffer.toString());
  37.         List ls = query.getResultList();
  38.         return ls.size()==1?true:false;
  39.     }
  40.  
  41. }

3) 配置文件修改
3.1)删除Bitrac/src/com/albertsong/bitrac/dao/Member.hbm.xml
3.2)建目录Bitrac/src/META-INF,在这个目录下面新建一个文件persistence.xml,内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  5.     version="1.0">
  6.     <persistence-unit name="punit">
  7.     </persistence-unit>
  8. </persistence>

3.3)修改web.xml文件,添加
<filter>
        <filter-name>OpenEntityManagerInViewFilter</filter-name>
        <filter-class>
            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>OpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3.4)修改applicationContext.xml,修改后内容如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:aop="http://www.springframework.org/schema/aop"
  5.     xmlns:tx="http://www.springframework.org/schema/tx"
  6.     xsi:schemaLocation="
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  9.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  10.  
  11.     <bean
  12.         class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
  13.    
  14.     <bean id="entityManagerFactory"
  15.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  16.         <property name="dataSource" ref="dataSource" />
  17.         <property name="jpaVendorAdapter">
  18.             <bean
  19.                 class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  20.                 <property name="database" value="MYSQL" />
  21.                 <property name="showSql" value="true" />
  22.             </bean>
  23.         </property>
  24.     </bean>
  25.  
  26.     <bean id="dataSource" 
  27.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  28.         <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
  29.         <property name="url" value="jdbc:mysql://localhost:3306/bitrac" /> 
  30.         <property name="username" value="root" />
  31.         <property name="password" value="" />
  32.     </bean>
  33.    
  34.     <bean id="transactionManager"
  35.         class="org.springframework.orm.jpa.JpaTransactionManager">
  36.         <property name="entityManagerFactory" ref="entityManagerFactory" />
  37.     </bean>
  38.    
  39.     <tx:annotation-driven transaction-manager="transactionManager" />
  40.    
  41.     <bean id="memberDao" class="com.albertsong.bitrac.dao.MemberDaoImpl" />
  42.    
  43.     <bean name="adminAction" class="com.albertsong.bitrac.action.AdminAction" scope="prototype">
  44.         <property name="memberDao" ref="memberDao" />
  45.     </bean>
  46. </beans>

4)运行程序
启动Tomcat,浏览http://localhost:8080/bitrac/
正常的话,我们已经完成了一个最简单的Struts2+Spring2.5+JPA(Hibernate)程序了。

源代码这里下载:
Lib 源代码不带jar,这里包括了当前需要的所有jar,解压后放到/WebRoot/WEB-INF/lib下。
http://www.albertsong.com/download/Bitrac/Bitrac_Lib.rar
不使用JPA的工程
http://www.albertsong.com/download/Bitrac/Bitrac_Src_2_1.rar
使用JPA的工程
http://www.albertsong.com/download/Bitrac/Bitrac_Src_2_2.rar

参考链接:
在struts2中集成Spring
http://www.99inf.net/SoftwareDev/Java/55131.htm
登录出错以后不能再登录
http://www.javaeye.com/topic/146932
C3P0的详细配置
http://blog.csdn.net/luhao/archive/2008/05/06/2399946.aspx
JPA批注参考
http://www.cnblogs.com/kentyshang/archive/2008/01/07/1029142.html

后记:
如果仔细的看完这两章,那么对于Java Web开发常用的操作和一般流程应该熟悉了。从第三章开始,将正式开始Bitrac博客程序的开发。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值