開發工具: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" 全部代碼如下:
1<?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 User user = new User(); 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系統.
[火星人 ] Struts 2.0整合Hibernate 3.2開發註冊登錄系統已經有599次圍觀