程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts 2.0整合Hibernate 3.2開發注冊登錄系統

Struts 2.0整合Hibernate 3.2開發注冊登錄系統

編輯:關於JAVA

開發工具:MyEclipse 6.0 ,Tomcat 5.5 ,JDK 1.5 ,MySQL 5.0 ;開發准備:下載Struts 2.0和 Hibernate 3.2,大家可Struts和Hibernate的官方網站下載這兩個框架。我們先來總覽一下開發完成後的 包—類圖:

首先NEW一個Web Project ,名為"LoginSystem" ,在lib 目錄下加入Struts 2.0的Jar包和Hibernate 3.2的Jar包,然後按下面的步驟來:

1、在 src 目錄下建 "hibernate.cfg.xml" 全部代碼如下:

<?xml version='1.0' encoding='UTF-8'?>
2<!DOCTYPE hibernate- configuration PUBLIC
3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4      "http://hibernate.sourceforge.net/hibernate-configuration- 3.0.dtd">
5
6<!-- Generated by MyEclipse Hibernate Tools.          -- >
7<hibernate-configuration>
8  <session-factory>
9     <property name="connection.username">root</property>
10    <property name="connection.url">
11      jdbc:mysql://localhost:3306/LoginSystem
12     </property>
13    <property name="dialect">
14       org.hibernate.dialect.MySQLDialect
15    </property>
16    <property name="myeclipse.connection.profile">
17      LoginSystem
18     </property>
19    <property name="connection.password">root</property>
20    <property name="connection.driver_class">
21      com.mysql.jdbc.Driver
22     </property>
23    <property name="show_sql">true</property>
24     <!-- POJO類映射配置 -->
25    <mapping resource="com/rong/ORM/User.hbm.xml" />
26  </session- factory>
27</hibernate-configuration>

2、建立實體類 "User.java" 及其映射文件 "User.hbm.xml" 兩者都放在 "com.rong.ORM" 包下。其 中"User.java"的代碼如下:

1package com.rong.ORM;
2
3public class User {
4  
5  private int id;    //主鍵ID
6  private String name;  //用戶名
7  private String pwd;     //密碼
8
9  /**//*
10   * Getter方法與Setter方法
11   */  
12   public String getName() {
13    return name;
14  }
15  public void setName (String name) {
16    this.name = name;
17  }
18  public String getPwd() {
19    return pwd;
20  }
21  public void setPwd(String pwd) {
22     this.pwd = pwd;
23  }
24  public int getId() {
25    return id;
26   }
27  public void setId(int id) {
28    this.id = id;
29  }
30}

User.hbm.xml的代碼如下:

1<?xml version="1.0" encoding="utf-8"?>
2<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3"http://hibernate.sourceforge.net/hibernate-mapping- 3.0.dtd">
4
5<hibernate-mapping>
6  <class name="com.rong.ORM.User" table="tb_user">
7    <id name="id">
8      <generator class="native"/>
9    </id>
10    <property name="name" type="java.lang.String" length="20"/>
11    <property name="pwd" type="java.lang.String" length="20"/>
12  </class>
13</hibernate- mapping>

3、建立"ExportDB.java"工具類,我們執行如下代碼,就能輕松將User類導入數據庫轉變成數據庫中 的表。不過,前提是我們已經在MySQL中建立了一個名為"LoginSystem"的數據庫。

1package tool;
2
3import org.hibernate.cfg.Configuration;
4import org.hibernate.tool.hbm2ddl.SchemaExport;
5
6public class ExportDB {
7
8   /**//*
9   * 運行此類,通過POJO類和配置文件,生成數據庫的表
10   */
11   public static void main(String[] args){
12    Configuration cfg = new Configuration ().configure();
13    SchemaExport export = new SchemaExport(cfg);
14     export.create(true, true);
15  }
16}
17

4、建立獲取SessionFactory和管理Session的HibernateUtil.java類:

