用户登录页模块的实现
创建SessionFactory工具类
我们使用HIbernate框架,必然会使用的SessionFactory来创建Session,因此最好先建立一个
MyHIbernateSessionFactory类,来获取SessionFactory对象。
具体代码如下:
package com.demo.util;
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 ServiceRegitry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
sessionFactory =config.buildSessionFactory(ServiceRegitry);
return sessionFactory;
} else {
return sessionFactory;
}
}
}
既然要实现用户登录,那么就需要一些用户,我们先添加一个,添加的话我们可以使用如下的方法:
建立TestUsers测试类:
package com.demo.entity;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.demo.util.MyHIbernateSessionFactory;
public class TestUsers {
@Test
public void testSave(){
Session session = MyHIbernateSessionFactory.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Users users = new Users();
users.setUsername("Jack");
users.setPassword("123456");
session.save(users);
tx.commit();
MyHIbernateSessionFactory.getSessionFactory().close();
}
}
控制台显示:
数据库显示:
用户登录模块持久层
由于项目比较小,就不再业务逻辑层,直接使用持久层和控制层进行交互,也就是控制层依赖持久层,要实现面
向接口编程,因此首先建立的是UsersDao接口,其次就是UsersDao的具体实现类UsersDaoImpl类。
UsersDao接口:
package com.demo.dao;
import com.demo.entity.Users;
public interface UsersDAO {
public boolean usersLogin(Users users);
}
UsersDaoImpl类:
package com.demo.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.demo.dao.UsersDAO;
import com.demo.entity.Users;
import com.demo.util.MyHIbernateSessionFactory;
public class UsersDAOImpl implements UsersDAO {
@SuppressWarnings("rawtypes")
@Override
public boolean usersLogin(Users users) {
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);
query.setParameter(0, users.getUsername());
query.setParameter(1, users.getPassword());
List list = query.list();
tx.commit();
if (list.size() > 0) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if(tx != null){
tx = null;
}
}
}
}
我们来测试一下我们写的dao层:
package com.demo.dao;
import org.junit.Test;
import com.demo.dao.impl.UsersDAOImpl;
import com.demo.entity.Users;
import junit.framework.Assert;
public class TestUsersDAO {
@Test
public void testUsersLogin(){
UsersDAO usersDAO = new UsersDAOImpl();
Users users = new Users(1,"Jack","123456");
Assert.assertEquals(true, usersDAO.usersLogin(users));
}
}
JUnit测试成功表示逻辑是正确的。
用户登录模块控制层
控制层具体和表示才层,也即是JSP页面进行交互以及调用,我们也需要设计一个所有Action的父类,也就是
SuperAction,而且这个类还必须继承ActionSupport,以免获得较好的应用,为了获得常用的内置对象采用耦合
IOC方式注入属性,需要实现下面的三个接口ServletRequestAware、ServletResponseAware和
ServletContextAware接口。
SuperAction类:
package com.demo.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动作的父类
* @author Administrator
* @date 2016年12月16日
*/
@SuppressWarnings("serial")
public class SuperAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected ServletContext context;
protected HttpSession session;
@Override
public void setServletContext(ServletContext context) {
this.context = context;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = this.request.getSession();
}
}
UsersAction类需要实现继承SuperAction类,实现ModelDriven<T>接口,采用模型驱动接收表单数据。
UsersAction类:
package com.demo.action;
import org.apache.struts2.interceptor.validation.SkipValidation;
import com.demo.dao.UsersDAO;
import com.demo.dao.impl.UsersDAOImpl;
import com.demo.entity.Users;
import com.opensymphony.xwork2.ModelDriven;
@SuppressWarnings("serial")
public class UsersAction extends SuperAction implements ModelDriven<Users> {
private Users users = new Users();
@Override
public Users getModel() {
return this.users;
}
//用户登录方法
public String login(){
UsersDAO usersDAO = new UsersDAOImpl();
if (usersDAO.usersLogin(users)) {
session.setAttribute("loginUserName",users.getUsername());
return "login_success";
} else {
return "login_failure";
}
}
@SkipValidation
//用户退出方法
public String logout(){
if(session.getAttribute("loginUserName") != null){
session.removeAttribute("loginUserName");
}
return "logout_success";
}
@Override
public void validate() {
if ("".equals(users.getUsername().trim())) {
this.addFieldError("usernameError", "用户名不能为空!");
}
if (users.getPassword().length() < 6) {
this.addFieldError("passwordError", "密码长度不少于六位!");
}
}
}
接下里就是配置Action:
<?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 name="users" namespace="/users" extends="default">
<action name="*_*" class="com.demo.action.{1}Action" method="{2}">
<result name="login_success">/users/Users_login_success.jsp</result>
<result name="login_failure">/users/Users_login.jsp</result>
<result name="logout_success">/users/Users_login.jsp</result>
<result name="input">/users/Users_login.jsp</result>
</action>
</package>
</struts>
页面调用
和用户登录相关的页面有这几处:
我们启动Tomcat服务器进行测试的效果:
输入先前我们添加的唯一一个用户Jack和密码123456
点击登录之后:
我们输入一个错的用户或密码:
这个用户登录模块就做到这里。