三、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" οnclick="changeValidateCode(this)" style="cursor: hand;" alt="点击刷新验证码"/>
<input type="submit">
</form>
<s:property value="exception.message"/>
</body>