1package com.rong.hibernate;
2
3import org.hibernate.HibernateException;
4import org.hibernate.Session;
5import org.hibernate.SessionFactory;
6import org.hibernate.cfg.Configuration;
7
8public class HibernateUtil {
9  
10  //聲明Hibernate配置文件所在的路徑
11  private static String configFile = "/hibernate.cfg.xml";
12  //建Configuration對象
13   private static Configuration configuration = new Configuration();
14  //建Session工廠對 象
15  private static SessionFactory sessionFactory = null;
16  
17  /** *//**
18   * 單例模式,只初始化一次,只產生一個SessionFactory對象(線程安全)
19   */
20  static {
21    try{
22      //通過hibernate.cfg.xml配置數據庫連 接
23      configuration.configure(configFile);
24      //建立一個Session 工廠
25      sessionFactory = configuration.buildSessionFactory();
26       System.out.println("[標記]初始化SessionFactory");
27    }catch(Exception e){
28       System.out.println("[異常]創建SessionFactory時發生異常,異常原因如下:");
29       e.printStackTrace();
30    }
31  }
32  
33  /** *//**
34    * getSession()方法
35   * @return Session對象
36   * @throws HibernateException
37   */
38  public Session getSession(){
39    Session session = null;
40    try{
41      session = sessionFactory.openSession ();
42    }catch(Exception e){
43      System.out.println("[異常]開啟Session 時發生異常,異常原因如下:");
44      e.printStackTrace();
45    }
46     return session;
47  }
48  
49  /** *//**
50   * closeSession()方法
51   * @param session 要關閉的Session對象
52   */
53  public void closeSession(Session session){
54    try{
55      if(null != session)
56         session.close();
57    }catch(Exception e){
58       System.out.println("[異常]關閉Session時發生異常,異常原因如下:");
59       e.printStackTrace();
60    }
61  }
62  
63  
64  
66}
67

5、DAO層設計:在"com.rong.DAO" 包下建立兩個類,一個是接口,一個是實現類,其中UserDao.java 代碼如下:

1package com.rong.DAO;
2
3import java.util.List;
4import com.rong.ORM.User;
5
6public interface UserDao {
7
8  /** *//**
9   * 增 加用戶
10   * @param user 要增加的用戶
11   */
12  public void add(User user);
13  
14  /** *//**
15   * 登錄驗證
16   * @param name
17   * @param password
18   * @return -1:不存在用戶名 ; -2:密碼不正確 ; >0:登錄成功(即返回 該記錄ID)
19   */
20  public int isExist(String name,String password);  
21}

UserDaoImpl.java的代碼如下:

1package com.rong.DAO;
2
3import java.util.Iterator;
4import java.util.List;
5import org.hibernate.Query;
6import org.hibernate.Session;
7import org.hibernate.Transaction;
8import com.rong.ORM.User;
9import com.rong.hibernate.HibernateUtil;
10
11public class UserDaoImpl implements UserDao {
12
13  HibernateUtil util = new HibernateUtil();
14  
15  /** *//**
16   * 增加用戶
17   * @param user 要增加的用戶
18   */
19  public void add(User user){
20    Session session = util.getSession();
21     Transaction ts = null;
22    try{
23      ts = session.beginTransaction ();
24      session.save(user);
25      ts.commit();
26    }catch (Exception e){
27      System.out.println("UserDaoImpl.add()方法發生異常:");
28       e.printStackTrace();
29    }finally{
30      util.closeSession (session);
31    }
32  }
33  
34  /** *//**
35   * 登錄驗證
36    * @param name
37   * @param password
38   * @return -1:不存在用戶名 ; -2:密碼 不正確 ; >0:登錄成功(即返回該記錄ID)
39   */
40  public int isExist(String name,String password){
41    //int state = 0 ;    //初始化狀態變量
42     Session session = util.getSession();
43    try{
44      Query query = session.createQuery("from User u where u.name = ?");
45      query.setString(0, name);
46      List list = query.list();
47      if(null == list || 0 == list.size()){
48        return -1 ;   //用戶名不存在
49      }
50       Query query2 = session.createQuery("from User u where u.name = ? and u.pwd = ?");
51      query2.setString(0, name);
52      query2.setString(1, password);
53      List list2 = query.list();
54      if(null == list2) {
55        return -2 ;    //密碼不正確
56      }
57       Iterator it = list.iterator();
58      User user = (User)it.next();
59       return user.getId();  //驗證成功,取ID值
60      
61    }catch(Exception e){
62      System.out.println("UserDaoImpl.isExist()方法發生異常:");
63       e.printStackTrace();
64      return 0;  //異常時返回0
65    }finally {
66      util.closeSession(session);
67    }
68  }
69}
70
    

