Struts 2.0 整合 Hibernate 3.2 开发注册登录系统
开发工具: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 <! 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"的代码如下:
1
package
com.rong.ORM;
2
3 public 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}
2
3 public 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 >
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"的数据库。
1
package
tool;
2
3 import org.hibernate.cfg.Configuration;
4 import org.hibernate.tool.hbm2ddl.SchemaExport;
5
6 public 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
2
3 import org.hibernate.cfg.Configuration;
4 import org.hibernate.tool.hbm2ddl.SchemaExport;
5
6 public 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类:
1
package
com.rong.hibernate;
2
3 import org.hibernate.HibernateException;
4 import org.hibernate.Session;
5 import org.hibernate.SessionFactory;
6 import org.hibernate.cfg.Configuration;
7
8 public 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
2
3 import org.hibernate.HibernateException;
4 import org.hibernate.Session;
5 import org.hibernate.SessionFactory;
6 import org.hibernate.cfg.Configuration;
7
8 public 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代码如下:
1
package
com.rong.DAO;
2
3 import java.util.List;
4 import com.rong.ORM.User;
5
6 public 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}
2
3 import java.util.List;
4 import com.rong.ORM.User;
5
6 public 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的代码如下:
1
package
com.rong.DAO;
2
3 import java.util.Iterator;
4 import java.util.List;
5 import org.hibernate.Query;
6 import org.hibernate.Session;
7 import org.hibernate.Transaction;
8 import com.rong.ORM.User;
9 import com.rong.hibernate.HibernateUtil;
10
11 public 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
2
3 import java.util.Iterator;
4 import java.util.List;
5 import org.hibernate.Query;
6 import org.hibernate.Session;
7 import org.hibernate.Transaction;
8 import com.rong.ORM.User;
9 import com.rong.hibernate.HibernateUtil;
10
11 public 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 >
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
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
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 %>
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 ,这个类主要用来生成彩色的验证图片,其代码如下:
1
package
com.rong.other;
2 import java.awt.Color;
3 import java.awt.Font;
4 import java.awt.Graphics;
5 import java.awt.image.BufferedImage;
6 import java.io.IOException;
7 import java.io.OutputStream;
8 import java.util.Random;
9 import javax.imageio.ImageIO;
10 /** */ /**
11 * 生成验证码图片
12 */
13 public 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
2 import java.awt.Color;
3 import java.awt.Font;
4 import java.awt.Graphics;
5 import java.awt.image.BufferedImage;
6 import java.io.IOException;
7 import java.io.OutputStream;
8 import java.util.Random;
9 import javax.imageio.ImageIO;
10 /** */ /**
11 * 生成验证码图片
12 */
13 public 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 >
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的代码如下:
1
package
com.rong.action;
2
3 import java.util.Map;
4 import com.opensymphony.xwork2.ActionContext;
5 import com.opensymphony.xwork2.ActionSupport;
6 import com.rong.DAO.UserDao;
7 import com.rong.DAO.UserDaoImpl;
8 import com.rong.ORM.User;
9
10 public 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
2
3 import java.util.Map;
4 import com.opensymphony.xwork2.ActionContext;
5 import com.opensymphony.xwork2.ActionSupport;
6 import com.rong.DAO.UserDao;
7 import com.rong.DAO.UserDaoImpl;
8 import com.rong.ORM.User;
9
10 public 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的代码如下:
1
package
com.rong.action;
2
3 import java.util.Map;
4
5 import com.opensymphony.xwork2.ActionContext;
6 import com.opensymphony.xwork2.ActionSupport;
7 import com.rong.DAO.UserDao;
8 import com.rong.DAO.UserDaoImpl;
9 import com.rong.ORM.User;
10
11 public 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
2
3 import java.util.Map;
4
5 import com.opensymphony.xwork2.ActionContext;
6 import com.opensymphony.xwork2.ActionSupport;
7 import com.rong.DAO.UserDao;
8 import com.rong.DAO.UserDaoImpl;
9 import com.rong.ORM.User;
10
11 public 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 >
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 >
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系统。
本文原创,转载请注明出处,谢谢!http://www.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)