Struts2 生成图形验证码及进行验证码验证-修改后代码(二)

三、BaseAction代码

 

package com.wjt276.co.web.actions;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 父类Action
 * 可以在构造方法中获取所有Action都需要的参数
 * @author wjt276
 *
 */
@SuppressWarnings("serial")
public class BaseAction extends ActionSupport {
	
	
//---------------以下为生成图形验证码的代码----------------------------------------------------------------------------------------------------------------
	
	/**
	 * 用于接受用户从前台输入的验证码,以便进行验证
	 */
	private String validateCode;
	
	public String getValidateCode() {
		return validateCode;
	}
	public void setValidateCode(String validateCode) {
		this.validateCode = validateCode;
	}
	
	protected void validateImgCode(String validateCode) throws Exception{
		if(!validateCode.equals(this.getValidateCode().trim())){
			throw new Exception("验证码不正确,请重新输入");
		}
	}	

}

 

 

四、AbstractManager代码

 

 

package com.wjt276.co.managers.impl;

import java.util.List;

import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.wjt276.co.PagerModel;
import com.wjt276.co.SystemException;


/**
 * 分页查询类
 * @author wjt276
 *
 */
public class AbstractManager extends HibernateDaoSupport{	

	/**
	 * 分页查询-根据HQL语句进行分页查询
	 * @param hql HQL语句
	 * @param offset 从第几条记录开始查询
	 * @param pageSize 每页显示多少条记录
	 * @return 返回包含总记录数、以及结果集
	 */
	public PagerModel searchPaginated(String hql, int offset, int pageSize){		
		return this.searchPaginated(hql, null, offset, pageSize);		
	}
	
	/**
	 * 分页查询-根据HQL语句进行分页查询
	 * @param hql HQL语句
	 * @param param HQL语句带的一个参数值
	 * @param offset 从第几条记录开始查询
	 * @param pageSize 每页显示多少条记录
	 * @return 返回包含总记录数、以及结果集
	 */
	public PagerModel searchPaginated(String hql, Object param, int offset, int pageSize){
		return this.searchPaginated(hql, new Object[]{param}, offset, pageSize);
	}
	
	
	/**
	 * 分页查询-根据HQL语句进行分页查询
	 * @param hql HQL语句
	 * @param params HQL语句带的多个参数值
	 * @param offset 从第几条记录开始查询
	 * @param pageSize 每页显示多少条记录
	 * @return 返回包含总记录数、以及结果集
	 */
	public PagerModel searchPaginated(String hql, Object[] params, int offset, int pageSize){
		
		//1、获取记录总数
		String countHql = this.getCountQuery(hql);
		
		Query query = this.getSession().createQuery(countHql);
		if(params != null && params.length > 0){
			for(int i = 0; i < params.length; i++){
				query.setParameter(i, params[i]);
			}
		}
		int total = ((Long)query.uniqueResult()).intValue();
		
		//获取查询的数据
		query =this.getSession().createQuery(hql);
		if(params != null && params.length > 0){
			for(int i = 0; i < params.length; i++){
				query.setParameter(i, params[i]);
			}
		}
		query.setFirstResult(offset);
		query.setMaxResults(pageSize);
		List datas = query.list();

		PagerModel pm = new PagerModel();
		pm.setTotal(total);
		pm.setDatas(datas);
		
		return pm;
		
	}

	
	/**
	 * 根据HQL语句,抽取查询总记录数的HQL语句<br/>
	 * 如:<br/>
	 * from Orgnization o where o.parent is null<br/>
	 * 经过转换,可以得到:<br/>
	 * select count(*) from Orgnization o where o.parent is null<br/>
	 * @param hql
	 * @return
	 */
	private String getCountQuery(String hql){
		int index = hql.indexOf("from");
		if (index != -1){
			return "select count(*) " + hql.substring(index);
		}
		throw new SystemException("无效的HQL语句");
		
		
		
	}
}

 

 

五、Key代码

 

package com.wjt276.co.web.actions;

public class Key {

	/**
	 *  保存已经生成的留言簿验证码,以便作为验证依据
	 *  注:这里是静态变量,目的是就可以保存这个值,只到新的验证码出现替换值
	 */
	public static String guestbookValidateCode;
	
	public static String validateCode;

	public static final int DEFAULT_VALIDATEIMG_WIDTH = 80;
	
	public static final int DEFAULT_VALIDATEIMG_HEIGHT = 20;
	
	public static final int DEFAULT_VALIDATEIMG_FONT_SIZE = 16;
	
	public static final int DEFAULT_VALIDATEIMG_CODE_LENGTH = 4;
	
	public static final String DEFAULT_VALIDATEIMG_CONTENT_TYPE = "image/jpeg";

}

 

