第二章:用户登录管理模块

本章简介

1.项目分层

2.创建MyHibernateSessionFactory

3.设计用户接口和实现类

4.设计所有Action父类

5.设计用户Action类

6.页面调用

7.完成显示登录成功用户名和注销功能

8.显示报错信息

 

1.项目分层

  • 实体层(模型层):entity包 学生类、用户类
  • 数据库层(模型层):db包
  • 接口层(模型层):service包
  • 接口实现层(模型层):service.impl包      
  • 动作层(控制层):action包    
  • Jsp页面(视图层):整个项目所有的JSP页面      

2.创建MyHibernateSessionFactory(会话工厂工具类)

  • 创建自定义的session工厂类

  将来我们可以调用工具类getSessionFactory()静态方法,返回会话工厂的一个实例

  会话工厂工具类MyHibernateSessionFactory.java

package db;import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;public class MyHibernateSessionFactory {private static SessionFactory sessionFactory;//会话工厂属性//构造方法私有化。保证单例模式private MyHibernateSessionFactory(){}//公有的静态方法,获得会话工厂对象public static SessionFactory getSessionFactory(){if(sessionFactory==null){Configuration config=new Configuration().configure();ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();sessionFactory=config.buildSessionFactory(serviceRegistry);return sessionFactory;}else{return sessionFactory;}}}

 

3.设计用户接口和实现类

  • 用户业务逻辑接口:包含跟用户相关的所有一些方法,比方说用户的登录、注销等
  • 用户业务逻辑实现类:接口当中的方法都是抽象的,没有实现,我们还要实现它具体的接口实现类

用户业务逻辑接口

package service;import entity.Users;//用户业务逻辑接口
public interface UsersDAO {//用户登录方法public boolean usersLogin(Users u);}

 

用户业务逻辑实现类

package service.impl;import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;import db.MyHibernateSessionFactory;import entity.Users;
import service.UsersDAO;public class UsersDAOImpl implements UsersDAO{public boolean usersLogin(Users u) {// TODO Auto-generated method stub//事务对象Transaction tx = null;String hql = "";try{Session session = MyHibernateSessionFactory.getSessionFactory().getCurrentSession();tx=session.beginTransaction();//开启事务hql = "from Users where username=? and password=?";//?是占位符,两个问号表示两个参数Query query = session.createQuery(hql);//传入hql语句query.setParameter(0, u.getUsername());//传递参数(由于上面的hql语句用了两个占位符表示要传入两个参数)query.setParameter(1, u.getPassword());List list=query.list();//查询,返回结果集tx.commit();//提交事务//判断是否查到用户if(list.size()>0){return true;}else{return false;}}catch(Exception ex){ex.printStackTrace();//打印异常堆栈return false;}finally{if(tx!=null){//tx.commit();//不能重复提交事务tx=null;}}}}

 

测试方法是否正确

package service.impl;import junit.framework.Assert;import org.junit.Test;import service.UsersDAO;import entity.Users;public class TestUsersDAOImpl {@Testpublic void testUsersLogin(){Users u= new Users(1,"zhangsan","123456");UsersDAO udao=new UsersDAOImpl();Assert.assertEquals(true, udao.usersLogin(u));//断言}}

 

4.设计所有Action父类

  • 设计action父类
  • 继承ActionSupport(ActionSupport内置了很多拦截器,方便我们以后的使用)
  • 为了获得常用的内置对象采用耦合IOC方式注入属性。

  需要实现以下三个接口:

  ServletRequestAware

  ServletResponseAware

  ServletContextAware

package action;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;//所有Action动作的父类
public class SuperAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{/*** */private static final long serialVersionUID = 1L;protected HttpServletRequest request;//请求对象protected HttpServletResponse response;//响应对象protected HttpSession session;//会话对象protected ServletContext application;//全局对象public void setServletContext(ServletContext application) {// TODO Auto-generated method stubthis.application=application;}public void setServletResponse(HttpServletResponse response) {// TODO Auto-generated method stubthis.response=response;}public void setServletRequest(HttpServletRequest request) {// TODO Auto-generated method stubthis.request=request;this.session=this.request.getSession();}}

 

5.设计用户Action类

  • 设计用户Action类,采用模型驱动接收表单数据。

  struts2接收表单数据的方式:普通属性、领域对象、模型驱动

设计用户Action类

package action;import service.UsersDAO;
import service.impl.UsersDAOImpl;import com.opensymphony.xwork2.ModelDriven;import entity.Users;public class UsersAction extends SuperAction implements ModelDriven<Users>{/*** */private static final long serialVersionUID = 1L;private Users user=new Users();//用户登录动作public String login(){UsersDAO udao = new UsersDAOImpl();if(udao.usersLogin(user)){return "login_success";//返回一个结果集}else{return "login_failure";}}public Users getModel() {// TODO Auto-generated method stubreturn this.user;}	}

需要在struts.xml配置文档当中来注册

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="default" namespace="/" extends="struts-default"></package><package name="users" namespace="/users" extends="default"><action name="*_*" class="action.{1}Action" method="{2}"><result name="login_success">/users/Users_login_success.jsp</result><result name="login_failure">/users/Users_login.jsp</result></action>       </package></struts>

 

6.页面调用

  • 登录页面调用用户登录动作。

User_login.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!-- 这是一个html5 doctype声明 -->
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>用户登录</title></head>
<style type="text/css">
body{margin:0px;padding:0px;overflow:hidden;
}
#wrapper{position:absolute;width:100%;height:100%;min-width:1280px;min-height:680px;overflow-x:hidden;overflow-y:hidden;background-image: -moz-linear-gradient(top,#77D1F6, #2F368F);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #77D1F6),color-stop(1, #2F368F));
}
#header{height:100px;width:100%;
}
#logo{position:absolute;float:left;margin-left:5%;margin-top:30px;height:40px;width:160px;text-align:center;
}
#heading{position:relative;float:left;margin-left:20%;margin-top:-18px;height:110px;width:60%;border-radius: 18px;background-color:#1C75BC;opacity:0.6;
}
#heading #title{margin-top:40px;text-align:center;font-family:微软雅黑;font-size:24px;font-weight:bold;
}
#heading #subTitle{margin-top:10px;text-align:center;font-family:Courier New;
}
#main{margin-top:20px;height:500px;width:100%;
}
#mainBg{position:relative;float:left;margin-left:20%;margin-top:0px;height:500px;width:60%;border-radius: 18px;background-color:#000000;opacity:0.5;
}
#mainPanel{position:relative;margin:25px;height:450px;border-radius: 18px;background-image: -moz-linear-gradient(top,#EBEBEB, #BFBFBF);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #EBEBEB),color-stop(1, #BFBFBF));
}
#mainPanel #left{float:left;border-right:2px solid #F6F6F6;position:relative;top:10%;height:80%;width:49%;border-right-style:groove;
}
#mainPanel #image{position:relative;height:256px;width:256px;left:15%;top:12%;background-image:url('../images/admin.png');
}
#mainPanel #right{float:left;position:relative;height:90%;width:49%;top:5%;
}
#welcome{margin-top:20px;height:60px;width:100%;vertical-align: middle;display: inline-block;line-height: 60px;text-align:center;
}
#welcome #welcome-text{font-size:38px;font-weight:bold;font-family:微软雅黑;text-shadow: 0 1px 1px #F6F6F6;
}
#user-name{height:35px;width:100%;margin-top:20px;vertical-align: middle;display: inline-block;line-height: 35px;
}
#user-password{margin-top:20px;height:35px;width:100%;vertical-align: middle;display: inline-block;line-height: 35px;
}
#user-checkcode{margin-top:20px;height:35px;width:100%;vertical-align: middle;display: inline-block;line-height: 35px;
}
#button-group{margin-top:10px;height:35px;width:100%;vertical-align: middle;display: inline-block;line-height: 35px;text-align:center;
}
#error-tip{margin-top:20px;margin-left:5%;height:40px;width:90%;vertical-align: middle;display: inline-block;line-height: 35px;text-align:center;border-bottom:2px solid #F6F6F6;border-bottom-style:groove;
}
#error-tip #tip-text{font-size:18px;font-weight:bold;font-family:微软雅黑;color:red;
}
.item{margin-left:20px;font-family:微软雅黑;font-size:20px;font-weight:bold;float: left;width:80px;margin-top: 3px;text-align: center;text-shadow: 0 1px 1px #F6F6F6;
}
.input{vertical-align: middle;display: inline-block;
}
#checkcode-img{margin-top:3px;height:20px;width:60px;
}
.form-input{height:20px;
}
.btn{border:1px solid #cccccc;cursor:pointer;margin:10px 5px;height:40px;width:80px;text-align:center;border-radius: 4px;border-color: #636263 #464647 #A1A3A5;text-shadow: 0 1px 1px #F6F6F6;background-image: -moz-linear-gradient(center top, #D9D9D9, #A6A6A6 49%, #A6A6A6 50%);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #D9D9D9),color-stop(1, #A6A6A6));
}
#footer{margin-top:20px;width:100%;
}
#footer #text{text-align:center;font-size:14px;font-family:微软雅黑;font-weight:bold;
}
</style>
<body>
<div id="wrapper"><div id="header"><div id="logo"></div><div id="heading"><div id="title">后台管理系统</div><div id="subTitle">Ver 1.0</div></div></div><div id="main"><div id="mainBg"><div id="mainPanel"><div id="left"><div id="image"></div></div><div id="right"><form name="loginForm" action="<%=path%>/users/Users_login.action" method="post"><!-- start of login form --><div id="welcome"><span id="welcome-text">管 理 登 录</span></div><div id="user-name"><span class="item">用户名:</span><span><input type="text" name="username" class="form-input"></span></div><div id="user-password"><span class="item">密   码:</span><span class="input"><input type="password" name="password" class="form-input"></span></div><div id="button-group"><input type="submit" class="btn" value="登录"/><input type="reset" class="btn" value="重置"/></div><div><s:fielderror/> <!-- 显示表单验证的出错信息 --></div><!-- end of form --></form></div></div></div></div><div id="footer"><div id="text">Copyright © 2009-2015 All Rights Reserved Powered By Simoniu</div></div>
</div>
</body>
</html>

 

