Struts2 + Hibernate3.3 开发简单的登录注册功能【J2EE】

开发环境:
IDE:Myeclipse10.0
数据库:Oracle(SQL Developer)
Web容器:Tomcat 7.0
JDK:1.6
Struts:2.0
Hibernate:3.3
数据库:(ID为主键,设置了序列以及触发器SEQUENCE_ID,使得ID自增)

注意事项:
创建项目以后,为项目添加Sturts和Hibernate能力
连接数据库并生成POJO类:Hibernate框架连接SQL sever 2016完整详细步骤
还有一个一定会出错的地方,因为Hibernate和Struts 2 中有相同的包(版本不同)会引起冲突,所以要把Struts 2 中的antlr-2.7.2.jar移除,具体操作可以看这篇:java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I最终解决方案
编码步骤:
- 使用hibernate框架生成数据实体POJO类,即该项目中的Userinfo类
- 编写逻辑层UserDAO类
- 编写控制层Action类,分为登录Action和注册Action
- 编写视图层JSP,分为登录界面和注册页面,以及登录、注册成功后通通跳转到成功界面
- 编写struts.xml,分为两个action,因为有两张form表单要填写以对应跳转不同的视图
POJO类:Userinfo.java
package com.ov; /**
* Userinfo entity. @author MyEclipse Persistence Tools
*/ public class Userinfo implements java.io.Serializable { // Fields private Integer id;
private String username;
private String password;
private String repassword; // Constructors /** default constructor */
public Userinfo() {
} /** full constructor */
public Userinfo(String username, String password, String repassword) {
this.username = username;
this.password = password;
this.repassword = repassword;
} // Property accessors public Integer getId() {
return this.id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public String getRepassword() {
return this.repassword;
} public void setRepassword(String repassword) {
this.repassword = repassword;
} }
自动生成的Userinfo.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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.ov.Userinfo" table="USERINFO" schema="SYSTEM">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="9" scale="0" />
<generator class="sequence">
<param name="sequence">SEQUENCE_ID</param>
</generator>
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" length="50" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="50" />
</property>
<property name="repassword" type="java.lang.String">
<column name="REPASSWORD" length="50" />
</property>
</class>
</hibernate-mapping>
UserDAO.java
package com.dao; import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.ov.Userinfo;
import com.util.HibernateSessionFactory; public class UserDAO {
private Session session;
private Transaction t;
//获取session连接
public void getCurrentSession() {
session = HibernateSessionFactory.getSession();
}
//关闭session连接
public void closeSession() {
if(session != null){
HibernateSessionFactory.closeSession();
}
} /**
* 登录:验证用户名和密码
* @param user
* @return true 存在
* @return false 不存在
*/
public boolean loginByUser(String username,String password){
getCurrentSession();
t = session.beginTransaction();
Query query = session.createQuery("from Userinfo where username='"+username+"' and password='"+password+"'");
List list = query.list();
closeSession();
if(list!=null && list.size()>0) { //存在用户名和密码
return true;
}
return false;
} /**
* 注册:先查询表中是否存在相同用户名,若无则增加,有则提示
* @param userinfo
* @return true 成功
* @return false 失败
*/
public boolean registByUser(Userinfo userinfo) {
try{
getCurrentSession();
t = session.beginTransaction();
String username = userinfo.getUsername();
String password = userinfo.getPassword();
String repassword = userinfo.getRepassword();
Query query = session.createQuery("from Userinfo where username='"+username+"'");
//query.setString(0, username);
List list = query.list();
if(list.size()>0){ //如果表中已经有相同的用户名
return false;
}
else{
session.save(userinfo);
t.commit();
return true;
}
}catch (Exception e) {
e.printStackTrace();
}
finally{
closeSession();
}
return false;
}
}
LoginAction.java
package com.action; import java.util.Map; import org.hibernate.Session; import com.dao.UserDAO;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.ov.Userinfo; public class LoginAction extends ActionSupport {
private String username;
private String password;
private String msg;//用于显示错误信息
/**
* 处理用户请求的execute方法
*/
public String execute() throws Exception {
//获得会话,用来保存当前登录用户的信息!
Map<String,Object> session = ActionContext.getContext().getSession();
Userinfo userinfo = new Userinfo();
userinfo.setUsername(username);
userinfo.setPassword(password);
session.put("userinfo", userinfo);
return SUCCESS;
} public void validate() {
if(username==null || username.equals("")){
this.addFieldError("username", "用户名不能为空!");
}
else if(password==null || password.equals("")){
this.addFieldError("password", "密码不能为空!");
}
else{
UserDAO dao = new UserDAO();
if(dao.loginByUser(username,password) == false){
this.addFieldError("username", "用户名或密码错误!");
}
}
} 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 String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }
RegistAction.java
package com.action; import java.util.Map; import org.hibernate.Session; import com.dao.UserDAO;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.ov.Userinfo; public class LoginAction extends ActionSupport {
private String username;
private String password;
private String msg;//用于显示错误信息
/**
* 处理用户请求的execute方法
*/
public String execute() throws Exception {
//获得会话,用来保存当前登录用户的信息!
Map<String,Object> session = ActionContext.getContext().getSession();
Userinfo userinfo = new Userinfo();
userinfo.setUsername(username);
userinfo.setPassword(password);
session.put("userinfo", userinfo);
return SUCCESS;
} public void validate() {
if(username==null || username.equals("")){
this.addFieldError("username", "用户名不能为空!");
}
else if(password==null || password.equals("")){
this.addFieldError("password", "密码不能为空!");
}
else{
UserDAO dao = new UserDAO();
if(dao.loginByUser(username,password) == false){
this.addFieldError("username", "用户名或密码错误!");
}
}
} 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 String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default">
<!-- 登录 -->
<action name="loginAction" class="com.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
<!-- 注册 -->
<action name="registAction" class="com.action.RegistAction">
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>主页</title>
</head> <body>
<s:form action="loginAction" method="post">
<s:fielderror><s:property value="msg"/></s:fielderror>
<s:textfield label="用户名" name="username"/>
<s:password label="密码" name="password"/>
<s:a href="register.jsp">注册</s:a>
<s:submit value="登录"/>
</s:form>
</body>
</html>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>主页</title>
</head> <body>
<s:form action="registAction" method="post">
<s:fielderror><s:property value="msg"/></s:fielderror><br>
<s:textfield label="用户名" name="username"/>
<s:password label="密码" name="password"/>
<s:password label="确认密码" name="repassword"/>
<s:submit value="提交"/> <s:reset value="重置"/>
</s:form>
</body>
</html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>主页</title>
</head> <body>
<s:set name="userinfo" value="#session['userinfo']"></s:set>
<s:property value="#userinfo.username"/>,您好!
</body>
</html>
Struts2 + Hibernate3.3 开发简单的登录注册功能【J2EE】的更多相关文章
- WEB简单的登录注册功能(分层)
登录: 前端页面: <body> <form action="/webtext/LogingServlet" method="post"> ...
- SSM 实现登录注册功能
1.上一篇SSM框架搭建好了之后就要开始写功能了,现在来写一个简单的登录注册功能 这几个包是自己手动创建的,然后往里面写代码 2.代码详情 package com.maike.controller; ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- Angular之简单的登录注册
使用Angular实现了一个简单的登录注册的功能........ 涉及到的Angular知识点很少 主要是这个功能的实现...(*^__^*) 嘻嘻…… 里面涉及到的知识点记录: 1.本地存储的操作 ...
- Python 实现简单的登录注册界面
Python 实现简单的登录注册界面 注意:编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import message ...
- flask 开发用户登录注册功能
flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...
- Java Spring+Mysql+Mybatis 实现用户登录注册功能
前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...
- vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分
0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.准备工作 1.1前端框架 前端使用了基于vue.js的nuxt.js.为什么使用nuxt.js? 首先我做的是博客的项目 ...
- Node.js实现登录注册功能
使用Node.js + Navicat for mysql实现的登录注册功能 数据库中存在有”user_id,user_name,password,user_img,user_number“字段,其中 ...
随机推荐
- python 基础--pip(转)
感谢:http://www.cnblogs.com/csucat/p/4897695.html python需要用到一些其他的库,可以手动去各个库的官网下载,自己安装:也可以安装pip,使用pip可以 ...
- [uva11997]k个最小和
一个k*k的矩阵,每行选取一个数相加则得到一个和,求最小的前k个和. k<=750 已知前m行最小的前k个和d[1]…d[k],则前m+1行最小的前k个和都必定是d[i](i<=k)+a[ ...
- 【BZOJ】1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
[题意]公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地. [算法]贪心+堆 [题解]线段和点的贪心,一般有按左端点排序和按右端点排序两种方法 ...
- TOJ 1005 Hero In Maze (深搜)
描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他知道公主在迷宫 ...
- HDU 1312 Red and Black (深搜)
题目链接 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore ...
- 15、简述MySQL的执行计划?
具体的Mysql的执行计划,请参考下面的链接: MySQL_执行计划详细说明
- C#编写程序监测某个文件夹内是否有文件进行了增,删,改的动作?
新建一个Console应用程序,项目名称为“FileSystemWatcher”,Copy代码进,编译后就可以用了.代码如下: using System; using System.Collectio ...
- hdu 2795 Billboard(线段树+单点更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795 Billboard Time Limit: 20000/8000 MS (Java/Others ...
- kaggle比赛流程(转)
一.比赛概述 不同比赛有不同的任务,分类.回归.推荐.排序等.比赛开始后训练集和测试集就会开放下载. 比赛通常持续 2 ~ 3 个月,每个队伍每天可以提交的次数有限,通常为 5 次. 比赛结束前一周是 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第五周作业
<Linux内核原理与设计>第五周作业 视频学习及操作分析 一.用户态.内核态和中断 内核态在CPU执行中对应高执行级别,执行级别为0级,具有特权指令,可以访问任意物理地址:用户态执行级别 ...