本章简介
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{ /** * */ 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配置文档当中来注册
/users/Users_login_success.jsp /users/Users_login.jsp
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+"/";%>用户登录 后台管理系统Ver 1.0
7.完成显示登录成功用户名和注销功能
8.显示报错信息
- 在登录表单上显示表单验证出错信息