struts2+Spring2.0+Hibernate3使用注解的登录验证

来源:互联网 发布:找保镖什么软件 编辑:程序博客网 时间:2024/04/30 08:22

struts2.0的优势显而易见,侵入性小.不用在写烦人的ActionForm,优秀的基于AOP拦截器机制,与Servlet API 完全解耦,便于单元测试,丰富的自定义标签等等优势,注定了它受广大程序员的欢迎.

接下来,介绍下Struts2.0和Spring2和Hibernate3的结合运用.

首先我们需要一个POJO

@Entity
@Table(name="USER")( USER 为表名,如果h)
public class User implements Serializable{
 /**
  *
  */
 private static final long serialVersionUID = -1549391863285302468L;
 private Long userid;
 private String name;
 private String pwd;
 
 @Override
 public int hashCode() {
  final int PRIME = 31;
  int result = 1;
  result = PRIME * result + ((name == null) ? 0 : name.hashCode());
  return result;
 }
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  final User other = (User) obj;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  return true;
 }
 @Column(name="USER_NAME")(name属性对应数据库字段)
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 @Column(name="PASSWORD")(pwd属性对应数据库字段)
 public String getPwd() {
  return pwd;
 }
 public void setPwd(String pwd) {
  this.pwd = pwd;
 }
 @Id
 @Column(name="ID")
   @GeneratedValue(strategy=GenerationType.IDENTITY)(设定对象标识符)
 public Long getUserid() {
  return userid;
 }
 public void setUserid(Long userid) {
  this.userid = userid;
 }

}

第二步

写下Spring的appicationContext-hibernate.xml,appicationContext-service.xml,appicationContext-struts.xml,appicationContext-resouce.xml.

在appicationContext-hibernate.xml中定义


    <!-- 设置Hibernate Session Factory基本信息 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <!-- 设置数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 设置持久化的Class -->
        <property name="annotatedClasses">
      <list>
          <value>com.TestStruts2.model.User</value>

          <!-- 添加新的持久会类 -->
      </list>
  </property>
        <property name="hibernateProperties">
            <props>
             <!-- 设置数据库方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                <!-- 设置true,false在数据库表中的对应值 -->
                <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop>
                <!-- 打开SQL调试 -->
                <prop key="hibernate.show_sql" >true</prop>
            </props>
        </property>
    </bean>

    <!-- 使用HibernateTransaction做为事务管理器(因为本系统只用了一个数据库可以不使用JTA)-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
   
    <!-- 如果使用多个数据库,要进行事务管理,使用JTA 进行事务管理,配置如下
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
    -->
   

    <!-- 基本DAO 用于完成基本的CRUD -->
    <bean id="dao" class="com.sds.cdc.dao.hibernate.BaseDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id="dao1" class="com.TestStruts2.dao.imp.BaseObjectDaoImp">
          <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id="userDao1" class="com.TestStruts2.dao.imp.UserDaoImp">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 其他自定义的DAO -->
    <bean id="userDao" class="com.sds.cdc.dao.hibernate.UserDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <bean id="deptDao" class="com.sds.cdc.dao.hibernate.DeptDaoHibernate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
  
    <!-- 添加新的DAO -->

</beans>

在appicationContext-resouce.xml.中定义:数据库资源

 <!-- 如果使用AppServer容器提供的datasource,打开下面的注释,并修改myDS -->
    <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDS"/>-->

 <!-- 使用Apache的DBCP建立连接池 -->
    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>/WEB-INF/init.properties</value>
        </property>
    </bean>
  <!-- Choose the dialect that matches your "dataSource" definition -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>${datasource.driverClassName}</value>
        </property>
        <property name="url">
            <value>${datasource.url}</value>
        </property>
        <property name="username">
            <value>${datasource.username}</value>
        </property>
        <property name="password">
            <value>${datasource.password}</value>
        </property>
     
        <property name="maxActive">
            <value>${datasource.maxActive}</value>
        </property>
        <property name="maxIdle">
            <value>${datasource.maxIdle}</value>
        </property>
        <property name="maxWait">
            <value>${datasource.maxWait}</value>
        </property>
        <property name="defaultAutoCommit">
            <value>${datasource.defaultAutoCommit}</value>
        </property>
    
   </bean>
   