六、测试的ACTION

package com.wjt276.co.web.actions;

@SuppressWarnings("serial")
public class TestAction extends BaseAction {

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
	public String add() throws Exception{
		this.validateImgCode(Key.validateCode);
		return SUCCESS;
	}

}

 

 

 

七、配置好SPRINGR 的BEAN

	<context:annotation-config />
	<!--<context:component-scan base-package="com.wjt276" />-->
	<!--<aop:aspectj-autoproxy/>-->
	
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>

	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
     
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	    <property name="dataSource" ref="dataSource"/>  
	    <property name="packagesToScan">
	      <list>
	        <value>com.wjt276.co.model</value>
	      </list>
	    </property>
	  
	     
	    <property name="hibernateProperties">
	    	<props>
	    		<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
	    		<prop key="hibernate.show_sql">true</prop>
	    		<prop key="hibernate.format_sql">true</prop>
	    		<prop key="hibernate.hbm2ddl.auto">update</prop>
	    	</props>
	    </property>    
  </bean>
  
  <!-- 1、配置一个事务管理器txManager 配置此事务管理器时,需要提供一个已经配置的SessionFactory-->
  <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  		<property name="sessionFactory" ref="sessionFactory"/>
  </bean>
  
  <!-- 2、配置advice(建议,建议Spring需要进行事务管理),提提供一个事务管理器,和事务管理器的一些选项 -->
  <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
      		<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="deploy*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="*" read-only="true"/>
  </tx:attributes>
  </tx:advice>
  <!-- 3、xml使用Spring事务管理需要在切面配置标签中完成
  		a、首先需要定义切入点pointcut:说明哪些地方需要进行事务管理
  		b、再使用advisor说明在什么的pointcut下,使用什么的事务管理。就可以了。
   -->
   <aop:config>
  		<aop:pointcut id="saveServiceOperation" expression="execution(* com.wjt276.co.managers..*.*(..))"/>
  		<aop:advisor advice-ref="txAdvice" pointcut-ref="saveServiceOperation"/>
  </aop:config>
  
  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  	<property name="sessionFactory" ref="sessionFactory"/>
  </bean>	


<bean id="validateImageManager" class="com.wjt276.co.managers.impl.ValidateImageManagerImpl">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	
	<bean id="validateImgAction" class="com.wjt276.co.web.actions.ValidateImgAction" scope="prototype">
		<property name="validateImageManager" ref="validateImageManager"/>
	</bean>
	<bean id="testAction" class="com.wjt276.co.web.actions.TestAction" scope="prototype">
	</bean>

 

 

八、jdbc.properties

 

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/code
jdbc.username=root
jdbc.password=root

 

 

 

九 Struts2配置文件

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
		 
 	<constant name="struts.devMode" value="true" />
	<constant name="struts.i18n.encoding" value="GBK"></constant>
 	  
 	<package name="base" namespace="/" extends="struts-default">
        <global-results>
        	<result name="exceptionUrl">/common/exception.jsp</result>
        	<result name="add_success">/common/pub_add_success.jsp</result>
   			<result name="delete_success">/common/pub_delete_success.jsp</result>
        </global-results>
        <global-exception-mappings>
        	<exception-mapping result="exceptionUrl" exception="java.lang.Exception"/>
        </global-exception-mappings>
    </package>
 	  
	<package name="front" namespace="/" extends="base">
	       <action name="validateImg" class="com.wjt276.co.web.actions.ValidateImgAction">   
		      <result type="stream">   
		               <param name="contentType">image/jpeg</param>   
		               <param name="inputName">inputStream</param>   
		        </result>	
		 </action>
	       <action name="test" class="com.wjt276.co.web.actions.TestAction">   
		      <result>/MyJsp.jsp</result>
		      <exception-mapping result="success" exception="java.lang.Exception"/>
		 </action>
    </package>
    
    
  

 

 最后:JSP测试代码

  <body>
    This is my JSP page. <br>
    <script type="text/javascript">   
    function changeValidateCode(obj) {   
           //获取当前的时间作为参数,无具体意义   
        var timenow = new Date().getTime();   
           //每次请求需要一个不同的参数,否则可能会返回同样的验证码   
        //这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。   
        obj.src="validateImg.action?d="+timenow;   
    }
	</script>   
	 
  <form action="test!add" method="get">
  	<input name="validateCode"/><img src="validateImg.action" onclick="changeValidateCode(this)" style="cursor: hand;" alt="点击刷新验证码"/>
  	<input type="submit">
  </form>
 
 <s:property value="exception.message"/>
  </body>

 

你可能感兴趣的:(AOP,bean,Hibernate,struts,jdbc)