6、在web.xml中配置Struts 2.0支持:

     1<?xml version="1.0" encoding="UTF-8"?>
2<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
3   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
6
7  <!-- 用過濾器配置 Struts2支持 -->
8  <filter>
9    <filter-name>struts2</filter -name>
10    <filter-class>
11       org.apache.struts2.dispatcher.FilterDispatcher
12    </filter-class>
13   </filter>
14  <filter-mapping>
15    <filter- name>struts2</filter-name>
16    <url-pattern>/*</url- pattern>
17  </filter-mapping>
18
19  <welcome-file-list>
20     <welcome-file>login.jsp</welcome-file>
21  </welcome-file- list>
22</web-app>
               7、登錄頁面login.jsp代碼如下:

1<%@ page language="java" import="java.util.*" pageEncoding="gbk"% >
2<%@ taglib prefix="s" uri="/struts-tags" %>
3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4<html>
5  <head>
6
7     <title>Login Page</title>
8  </head>
9
10   <body>
11    <p><a href="register.jsp">用戶注冊</a>|用戶登錄 </p>
12        <s:form action="loginAction" theme="simple">
13       <table>
14        <tr>
15          <td style="text-align:right">
16            賬號
17           </td>
18          <td>
19            <s:textfield name="name" label="賬號" />
20
21          </td>
22         </tr>
23        <tr>
24          <td style="text -align:right">
25            密碼
26           </td>
27          <td>
28            <s:password name="pwd" label="密碼" />
29          </td>
30         </tr>
31        <tr>
32          <td style="text- align:right">
33            驗證碼
34           </td>
35          <td>
36            <s:textfield name="inputCertCode" label="驗證碼" cssStyle="width:100px"/>
37             <img src="other/makeCertPic.jsp">
38          </td>
39         </tr>
40        <tr>
41          <td style="text-align:right">
42            <s:submit value="登錄" />
43          </td>
44          <td style="text- align:left">
45            <s:reset value="取消"/>
46           </td>
47        </tr>
48      </table>
49     </s:form>
50    <s:fielderror cssStyle="color:red"/>
51   </body>
52</html>
53

注冊頁register.jsp代碼如下:

1<%@ page language="java" import="java.util.*" pageEncoding="gbk"% >
2<%@ taglib prefix="s" uri="/struts-tags"%>
3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4<html>
5  <head>
6
7     <title>Register Page</title>
8  </head>
9
10   <body>
11    <p><a href="login.jsp">用戶登錄</a>|用戶注冊 </p>
12    <s:form action="registerAction" theme="simple">
13       <table>
14        <tr>
15          <td style="text-align:right">
16            請輸入賬號
17           </td>
18          <td>
19             <s:textfield name="user.name" label="賬號" />
20
21           </td>
22        </tr>
23        <tr>
24           <td style="text-align:right">
25            請輸入密碼
26           </td>
27          <td>
28             <s:password name="user.pwd" label="密碼" />
29           </td>
30        </tr>
31        <tr>
32           <td style="text-align:right">
33            請再次輸入密碼
34          </td>
35          <td>
36             <s:password name="repwd" label="重復密碼" />
37           </td>
38        </tr>
39        <tr>
40           <td style="text-align:right">
41            請輸入驗證碼
42          </td>
43          <td>
44             <s:textfield name="inputCertCode" label="驗證碼" cssStyle="width:100px"/>
45            <img src="other/makeCertPic.jsp">
46          </td>
47         </tr>
48        <tr>
49          <td style="text- align:right">
50            <s:submit value="注冊" />
51           </td>
52          <td style="text-align:left">
53             <s:reset value="取消"/>
54           </td>
55        </tr>
56      </table>
57     </s:form>
58    <s:fielderror cssStyle="color:red"/>
59   </body>
60</html>
61

8、在JSP頁中所用到的驗證碼的生成頁面makeCertPic.jsp(我們把它放在WebRoot的other目錄下):

1<%@page contentType="image/jpeg" pageEncoding="gbk"%>
2<jsp:useBean id="image" scope="page" class="com.rong.other.makeCertPic" />
3<%
4  String str = image.getCertPic(0,0,response.getOutputStream());
5  // 將驗證碼保存到Session中
6  session.setAttribute("certCode", str);
7%>

其中,它調用了名為makeCertPic的Bean ,這個類主要用來生成彩色的驗證圖片,其代碼如下:

1package com.rong.other;
2import java.awt.Color;
3import java.awt.Font;
4import java.awt.Graphics;
5import java.awt.image.BufferedImage;
6import java.io.IOException;
7import java.io.OutputStream;
8import java.util.Random;
9import javax.imageio.ImageIO;
10/** *//**
11 * 生成驗證碼圖片
12 */
13public class makeCertPic {
14  //驗證碼圖片中可以出現的字符集,可根據需要修改
15  private char mapTable[]={
16      'a','b','c','d','e','f',
17       'g','h','i','j','k','l',
18      'm','n','o','p','q','r',
19       's','t','u','v','w','x',
20      'y','z','0','1','2','3',
21       '4','5','6','7','8','9'};
22  /** *//**
23   * 功能:生成彩色驗證碼圖片
24   * 參數width為生成的圖片的寬度,參數height為生成的圖片的高度,參數os為頁面的輸出流
25   */
26  public String getCertPic(int width, int height, OutputStream os) {
27     if(width<=0)width=60;
28    if(height<=0)height=20;  
29     BufferedImage image = new BufferedImage(width, height,
30                   BufferedImage.TYPE_INT_RGB);
31    // 獲取圖形上下文
32    Graphics g = image.getGraphics();
33    // 設定背景色
34    g.setColor(new Color (0xDCDCDC));
35    g.fillRect(0, 0, width, height);
36    //畫邊框
37     g.setColor(Color.black);
38    g.drawRect(0,0,width-1,height-1);
39    // 取 隨機產生的認證碼
40    String strEnsure = "";
41    // 4代表4位驗證碼,如果要生 成更多位的認證碼,則加大數值
42    for(int i=0; i<4; ++i) {
43       strEnsure += mapTable[(int)(mapTable.length*Math.random())];
44    }
45     // 將認證碼顯示到圖象中,如果要生成更多位的認證碼,增加drawString語句
46     g.setColor(Color.black);
47    g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
48    String str = strEnsure.substring(0,1);
49     g.drawString(str,8,17);  
50    str = strEnsure.substring(1,2);
51     g.drawString(str,20,15);
52    str = strEnsure.substring(2,3);
53     g.drawString(str,35,18);    
54    str = strEnsure.substring(3,4);
55     g.drawString(str,45,15);
56    // 隨機產生10個干擾點
57    Random rand = new Random();
58    for (int i=0;i<10;i++) {
59      int x = rand.nextInt (width);
60      int y = rand.nextInt(height);
61      g.drawOval (x,y,1,1);
62    }
63    // 釋放圖形上下文
64    g.dispose();    
65    try {
66      // 輸出圖象到頁面
67      ImageIO.write(image, "JPEG", os);
68    } catch (IOException e) {
69      return "";
70     }
71    return strEnsure;
72  }
73}
74