</beans>

在appicationContext-service.xml定义

 <aop:config proxy-target-class="true">
   <aop:pointcut id="userServicePointcut" expression="execution(* com.TestStruts2.service.imp.*ServiceImp.*(..))"/><!-- 定义切点即满足execution条件的bean作为目标类加入事务管理增强-->
   <aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointcut"/>
   <aop:aspect ref="adviceMethod">//定义增强bean

   <aop:before method="preGreet()" pointcut-ref="userServicePointcut"/>

//指定切入点并指定增强方法为preGreet()
   </aop:aspect>
   </aop:config>
  
   <tx:advice id="txAdvice" transaction-manager="transactionManager">

//定义事务管理器在appicationContext-hibernate.xml中定义
   <tx:attributes>
   <tx:method name="save*"/>
   <tx:method name="get*"/>
   <tx:method name="check*"/>
//需要加入事务管理的方法  
   </tx:attributes>
  
   </tx:advice>
  
   <bean id="us" class="com.TestStruts2.service.imp.UserServiceImp">
       <property name="userdao">
            <ref bean="userDao1" />
        </property> 
   </bean>
   <bean id ="os" class="com.TestStruts2.service.imp.BaseObjectServiceImp">
   <property name="objectdao">
            <ref bean="dao1" />
        </property>
   </bean>
    <bean id="spring2Test" class="test.spring.SpringTest"></bean>
   <bean id="adviceMethod" class="test.spring.AdivceMethods"></bean>
    <bean id="adviceMethods" class="test.spring.AdivceMethods"></bean>

最后我们需要一个appicationContext-struts.xml来对struts2的Action进行注入内容如下

  <bean id="loginAction" class="com.TestStruts2.action.LoginAction"

//它的注入是根据autowire="byName"自动寻找与该Bean属性名一样的bean,并注入
   scope="prototype" autowire="byName">

当所以的appicationContext-*.xml定义后,我们可以定义struts.xml

<struts>
    <include file="struts-default.xml"/>
    <package name="login" extends="struts-default" namespace="/login">//namespace为命名空间
    <action name="login" class="loginAction">//vclass="loginAction"为appicationContext-struts.xml中的bean id
    <result name="success">/jsp/success.jsp</result>//成功所转入页面
    <result name="error">/jsp/error.jsp</result>
   
    </action>
   
    </package>

</struts>

最后定义LoginAction

public class LoginAction implements Action {
 private String username;//由struts2框架自动注入
 private String password;
 private UserService us;//由spring框架注入
 private String message;

 public String getMessage() {
  return message;
 }


 public void setMessage(String message) {
  this.message = message;
 }


 public UserService getUs() {
  return us;
 }


 public void setUs(UserService us) {
  this.us = us;
 }


 public String getPassword() {
  return password;
 }


 public void setPassword(String password) {
  this.password = password;
 }


 public String getUsername() {
  return username;
 }


 public void setUsername(String username) {
  this.username = username;
 }


 public String execute() throws Exception {
  User user = this.us.checkUser(this.getUsername(), this.getPassword());//验证用户是否合法
  if(user!=null) {
  // TODO 自动生成方法存根
   this.setMessage("成功登录");
  return SUCCESS;
  }
  else
  {   this.setMessage("登录失败!");
   return ERROR;
 }
  }

}

最后访问http://localhost:8094/TestStruts2.0/jsp/login.jsp输入正确的名字和密码后

login.jsp的代码 

<form name="infoForm" action="login/login.action" method="POST">

        姓名:<input type="text" name="username" /><br>

        密码:<input type="text" name="password" /><br>
        <input type="submit" value="提交" />&nbsp;&nbsp;<input type="reset" value="重置" /><br>

    </form>

转入到success.jsp

代码如下:

<body>
   <s:property value="message"/>
  </body>

   <s:property value="message"/>将显示""成功登录"

如果输入错误用户名和密码将转入到error,jsp中,并  <s:property value="message"/>用显示出"登录失败"信息

到此一个完整的用struts2加spring2+hibernate3的注解登录验证介绍完毕.