基于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);
    }

}
时间: 2024-10-24 15:35:55

基于struts2和hibernate的登录和注册功能——完整实例的相关文章

基于Struts2 Spring ibatis Oracle10g架构 多数据源动态切换实例

一.概述 基于Spring动态配置多数据源,在大型的应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效的提高系统的水平伸缩性,而这样的解决方案就会补同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求以及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据. Spring配置多个数据源的方式和具体使用过程,Spring对于多数据源,以数据库表为参照,大体上可以分为两大类情况: 1.表级上的跨数据库,即对于不同的数据库却有不相同的表(表名和表结构完全

用java数组模拟登录和注册功能

package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static String arr1[] = new String[3]; public static String arr2[] = new String[3]; static int index = 0; @SuppressWarnings("resource") public static void

BBS登录与注册功能

登录功能 视图函数 def my_login(request): if request.method == 'GET': return render(request, 'login.html') else: name = request.POST.get('name') password = request.POST.get('password') code_text = request.POST.get('text') text = request.session.get('code_text

利用PHP实现登录与注册功能以及使用PHP读取mysql数据库——以表格形式显示数据

登录界面 <body><form action="login1.php" method="post"><div>用户名:<input type="text" name="uid" /></div><br /><div>密码:<input type="password" name="pwd" />

Unity uGUI 登录及注册功能

上次我们已经完成了登录界面的模拟功能,今天咱们把上次没做完的继续完善下!那么废话少说直接开始吧! PS:本次完善的功能有: 1,增加对数据库的操作. 2,使用了MD5Key值加密 3,完善登录和组测功能 4,环境Win8.1+Unity4.6+mysql 1,咱们就接着上次的工程继续吧,所以就不再新建工程了. 2,引入对数据库的操作,因此我们封装了一个SqlAccess类. SqlAccess.cs /****************************** * 对数据库操作的封装 * @A

使用函数完成用户登录和注册功能

#先让用户选择,是登陆还是注册 #选择序号完毕之后,运行相应的程序,#验证成功之后,可以让其继续选择,登陆还是注册,还可以选择退出. import time,os #文件名 file_name = 'user_list.txt' def file_exists(*args,**kwargs): ''' # 判断用户列表文件是否存在 :return: True 存在 False 不存在 ''' # 判断文件是否存在 if os.path.exists(file_name): return True

Django框架操作之实现登录、注册功能(数据库的增、删、改、查)

一.Django的工作流 1:用户通过浏览器输入相应的 URL 发起 HTTP 请求(一般是 GET/POST) 2:Django 接受到请求,检测 urls.py 文件,找到和用户输入的 URL 相匹配的项,并调用该 URL 对应的视图函数(view),例如,通常来说 urls.py 文件里的代码是这样的: url(r'^homepage/$', views.home_page) 则当用户输入的 URL 为 www.某个网址.com/homepage 时,django 检测到该 URL 与上面

家庭记账本的登录和注册功能的实现

下面是工程目录 login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title&g

android和php开发的用户登录以及注册功能

完成android的记住密码.自动登录以及发送短信.验证码倒计时功能.用户名和手机唯一性验证.以android为客户端.php为服务端