三、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>