9、此時,我們很有必要來配置一下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
8   <package name="com.rong.action" extends="struts-default">
9    <!-- 用戶登錄 -->
10    <action name="loginAction" class="com.rong.action.LoginAction">
11      <result name="success" type="redirect">/back/index.jsp</result>
12      <result name="input">/login.jsp</result>
13    </action>
14    <!-- 用戶注冊 -->
15    <action name="registerAction" class="com.rong.action.RegisterAction">
16      <result name="success" type="redirect">/login.jsp</result>
17      <result name="input">/register.jsp</result>
18    </action>
19   </package>
20</struts>

10、Action層設計:兩個非常關鍵的類,其中LoginAction.java的代碼如下:

1package com.rong.action;
2
3import java.util.Map;
4import com.opensymphony.xwork2.ActionContext;
5import com.opensymphony.xwork2.ActionSupport;
6import com.rong.DAO.UserDao;
7import com.rong.DAO.UserDaoImpl;
8import com.rong.ORM.User;
9
10public class LoginAction extends ActionSupport {
11  
12  
13  private UserDao userDao = new UserDaoImpl();  //操縱數據庫DAO類(Hibernate實現),通過Struts.xml注入值
14  
15   private int id;
16  private String name;  //用戶名(值由struts注入)
17  private String pwd;    //密碼(值由struts注入)
18  
19  private String inputCertCode;   //驗證碼
20
21  public int getId() {
22    return id;
23  }
24   public void setId(int id) {
25    this.id = id;
26  }
27  public String getName() {
28    return name;
29  }
30  public void setName(String name) {
31    this.name = name;
32  }
33  public String getPwd() {
34     return pwd;
35  }
36  public void setPwd(String pwd) {
37    this.pwd = pwd;
38  }
39
40  public String getInputCertCode() {
41    return inputCertCode;
42  }
43  public void setInputCertCode(String inputCertCode) {
44    this.inputCertCode = inputCertCode;
45  }
46  @Override
47   public String execute() throws Exception {
48    int state = userDao.isExist (name,pwd);
49    System.out.println("state="+state);
50    if(state == -1) {
51      this.addFieldError("name", "用戶名不正確,請先注冊!");
52       return INPUT;
53    }else if(state == -2){
54      this.addFieldError("pwd", "密碼不正確,請重新輸入密碼!");
55      return INPUT;
56    }else if(state > 0){
57      System.out.println("[測試]登錄成功!用戶ID="+state);
58       this.setId(state);
59      return SUCCESS;
60    }else{
61       this.addFieldError("name", "登錄失敗,請與管理員聯系!");
62      return INPUT;
63    }
64  }
65  
66  public void validate() {
67    // 驗證碼驗證
68    if(null == inputCertCode || "".equals(inputCertCode)){
69       this.addFieldError("inputCertCode", "驗證碼不能為空!");
70    }else{
71       Map session = ActionContext.getContext().getSession();
72      String certCode = session.get("certCode").toString();
73      if( ! certCode.equals (this.inputCertCode)){
74        this.addFieldError("inputCertCode", "驗證碼不正 確!");
75      }
76    }
77
78  }
79  
80  
81  
82
83}
84  

