zoukankan      html  css  js  c++  java
  • 基于struts2和hibernate的登录和注册功能——完整实例

    1、该项目使用MySQL数据库,数据库名为test,表名info,如图所示:

    2、配置web.xml(Struts2使用)

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     3、编写视图组件(JSP页面)

    (1)登录页面 login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title><s:text name="基于SH的登录注册系统" /></title>
    </head>
    <body bgcolor="#CCCCFF">
        <s:form action="login" method="post">
            <br><br><br><br><br><br>
            <table border="1" align="center" bgcolor="AABBCCDD">
                <tr>
                    <td>
                        <s:textfield name="userName" label="用户名字" size="16" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:password name="password" label="用户密码" size="18" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <s:submit value="登录" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <s:a href="http://localhost:8080/hibernate01/register.jsp">注册</s:a>
                    </td>
                </tr>
        
            </table>
        
        </s:form>
        
        
        
    </body>
    </html>

    (2)登陆成功页面 success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body bgcolor="#CCCCFF">
        <hr>
        <table>
            <tr>
                <td>
                    欢迎<s:property value="userName"/>,登陆成功!
                </td>
            </tr>
        
        </table>
        <hr>
        
    </body>
    </html>

    (3)注册页面 register.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body bgcolor="#CCCCFF">
        <s:form action="register" method="post">
            <br><br><br><br><br><br>
            <table border="1" align="center" bgcolor="AABBCCDD">
                <tr>
                    <td>
                        <s:textfield name="userName" label="用户名字" size="16" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:password name="password1" label="用户密码" size="18" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:password name="password2" label="再次输入密码" size="18" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="提交" />&nbsp;&nbsp;
                        <input type="reset" value="清空" />
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <s:a href="http://localhost:8080/hibernate01/login.jsp">返回</s:a>
                    </td>
                </tr>
        
            </table>
        
        </s:form>
        
    
    
    </body>
    </html>

    4、业务控制器Action

    (1)登录页面对应的业务控制器LoginAction.java

    其中,重写valiadate()方法,进行手工验证

    package loginRegisterAction;
    
    import java.util.List;
    
    import loginRegisterDao.LoginRegisterInfo;
    
    import PO.UserInfoPO;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class LoginAction extends ActionSupport{
    
        private String userName;
        private String password;
        private String message="error";
        private List list;
        
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
        public void validate(){
            if(this.getUserName()==null||this.getUserName().length()==0){
                addFieldError("userName", "用户名不能为空!");
            }else{
                LoginRegisterInfo info= new LoginRegisterInfo();
                list=info.queryInfo("userName", this.getUserName());
                if(list.size()==0){
                    addFieldError("userName", "该用户尚未注册");
                }else{
                    UserInfoPO ui=new UserInfoPO();
                    for(int i=0;i<list.size();i++){
                        ui=(UserInfoPO) list.get(i);
                        if(this.getUserName().equals(ui.getUserName())){
                            if(ui.getPassword().equals(this.getPassword())){
                                message=SUCCESS;
                            }else{
                                addFieldError("password", "登录密码不正确");
                            }
                        }
                    }
                }
            }
        }
        
        public String execute() throws Exception{
            return message;
        }
        
    }

    (2)注册页面对应的业务控制器RegisterAction.java

    package loginRegisterAction;
    
    import java.util.List;
    
    import loginRegisterDao.LoginRegisterInfo;
    
    import PO.UserInfoPO;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class RegisterAction extends ActionSupport {
    
        private String userName;
        private String password1;
        private String password2;
        private String mess=ERROR;    //ERROR等同于"error"
        private List list;
        
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword1() {
            return password1;
        }
        public void setPassword1(String password1) {
            this.password1 = password1;
        }
        public String getPassword2() {
            return password2;
        }
        public void setPassword2(String password2) {
            this.password2 = password2;
        }
        
        public void validate(){
            if(this.getUserName()==null||this.getUserName().length()==0){
                addFieldError("userName", "用户名不能为空!");
            }else{
                LoginRegisterInfo info= new LoginRegisterInfo();
                list=info.queryInfo("userName", this.getUserName());
                UserInfoPO ui=new UserInfoPO();
                for(int i=0;i<list.size();i++){
                    ui=(UserInfoPO) list.get(i);
                    if(ui.getUserName().equals(this.getUserName())){
                        addFieldError("userName", "用户名已存在!");
                    }
                }
            }
            if(this.getPassword1()==null||this.getPassword1().length()==0){
                addFieldError("password1", "登录密码不许为空!");
            }else if(this.getPassword2()==null||this.getPassword2().length()==0){
                addFieldError("password2", "重复密码不许为空!");
            }else if(!this.getPassword1().equals(this.getPassword2())){
                addFieldError("password2", "两次密码不一致!");
            }
        }
        
        public UserInfoPO userInfo(){
            UserInfoPO info=new UserInfoPO();
            info.setUserName(this.getUserName());
            info.setPassword(this.getPassword1());
            return info;
        }
        
        public String execute() throws Exception{
            LoginRegisterInfo lr=new LoginRegisterInfo();
            String ri=lr.saveInfo(userInfo());
            if(ri.equals("success")){
                mess=SUCCESS;
            }
            
            return mess;
        }
        
    }
        

    5、在struts.xml中配置Action

    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
     
    <struts>
        <package name="default" extends="struts-default">
            <action name="register" class="loginRegisterAction.RegisterAction">
                <result name="success">/login.jsp</result>
                <result name="input">/register.jsp</result>
                <result name="error">/register.jsp</result>
            </action>
            <action name="login" class="loginRegisterAction.LoginAction">
                <result name="success">/success.jsp</result>
                <result name="input">/login.jsp</result>
                <result name="error">/login.jsp</result>
            </action>
        </package>
    </struts>

    6、Hibernate的配置文件

    使用Hibernate需要通过Hibernate的配置文件加载数据库驱动以及与数据建立连接,配置文件为hibernate.cfg.xml 

    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8</property>
            <property name="connection.username">root</property>
            <property name="connection.password"></property>
            <!-- 指定数据库的方言 -->
            <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
            <!-- 加入映射文件 -->
            <mapping resource="PO/UserInfoPO.hbm.xml"/>
            
        </session-factory>
    </hibernate-configuration>

     7、加载上面Hibernate配置文件的类(HIbernateSessionFactory.java)

    package addHibernateFile;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateSessionFactory {
    
        private SessionFactory sessionFactory;
        
        public HibernateSessionFactory(){
            
        }
        
        public SessionFactory config(){
            try{
                Configuration configuration= new Configuration();
                Configuration configure=configuration.configure("hibernate.cfg.xml");
                return configure.buildSessionFactory();
            }catch(Exception e){
            e.getMessage();
            return null;
            }
        }
        
        public Session getSession(){
            sessionFactory=config();
            return sessionFactory.openSession();
        }
        
    }

    8、PO对象以及对应的映射文件(在同一个包下)

    (1)PO对象的类UserInfoPO.Java

    package PO;
    /*
     * PO对象(持久化对象)的类,与数据库相对应
     */
    public class UserInfoPO {
    
        private int id;
        private String userName;
        private String password;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        
        
        
        
    }

    (2) PO对应的映射文件UserInfoPO.hbm.xml

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <!-- 映射文件的根元素 -->
    <hibernate-mapping>
    
        <!-- 配置PO对象与数据库中表的对应关系使用class元素,name配置PO对象对应的类,
             table配置该PO对象在数据库中对应的表名,catalog配置表对应的数据库名 -->
        <class name="PO.UserInfoPO" table="info" catalog="test">
    
            <!-- id元素配置PO对象与数据库中表的对应id字段,name配置PO对象对应的属性,type指定类型
                 generator元素将主键自动加入序列 -->
            <id name="id" type="int">
                <column name="id"/>
                <generator class="assigned" />
            </id>
            
            <property name="userName" type="string">
                <column name="userName" length="30" not-null="true" />
            </property>
            
            <property name="password" type="string">
                <column name="password" length="30" not-null="true" />
            </property>
        
        </class>
    
    </hibernate-mapping>

    9、完成登录和注册业务功能

    将登录和注册业务功能封装到类LoginRegisterInfo(JavaBean)中

    数据库操作类LoginRegisterInfo.java:

    package loginRegisterDao;
    /*
     * 登录和注册业务功能,封装到这个JavaBean
     */
    import java.util.List;
    
    import javax.swing.JOptionPane;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import PO.UserInfoPO;
    import addHibernateFile.HibernateSessionFactory;
    
    public class LoginRegisterInfo {
    
        private Session session;
        private Transaction transaction;
        private Query query;
        HibernateSessionFactory getSession;
        
        public LoginRegisterInfo(){
        }
        
        public String saveInfo(UserInfoPO info){
            String mess="error";
            getSession=new HibernateSessionFactory();
            session=getSession.getSession();
            try{
                transaction=session.beginTransaction();
                session.save(info);
                transaction.commit();
                mess="success";
                return mess;
            }catch(Exception e){
                message("RegisterInfo.error:"+e);
                e.printStackTrace();
                return null;
            }
        }
        
        public List queryInfo(String type,Object value){
            getSession=new HibernateSessionFactory();
            session=getSession.getSession();
            try{
                String hqlsql="from UserInfoPO as u where u.userName=?";
                query=session.createQuery(hqlsql);
                query.setParameter(0, value);
                List list=query.list();
                transaction=session.beginTransaction();
                transaction.commit();
                return list;
            }catch(Exception e){
                message("LoginRegisterInfo类中有异常,异常为::"+e);
                e.printStackTrace();
                return null;
                }
        }
        
        
        public void message(String mess){
            int type=JOptionPane.YES_NO_OPTION;
            String title="提示信息";
            JOptionPane.showMessageDialog(null, mess,title,type);
        }
        
    }
  • 相关阅读:
    WNMP 环境搭建
    单元测试工具 unitils
    [转] 利用git钩子,使用python语言获取提交的文件列表
    Spring AOP理解
    JavaScript Cookies使用
    [转]SURF算法解析
    [转]四旋翼飞行器的姿态解算小知识点
    [转]C++内存管理
    学习SQL笔记
    华为软件类常见面试问题集锦
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/5692182.html
Copyright © 2011-2022 走看看