第二章:用户登录管理模块
本章简介
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 { @Test public 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 stub this.application=application; } public void setServletResponse(HttpServletResponse response) { // TODO Auto-generated method stub this.response=response; } public void setServletRequest(HttpServletRequest request) { // TODO Auto-generated method stub this.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 stub return 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.显示报错信息
- 在登录表单上显示表单验证出错信息