RegisterAction.java的代碼如下:

1package com.rong.action;
2
3import java.util.Map;
4
5import com.opensymphony.xwork2.ActionContext;
6import com.opensymphony.xwork2.ActionSupport;
7import com.rong.DAO.UserDao;
8import com.rong.DAO.UserDaoImpl;
9import com.rong.ORM.User;
10
11public class RegisterAction extends ActionSupport {
12
13  private UserDao userDao = new UserDaoImpl();
14
15  private User user;  //注冊提交的用戶對象
16  
17   private String repwd;  //重復密碼
18  
19  private String inputCertCode;  //驗 證碼
20
21  public User getUser() {
22    return user;
23  }
24
25   public void setUser(User user) {
26    this.user = user;
27  }
28
29   public String getRepwd() {
30    return repwd;
31  }
32
33  public void setRepwd(String repwd) {
34    this.repwd = repwd;
35  }
36
37   public String getInputCertCode() {
38    return inputCertCode;
39  }
40
41   public void setInputCertCode(String inputCertCode) {
42    this.inputCertCode = inputCertCode;
43  }
44
45  @Override
46  public String execute() throws Exception {
47
48    userDao.add(user);    //保存注冊的user對象
49     return SUCCESS;
50  }
51
52  @Override
53  public void validate() {
54     //驗證碼驗證
55    if(null == inputCertCode || "".equals(inputCertCode)) {
56      this.addFieldError("inputCertCode", "驗證碼不能為空!");
57    } else{
58      Map session = ActionContext.getContext().getSession();
59       String certCode = session.get("certCode").toString();
60      if( ! certCode.equals(this.inputCertCode)){
61        this.addFieldError ("inputCertCode", "驗證碼不正確!");
62      }
63    }
64    
65   }
66    
67}
68

11、不要忘記配置校驗框架,與上面兩個Action同一個目錄下。LoginAction-validation.xml代碼如 下:

1<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
2  "http://www.opensymphony.com/xwork/xwork-validator- 1.0.2.dtd">
3
4<validators>
5  <!-- 用戶名驗證 -->
6   <field name="name">
7    <field-validator type="requiredstring">
8       <param name="trim">true</param>
9      <message>用戶名不 能為空!</message>
10    </field-validator>
11    <field- validator type="regex">
12      <param name="expression"><![CDATA[(\w{4,8})]]></param>
13      <message>賬號必須是長度為4-8的數字或字母!</message>
14     </field-validator>
15  </field>
16  <!-- 密碼驗證 -->
17   <field name="pwd">
18    <field-validator type="requiredstring">
19       <param name="trim">true</param>
20      <message>密碼不 能為空!</message>
21    </field-validator>
22    <field- validator type="regex">
23      <param name="expression"><![CDATA[(\w{4,8})]]></param>
24      <message>密碼必須長度為4-8的數字或字母!</message>
25     </field-validator>
26  </field>
27
28</validators>

RegisterAction-validation.xml代碼如下:

1<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
2  "http://www.opensymphony.com/xwork/xwork-validator- 1.0.2.dtd">
3
4<validators>
5
6  <!-- 用戶名驗證 -->
7   <field name="user.name">
8    <field-validator type="requiredstring">
9      <param name="trim">true</param>
10       <message>用戶名不能為空!</message>
11    </field- validator>
12    <field-validator type="regex">
13      <param name="expression"><![CDATA[(\w{4,8})]]></param>
14      <message>賬號必須是長度為4-8的數字或字母!</message>
15     </field-validator>
16  </field>
17
18  <!-- 密碼驗證 -- >
19  <field name="user.pwd">
20    <field-validator type="requiredstring">
21      <param name="trim">true</param>
22       <message>密碼不能為空!</message>
23    </field- validator>
24    <field-validator type="regex">
25      <param name="expression"><![CDATA[(\w{4,8})]]></param>
26      <message>密碼必須長度為4-8的數字或字母!</message>
27     </field-validator>
28  </field>
29  
30  <field name="repwd">
31    <field-validator type="requiredstring" short- circuit="true">
32      <param name="trim">true</param>
33       <message>重復密碼不能為空!</message>
34    </field- validator>
35    <field-validator type="fieldexpression">
36       <param name="expression"><![CDATA[(repwd==user.pwd)]]></param>
37       <message>兩次輸入的密碼要一致!</message>
38    </field- validator>
39  </field>
40  
41</validators>

到這裡,我們的項目也差不多完成了,大家自己也嘗試一下,開發出自己的J2EE系統。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved