struts2_hibernate登陆范例
来源:互联网 发布:淘宝店铺排名靠后了 编辑:程序博客网 时间:2024/06/04 18:12
开发工具:MyEclipse6.0 ,Tomcat 5.5 ,JDK 1.5 ,MySQL 5.0 ;开发准备:下载Struts2.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/LoginSystem12 </property>13 <property name="dialect">14 org.hibernate.dialect.MySQLDialect15 </property>16 <property name="myeclipse.connection.profile">17 LoginSystem18 </property>19 <property name="connection.password">root</property>20 <property name="connection.driver_class">21 com.mysql.jdbc.Driver22 </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 }
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"的数据库。
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
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 HibernateException37 */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 name17 * @param password18 * @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 name37 * @param password38 * @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; //异常时返回065 }finally{66 util.closeSession(session);67 }68 }69 }70
6、在web.xml中配置Struts2.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.FilterDispatcher12 </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>618、在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 ,这个类主要用来生成彩色的验证图片,其代码如下:
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
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的代码如下:
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 @Override47 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 @Override46 public String execute() throws Exception {47 User user = new User();48 userDao.add(user); //保存注册的user对象49 return SUCCESS;50 }51 52 @Override53 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>
一切已经ok!!!
- struts2_hibernate登陆范例
- Struts+Hibernte登陆范例
- struts_hibernate登陆范例
- Struts2_Hibernate 3.3_Spring 3.0 配置
- android布局基础及范例(一):QQ登陆界面设计
- android布局基础及范例:QQ登陆界面设计
- 范例
- 范例
- 如何使用MFC编写自定义UI界面【附高仿QQ 2014登陆界面范例程序】
- 登陆
- 登陆
- 登陆
- 登陆
- 登陆
- 登陆
- 登陆
- 登陆
- 登陆
- J2EE中的13种技术
- 变量的存储方式和存储类别
- JavaMail开发<精通J2EE网络编程 12章>
- ubuntu 系统没声音解决办法
- 堆和栈的区别(转过无数次的文章)
- struts2_hibernate登陆范例
- 进程与线程的区别
- Validator,表单验证
- 马士兵hibernate学习笔记
- 马士兵Spring学习笔记
- wireshark初步使用
- 模板的特化,偏特化,实例化
- VC++下WIN窗体和MFC窗体的区别
- Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage