基于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="提交" />
<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&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);
} }
基于struts2和hibernate的登录和注册功能——完整实例的更多相关文章
- AndroidStudio制作登录和注册功能的实现,界面的布局介绍
前言 大家好,给大家带来AndroidStudio制作登录和注册功能的实现,界面的布局介绍的概述,希望你们喜欢 每日一句: Success is connecting with the world a ...
- VS连接SQL Server 2008,并实现登录和注册功能
--------------------- 作者:Cambridge 来源:CSDN 原文:https://blog.csdn.net/cambridgeacm/article/details/797 ...
- BBS登录与注册功能
登录功能 视图函数 def my_login(request): if request.method == 'GET': return render(request, 'login.html') el ...
- 用java集合模拟登录和注册功能
package com.linkage.login; import java.util.HashMap;import java.util.Iterator;import java.util.Map;i ...
- 用java数组模拟登录和注册功能
package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...
- JavaWeb 实现简单登录、注册功能
1.首先创建一个简单的动态Javaweb项目 2.然后手动建立文件目录: 项目创建好之后,在src下建几个包: controller:控制器,负责转发请求,对请求进行处理,主要存放servlet: d ...
- 基于struts2、hibernate、spring、shiro、MySQL的项目开发
使用maven管理jar包的依赖 < project xmlns = “ http://maven.apache.org/POM/4.0.0 ” xmlns :xsi = “ http://ww ...
- 基于struts2和hibernate的分页实现
在拜读了各位大牛的博客后,加以修改和添加总算是借鉴出了一个可行的分页实现.(●'◡'●) 话不多说,先贴两张效果图吧 接下来是实现代码: pagingDAOImpl.java public class ...
- Unity uGUI 登录及注册功能
上次我们已经完成了登录界面的模拟功能,今天咱们把上次没做完的继续完善下!那么废话少说直接开始吧! PS:本次完善的功能有: 1,增加对数据库的操作. 2,使用了MD5Key值加密 3,完善登录和组测功 ...
随机推荐
- spring-boot-devtools 实现热部署
1.devtools spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot ...
- MVC ---- EF批处理
#region 批处理 ///<summary> ///两增一删一改 ///</summary> public void Save(){ //新增参一 Parameter pa ...
- Java 打开Excel,往Excel中存入值,保存的excel格式分别是xls和xlsx
https://mirrors.cnnic.cn/apache/poi/xmlbeans/release/src/ package Excel; import org.apache.poi.hssf. ...
- Windows 上安装 MySQL
Windows 上安装 MySQL https://www.mysql.com/downloads/ 1.下载MySQL安装包(官网下载链接): 选择 DOWNLOADS ——> Communi ...
- MongoDB(课时22 唯一索引)
3.6.1 唯一索引 唯一索引的主要目的是用在某一个字段上,使该字段的内容不重复. 范例:创建唯一索引 db.students.ensureIndex({"name" : 1}, ...
- string 和 wstring
区别: char* wchar_t 一个字节 两个字节 ACSII编码 unicode编码 转换: 1.Windows API WideCharToMultiByte() MultiByteToWid ...
- Codeforces 614E - Necklace
614E - Necklace 思路:如果奇数超过1个,那么答案是0:否则,所有数的gcd就是答案. 构造方案:每个数都除以gcd,如果奇数个仍旧不超过1个,找奇数个那个在中间(如果没有奇数默认a), ...
- 动态规划-最长可互除子序列 Largest Divisible Subset
2018-08-28 17:51:04 问题描述: 问题求解: 本题是一个求最优解的问题,很自然的会想到动态规划来进行解决.但是刚开始还是陷入了僵局,直到看到了hint:LIS,才有了进一步的思路.下 ...
- ajax思维导图
- 『科学计算_理论』优化算法:梯度下降法&牛顿法
梯度下降法 梯度下降法用来求解目标函数的极值.这个极值是给定模型给定数据之后在参数空间中搜索找到的.迭代过程为: 可以看出,梯度下降法更新参数的方式为目标函数在当前参数取值下的梯度值,前面再加上一个步 ...