开发环境:

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最终解决方案

编码步骤:

  1. 使用hibernate框架生成数据实体POJO类,即该项目中的Userinfo类
  2. 编写逻辑层UserDAO类
  3. 编写控制层Action类,分为登录Action和注册Action
  4. 编写视图层JSP,分为登录界面和注册页面,以及登录、注册成功后通通跳转到成功界面
  5. 编写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】的更多相关文章

  1. WEB简单的登录注册功能(分层)

    登录: 前端页面: <body> <form action="/webtext/LogingServlet" method="post"> ...

  2. SSM 实现登录注册功能

    1.上一篇SSM框架搭建好了之后就要开始写功能了,现在来写一个简单的登录注册功能 这几个包是自己手动创建的,然后往里面写代码 2.代码详情 package com.maike.controller; ...

  3. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  4. Angular之简单的登录注册

    使用Angular实现了一个简单的登录注册的功能........ 涉及到的Angular知识点很少 主要是这个功能的实现...(*^__^*) 嘻嘻…… 里面涉及到的知识点记录: 1.本地存储的操作 ...

  5. Python 实现简单的登录注册界面

    Python 实现简单的登录注册界面 注意:编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import message ...

  6. flask 开发用户登录注册功能

    flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...

  7. Java Spring+Mysql+Mybatis 实现用户登录注册功能

    前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...

  8. vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.准备工作 1.1前端框架 前端使用了基于vue.js的nuxt.js.为什么使用nuxt.js? 首先我做的是博客的项目 ...

  9. Node.js实现登录注册功能

    使用Node.js + Navicat for mysql实现的登录注册功能 数据库中存在有”user_id,user_name,password,user_img,user_number“字段,其中 ...

随机推荐

  1. [SCOI2009]生日礼物

    https://www.luogu.org/problem/show?pid=2564 题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x ...

  2. 「模板」 01 Trie实现平衡树功能

    不想多说什么了.费空间,也不算太快,唯一的好处就是好写吧. #include <cstdio> #include <cstring> const int MAXN=100010 ...

  3. Sass 基本特性-运算 感觉满满都是坑

    Sass中的基本运算 一.加法 在 CSS 中能做运算的,到目前为止仅有 calc() 函数可行.但在 Sass 中,运算只是其基本特性之一.      sass做加法运算是可以不考虑参数带单位,但需 ...

  4. bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序

    Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...

  5. 【BZOJ】3971 [WF2013]Матрёшка

    [算法]区间DP [题解] 参考写法:BZOJ 3971 Матрёшка 解题报告 第二个DP可以预处理mex优化到O(nM+n2),不过我懒…… 第一个DP有另一种写法:不预处理,在一个n2取出来 ...

  6. webpack自动生成项目的html

    1 自动生成多个html页面 设置webpack.config.js中的plugins属性,多次调用plugin插件(new htmlWebpackPlugin()),同时设置对应数量的.js入口文件 ...

  7. perl HTML::LinkExtor模块(1)

    use LWP::Simple; use HTML::LinkExtor; $html = get("http://www.baidu.com"); $link = HTML::L ...

  8. 有向有权图的最短路径算法--Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  9. skb管理函数之skb_put、skb_push、skb_pull、skb_reserve

    四个操作函数直接的区别,如下图: /** * skb_put - add data to a buffer * @skb: buffer to use * @len: amount of data t ...

  10. shell中的IFS和$*变量

    本文转载自http://blog.chinaunix.net/uid-22566367-id-381955.html 自我记录内容.在工程中遇到了相关内容的shell脚本.在此处记录 STRING1= ...