【Struts2+Hibernate4】开发学生信息管理功能(二)

       用户登录页模块的实现

       创建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

        

        点击登录之后:


        我们输入一个错的用户或密码:

        

        这个用户登录模块就做到这里。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值