開發工具: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"?>
7、登錄頁面login.jsp代碼如下:
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>
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系統。