`

struts2+hibernate实现简单登录与注册

    博客分类:
  • Java
阅读更多
    最近在自学ssh,以前开发一直用的普通的MVC模式进行开发的,接触了这几个框架后感触很多,学着做了一个简单的登录注册的模块,运用的是struts2和hibernate来实现的。
    1.(1)首先,运用了struts2提供的标签,struts2总共提供的标签大体有三类,一种是逻辑控制类标签:if elseif等,一种是表单的标签,这类事最常用的,最后就是非表单的标签如div等等。
      (2)创建需要的jsp页面:
            1>index.jsp
    
     <%@ page contentType="text/html;charset=GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
   <title>登录</title>
</head>

<body>
<s:actionerror/>
<s:property value="message"/>
<a href="register.jsp">注册</a>
<hr/>
请您登录:
<s:form validate="true" action="Login" >
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:submit value="提交"/>
</s:form>
<hr/>
</body>
</html>
     

其中,action指向了对应action的定义,而在以前的项目当中,我们会将此定义为所要post或get的servlet上,这个表单在提交的时候是可以进行验证的,并且如果验证不通过,还可以显示出相应的message信息。
   2>register.jsp注册页面:
  
   <%@ page contentType="text/html;charset=GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>
   注册
</title>
</head>
<body>
<s:property value="message"/>
<a href="index.jsp">返回登录</a>
<hr/>
请您注册:
<div style="color:red;">
<s:fielderror/>
<s:actionerror/>
</div>
<s:form action="Register" validate="true">
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:submit value="提交"/>
</s:form>
<hr/>
</body>
</html>


   

  3>success.jsp成功页面
 
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="message"/>
欢迎
  

2.(1)创建模型组件
     因为需要通过hibernate连接数据库持久层。引入DAO(Data Access Object数据访问对象),是一种抽象了数据源,并提供对数据源的透明访问的设计。下面定义UserDAO接口,使用Hibernate访问数据库用户数据的连接访问实现。
     IUserDAO.java
   
   package dao;
import dao.hibernate.User;
public interface IUserDAO{
	boolean isValidUser(String username,String password);
	User save(User transientInstance);
}
    

   (2)User.java
   
    package dao.hibernate;

public class User {
	private int id;
	private String username;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}

    

    (3)对接口的实做UserDAOHibernate.java
    
    package dao.hibernate;

import java.io.File;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.*;
import org.hibernate.cfg.*;
import dao.IUserDAO;
import dao.hibernate.User;

public class UserDAOHibernate implements IUserDAO {
	private static final Log log = LogFactory.getLog(UserDAOHibernate.class);
	SessionFactory sf = new Configuration().configure(
			new File("E:\\web\\struts_login\\src\\hibernate.cfg.xml"))
			.buildSessionFactory();

	public boolean isValidUser(String name, String password) {
		log.debug("in UserDAO IsValid");
		try {

			Session session = sf.openSession();
			String hql = "from User as u where u.username=? and u.password=?";
			Query query = session.createQuery(hql);
			query.setString(0, name);
			query.setString(1, password);
			List userList = query.list();
			if (userList.size() > 0) {

				session.close();
				return true;
			}

			session.close();
			return false;

		} catch (RuntimeException e) {
			log.error("isValidUser failed", e);
			throw e;
		}
	}

	public User save(User transientInstance) {
		log.debug("saving user instance");
		Session session = sf.openSession();
		Transaction tran = session.beginTransaction();
		try {
			if (findByName(transientInstance.getUsername()) > 0) {

				return null;
			}
			session.save(transientInstance);
			session.flush();
			tran.commit();
			log.debug("save successful");
			session.close();
			return transientInstance;
		} catch (RuntimeException e) {
			tran.rollback();
			log.error("save failed", e);
			throw e;
		}
	}

	public int findByName(String name) {
		Session session = sf.openSession();
		String hql = "from User as u where u.username=?";
		Query query = session.createQuery(hql);
		query.setParameter(0, name);
		List userlist = query.list();
		if (userlist.size() > 0) {
			return 1;
		}
		return 0;
	}

}

     

      (4)User.hbm.xml
  
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "Http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
     <class name="dao.hibernate.User" table="myusertable">
     <id name="id" type="integer">
         <column name="id"/>
         <generator class="native">
         </generator>
     </id>
     <property name="username" type="string">
         <column name="username" length="50" not-null="false"/>
     </property> 
     <property name="password" type="string">
         <column name="password" length="50" not-null="false"/>
         </property>
     </class>
</hibernate-mapping>

      (5)Hibernate.cfg.xml
 
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE hibernate-configuration PUBLIC
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
      "Http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
     <session-factory>
         <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
         <property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mypro</property>
         <property name="connection.username">sa</property>
         <property name="connection.password">sa</property>
         <property name="connection.pool_size">1</property>
         <property name="dialect">org.hibernate.dialect.SQLServerDialect </property>
         <property name="current_session_context_class">thread</property>
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
         <mapping resource="dao/hibernate/User.hbm.xml"/>
     </session-factory>
</hibernate-configuration>
  

3.创建控制器的组件
   (1)首先配置struts.xml中的Action映射
     
     <?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts>

    <include file="struts-default.xml"/>
    <package name="struts2"  extends="struts-default">
    
    <global-results>
	    	<result name="login" type="redirect">index.jsp</result>
	    </global-results>
    <action name="Login" class="struts2.LoginAction">
      <result name="input">index.jsp</result>
      <result name="success">success.jsp</result>  
   </action>   
   <action name="Register" class="struts2.RegisterAction">
      <result name="input">register.jsp</result>
      <result name="success">index.jsp</result>
   </action>
   
   </package>
</struts>
     

  (2)控制类LoginAction.java
  
   package struts2;

import dao.IUserDAO;
import dao.hibernate.UserDAOHibernate;

public class LoginAction {
	 
	private String username;
	private String password;
	IUserDAO userDAO=new UserDAOHibernate();
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String execute()throws Exception{
		if(isInvalid(username,password)){
			return "success";
		}else{
			return "input";
		}
	}
   private boolean isInvalid(String username,String password){
	   return userDAO.isValidUser(username, password);
   }
 
}

   

   (3)控制类RegisterAction.java
  
   package struts2;
import dao.IUserDAO;
import dao.hibernate.User;
import dao.hibernate.UserDAOHibernate;
public class RegisterAction {
	private String username;
	private String password;
	private String confirmpassword;
	private String message;
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getConfirmpassword() {
		return confirmpassword;
	}
	public void setConfirmpassword(String confirmpassword) {
		this.confirmpassword = confirmpassword;
	}
	IUserDAO userDAO=new UserDAOHibernate();
	public String execute() throws Exception{
		User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		if(userDAO.save(user)==null){
			message="你好,用户名:"+username+"已经注册,请重新选择用户名!";
			return "input";
		}
		message="注册成功!";
		return "success";
	}

}

   

    (4)对登录以及注册的验证:
        1>LoginAction-validation.xml
     
      <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>请输入用户名!</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
           <message>请输入密码!</message>
        </field-validator>
	   <!--限制字符串长短验证-->
		<field-validator type="stringlength">
            <param name="trim">true</param>
            <param name="minLength">4</param>
            <param name="maxLength">10</param>
            <message>请设置4-10位长度的密码!</message>
        </field-validator>
    </field>
</validators>


      

    2>RegisterAction-validation.xml
   
    <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>请输入用户名!</message><!--出错提示信息-->
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
           <message>请输入密码!</message><!--出错提示信息-->
        </field-validator>
	   <!--限制字符串长短验证-->
		<field-validator type="stringlength">
            <param name="trim">true</param><!--是否去除空格-->
            <param name="minLength">4</param><!--最小长度-->
            <param name="maxLength">10</param><!--最大长度-->
            <message>请设置4-10位长度的密码!</message><!--出错提示信息-->
        </field-validator>
    </field>
<validators>
    

  4.做到这里,下一步应该是引入拦截器。struts2提供了AOP的实现,拦截器在调用Action前后调用,拦截器有很多的好处和功能,比较常见的有计算action的运行时间、禁止用户将表单重复提交,还有就是如果知道了一个URL,在没有登录(也就是httpsession为空的时候不能让其进入页面,直接跳转到登录页面等等),在以后,我会将这个功能加上,使登录的模块更加的完整!
分享到:
评论
2 楼 xycdgc 2010-04-29  
是啊,在自学struts,书上的一个例子,自己尝试着敲了下,改正了书上的一些问题,你是第一个给我评论的呢 谢谢你!
1 楼 pweffort 2010-04-29  


看到好熟悉哦.

相关推荐

Global site tag (gtag.js) - Google Analytics