7.完成显示登录成功用户名和注销功能

8.显示报错信息

  • 在登录表单上显示表单验证出错信息

 

转载于:https://www.cnblogs.com/songsongblue/p/9532318.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python组合数据分类_Python 数据可视化:分类特征统计图

上一课已经体验到了 Seaborn 相对 Matplotlib 的优势&#xff0c;本课将要介绍的是 Seaborn 对分类数据的统计&#xff0c;也是它的长项。针对分类数据的统计图&#xff0c;可以使用 sns.catplot 绘制&#xff0c;其完整参数如下&#xff1a;seaborn.catplot(xNone, yNone, hue…

MongoDB 主从集群配置

创建必要的目录和认证文件&#xff1a; [rootmongo mongo]# mkdir keyfile [rootmongo mongo]# echo "mongo cluster one" > keyfile/m1[rootmongo mongo]# echo "mongo cluster one" > keyfile/m2[rootmongo mongo]# echo "mongo cluster one&…

linux进程互斥要点,linux进程之间互斥

总所周知&#xff0c;在linux中pthread_mutex_t可以用于同一进程内多个线程之间的同步。我们所需要做的工作&#xff0c;仅仅是定义一个全局的pthread_mutex_t类型变量即可。但是对于进程之间的互斥&#xff0c;就没有那么简单了。我们必须将pthread_mutex_t类型变量放到各个进…

java定时器_拾遗Timer定时器

一 Timer 介绍在开发中我们经常会遇到一些简单定时任务的需求&#xff0c;而不需要量级较重的定时任务就可以采取java定时器&#xff1b;java.util.Timer工具类中的Timer 是定时器&#xff0c;但定时任务写在java.util.TimerTask 中&#xff0c;由 Timer 执行 TimerTask &#…

逻辑门电路的知识点归纳

1.半导体二极管与MOS管的开关特性 二极管&#xff1a;正向导通&#xff0c;反向截止&#xff0c;但是要注意的是从反向截止到正向导通的时间极其短&#xff0c;但是从正向导通到反向截止要经过反向恢复&#xff08;电荷存储效应&#xff09;的过程&#xff0c;这个过程实际上就…

全国计算机等级考试题库二级C操作题100套(第78套)

第78套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:将NN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。例如&#xff0c;若N3&#xff0c;有下列矩阵&#xff1a; 1 2 3 4 5 6 7 8 9 交换后为&#xff1a; 3 2 1 4 5 6 9 8 7 请在程序的下划线处…

善心

2019独角兽企业重金招聘Python工程师标准>>> 一个穷苦学生郝武德.凯礼&#xff0c;为了付学费&#xff0c;挨家挨户地推销货品。 到了晚上&#xff0c;发现自己的肚子很饿&#xff0c;而口袋里只剩下一个小钱。他在大街上犹豫徘徊了半天&#xff0c;终于鼓起勇气&a…

linux权限sudo和su,Linux su和sudo命令的区别,并获得root权限

su(superuser)su表示切换用户&#xff0c;如&#xff1a; 输入&#xff1a;su命令后回车表示切换当前的用户到root用户&#xff0c;或者&#xff1a; 输入&#xff1a;su - root(或者其他用户名)这里加了"-"后表示也切换的当前的环境变量到新用户的环境变量。su root…

python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路

一、Python 已来 AI 不远在当今&#xff0c;人工智能已经渗透到了智能手机、网络搜索&#xff0c;广告分发&#xff0c;人脸识别&#xff0c;语音识别&#xff0c;自动驾驶&#xff0c;智能医疗&#xff0c;无人银行等日常生活领域。人工智能的生活化是不可避免的&#xff0c;它…

软件测试 决策表

决策表技术使用的一下特征的应用 If then else 逻辑关系 输入变量之间存在逻辑关系 计算过程中涉及对输入变量子集的处理 输入与输出之间存在因果关系 圈复杂度较高 决策表规模的增长方式不高&#xff08;有N个条件的有限项决策表有2^N条规则&#xff09;&#xff0c;有几种方法…

js判断用户是否离开当前页面

简介 VisibilityChange 事件&#xff1b;用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender&#xff0c;visible 和 hidden let pageVisibility document.visibilityState; // 监听 visibility change 事件 document.addEventLi…

全国计算机等级考试题库二级C操作题100套(第79套)

第79套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回&#xff0c;并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并把…

linux 交叉编译 静态库,在ARM交叉编译时,如何选择要链接的静态库?

小编典典您有两种选择&#xff0c;获取正确的编译器。编写自己的“ C”库。获取正确的编译器。你是 总是 最安全的有一个编译器匹配您的系统。这适用于x86Linux和各种发行版。如果不同的编译器可以工作&#xff0c;您将很幸运。当您交叉编译时&#xff0c;这样做会更加困难&…

python输出可执行文件_重定向-禁止在Python调用中输出可执行文件

重定向-禁止在Python调用中输出可执行文件我有一个名为B的二进制文件&#xff0c;该文件在调用时会生成输出。 如果从Bash shell调用它&#xff0c;则大多数输出将受到A > /dev/null的抑制。所有输出将受到A &> /dev/null的抑制我有一个名为B的Python脚本&#xff0c…

全国计算机等级考试题库二级C操作题100套(第80套)

第80套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将形参n中&#xff0c;各位上为偶数的数取出&#xff0c;并按原来从高位到低位的顺序组成一个新的数&#xff0c;并作为函数值返回。 例如&#xff0c;从主函数输入一个整数&#xff1a;27638496&#x…

记一次B站答题经历

第一题部分&#xff1a;社区规范卷 --------- ------------ 第二题&#xff1a;社区规范第二部分 -------------------- 第三部分自由选择题 ---------------------- -------------------------------- 最后答题成绩得分 -------------- ------------- 答完题后的感受&#xff…

linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...

Linux在安装软件的时候有时会出现错误&#xff0c;提示缺少动态链接库.so&#xff0c;该问题是由什么原因导致的呢?情况分析&#xff1a;1.缺少动态连接库.so-cannot open shared object file:No such file or directory2.缺少动态连接库.so.0-cannot open shared object file…

全国计算机等级考试题库二级C操作题100套(第81套)

第81套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在形参s所指字符串中的每个数字字符之后插入一个号。例如&#xff0c;形参s所指的字符串为&#xff1a;def35adh3kjsdf7。执行结果为&#xff1a;def35adh3kjsdf7*。 请在程序的下划线处填入正确的内容并…

菜鸟python爬虫_Python爬虫学习-基础爬取

编译环境&#xff1a;python v3.5.0, mac osx 10.11.4第三方库&#xff1a;针对网页解析&#xff0c;python有丰富的第三方库如:BeautifulSoup, urllib, requests etc.可以通过import来引入指定第三方库&#xff0c;通过from lib import function导入第三方库中的指定函数。如&…

点云赋值 PointCloudT::Ptr 运行时崩溃

PointCloudT::Ptr cloud; cloud.reset(new PointCloudT); cloud->points.resize(500);for(int index 0;index <500;index){  cloud->point[index].x 1.0; cloud->point[index].y 1.0;}采用以上方式赋值程序崩溃。Point t; for(int index 0;index <500;ind…