如果为第个Form都建一个Action那是相当麻烦的,

如果像下面这样构建啦一个通用的Action会带来什么好处?

而像平常的做法是几乎是一个Form 和 Action的这种做法又有什么好处?
 
请大家谈谈自己的看法和经验?

下面是源码和相关的解释

请大家先看一下Struts-config.xml 中的一部分内容

xml 代码
  1. <!--第一种 parameter为空并且name为空时的情况 即 form=null 时 直接转发-->  
  2.     <action path="/dgroom/index" type="com.dgroom.struts.BeanAction"  
  3.       validate="false" >  
  4.       <forward name="success" path="/dgroom/index.xsp"/>  
  5.     </action>  
  6. <!--第二种情况 parameter="*"时 意为想调用一个Bean但又不想调用他里面的任何方法时 -->  
  7.    <action path="/dgroom/loginForm" type="com.dgroom.struts.BeanAction"  
  8.       name="accountBean" scope="session" parameter="*"  
  9.       validate="false">  
  10.       <forward name="success" path="/account/loginForm.xsp"/>  
  11.     </action>  
  12. <!--第三种 当  parameter="  NAME  " 有值时 调用 accountBean中的displayAll()方法-->  
  13.     <action path="/dgroom/displayAllAccount" type="com.dgroom.struts.BeanAction"  
  14.       name="accountBean" scope="session" parameter="displayAll"  
  15.       validate="false">  
  16.       <forward name="success" path="/dgroom/displayAll.xsp"/>  
  17.     </action>  
  18. <!--第四种  就直接调用地址栏中的最后的那个 login()方法 -->  
  19.     <action path="/dgroom/login" type="com.dgroom.struts.BeanAction"  
  20.       name="accountBean" scope="session"  
  21.       validate="false">  
  22.       <forward name="success" path="/dgroom/index.xsp"/>  
  23.     </action>  

而在其它的Bean中的方法也如同下面的这个方法,都是返回一个字符串

而在AccountBean.java中的方法如下

java 代码
  1. public class AccountBean   
  2. {   
  3.     public String login(){   
  4.         if(){   
  5.             //成功   
  6.             return "success";   
  7.         }   
  8.         //失败   
  9.         return "failure";   
  10.     }   
  11. }   

下面的是通用的 BeanAction.java 类

java 代码
  1. package com.dgroom.struts;   
  2. import org.apache.struts.action.Action;   
  3. import org.apache.struts.action.ActionForm;   
  4. import org.apache.struts.action.ActionForward;   
  5. import org.apache.struts.action.ActionMapping;   
  6.   
  7. import javax.servlet.http.HttpServletRequest;   
  8. import javax.servlet.http.HttpServletResponse;   
  9. import java.lang.reflect.Method;   
  10.   
  11. import com.dgroom.util.*;   
  12.   
  13. public class BeanAction extends Action {   
  14.   
  15.   public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)   
  16.       throws Exception {   
  17.   
  18.     String forward = "success";   
  19.     try {   
  20.         //这里是对ActionContext.save(request,reponse);   
  21.         //对映 Struts-config.xml 中的 第一种 :当请求中的 Form 为空时直接转 发   
  22.       if (form != null) {   
  23.         Method method = null;   
  24.         String methodName = mapping.getParameter();   
  25.   
  26.         //第三种:当参数中存在着某个值时并且不等于 * 时就直接调用那个参数中的方法   
  27.         if (methodName != null && !"*".equals(methodName)) {   
  28.           try {   
  29.             method = form.getClass().getMethod(methodName, null);   
  30.             forward = (String) method.invoke(form, null);   
  31.           } catch (Exception e) {   
  32.            // 这里是一个自定义的异常   
  33.           }   
  34.         }   
  35.         //第四种 当参数为空时 直接调用地址栏最后的方法   
  36.         if (method == null && !"*".equals(methodName)) {   
  37.           methodName = mapping.getPath();   
  38.           if (methodName.length() > 1) {   
  39.             int slash = methodName.lastIndexOf("/") + 1;   
  40.             methodName = methodName.substring(slash);   
  41.             if (methodName.length() > 0) {   
  42.               try {                
  43.                 method = form.getClass().getMethod(methodName, null);                  
  44.                 forward = (String) method.invoke(form, null);   
  45.               } catch (Exception e) {   
  46.                // 这里是一个自定义的异常   
  47.               }   
  48.             }   
  49.           }   
  50.         }   
  51.       }   
  52.   
  53.     } catch (Exception e) {   
  54.   
  55.       // 这里是一个自定义的异常   
  56.       throw e;   
  57.     }   
  58.   
  59.     return mapping.findForward(forward);   
  60.   }   
  61.   
  62. }   
评论
ice123456 2007-09-06
用法:struts.config.xml,定义一个parameter="action"
你可以在你自己写的action里面继承DispatchAction这个类,然后直接写方法,跟继承action是一样的,不同的是方法名可以不一样
你在前台调用的时候是admin.*?action=test
这里就相当于调用你在action写的test方法
ice123456 2007-09-06
我认为你还不如去看下DispatchAction
这个类应该可以达到你想的哪种效果
leeon 2007-08-24
xiaoxiaodi5834 写道
个人认为,你是想用一个通用的Action来替换每个Action,然后再通过这个Action来调用业务类。应该是想再做一层封装。

刚好有用过一个这种框架的东西,即,将Action用一个EJB来实现,将所有的通用的东西放到这里面,来做事务控制。
这个东西理论上是不错的,可是实际上却还是要再多一些配置文件来定义真正业务类的位置的东东。

个人认为,这样子做的效果不是太好。不如直接用Struts2.0



这种框架我们以前做过,用一个通用的Action类,然后通过很多配置文件来描述
具体的service类在什么地方,需要传入什么参数到service中,然后把这些参数
一股脑扔到一个map中在传入service

后来被用过的人一阵狂骂,现在还是回到写action类来,
其实用struts2.0已经可以帮我减少很多麻烦事了,大家用下了都觉得效果不错
xiaoxiaodi5834 2007-08-23
个人认为,你是想用一个通用的Action来替换每个Action,然后再通过这个Action来调用业务类。应该是想再做一层封装。

刚好有用过一个这种框架的东西,即,将Action用一个EJB来实现,将所有的通用的东西放到这里面,来做事务控制。
这个东西理论上是不错的,可是实际上却还是要再多一些配置文件来定义真正业务类的位置的东东。

个人认为,这样子做的效果不是太好。不如直接用Struts2.0
sam1982 2007-08-22
[quote="yiding_he"]<div class="code_title">要避免写 Action 是不可能的,最好是写一个项目中通用的 Action,提供大量已实现的方法。其他 Action 都从此继承,这样要好写得多。<br />
<br />
(不要引用这个回复啊,会死人的)<br />
<br />
java 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol start="1" class="dp-j">
<li class="alt"><span><span class="keyword">package</span><span> com.chinacreator.ccimp.common.struts;  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span><span class="keyword">import</span><span> com.chinacreator.ccimp.common.ErrorReporter;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> com.chinacreator.ccimp.common.page.PageHelper;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> com.chinacreator.ccimp.CcimpException;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> com.chinacreator.commons.beans.NameValuePair;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> com.chinacreator.commons.utils.StringUtil;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> com.chinacreator.security.AccessControl;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> org.apache.log4j.Logger;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> org.apache.struts.action.Action;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> org.apache.struts.action.ActionForm;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> org.apache.struts.action.ActionForward;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> org.apache.struts.action.ActionMapping;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> org.apache.commons.fileupload.FileItem;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> org.apache.commons.fileupload.FileItemFactory;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> org.apache.commons.fileupload.FileUploadException;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> org.apache.commons.fileupload.servlet.ServletFileUpload;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> org.apache.commons.fileupload.disk.DiskFileItemFactory;  </span></span></li>
<li class="alt"><span>  </span></li>
<li class=""><span><span class="keyword">import</span><span> javax.servlet.http.HttpServletRequest;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> javax.servlet.http.HttpServletResponse;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> javax.servlet.ServletException;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> java.util.ArrayList;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> java.util.Enumeration;  </span></span></li>
<li class="alt"><span><span class="keyword">import</span><span> java.util.List;  </span></span></li>
<li class=""><span><span class="keyword">import</span><span> java.io.IOException;  </span></span></li>
<li class="alt"><span>  </span></li>
<li class=""><span><span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment"> * 信息平台使用的 struts Action 类。本类包含大量方法方便处理请求、校验参数、写业务日志等。</span> </span></li>
<li class=""><span><span class="comment"> * <p/></span> </span></li>
<li class="alt"><span><span class="comment"> * 使用时只需实现 execute 方法即可。</span> </span></li>
<li class=""><span><span class="comment"> * <p/></span> </span></li>
<li class="alt"><span><span class="comment"> * 本类已经实现对访问权限的控制,不需要再写。</span> </span></li>
<li class=""><span><span class="comment"> * 如果要获取参数,使用 getParam() 方法即可。</span> </span></li>
<li class="alt"><span><span class="comment"> * 如果要向 request 存储数据,使用 setAttribute() 方法即可。</span> </span></li>
<li class=""><span><span class="comment"> * 如果要校验参数,实现 validate() 方法即可。validate() 方法没有返回值,校验失败时请抛出异常。</span> </span></li>
<li class="alt"><span><span class="comment"> * 建议使用 assertExists()、assertTrue() 等方法校验参数。</span> </span></li>
<li class=""><span><span class="comment"> *</span> </span></li>
<li class="alt"><span><span class="comment"> * @author hyd</span> </span></li>
<li class=""><span><span class="comment"> */</span><span>  </span></span></li>
<li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> </span><span class="keyword">class</span><span> CcimpAction </span><span class="keyword">extends</span><span> Action {  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">static</span><span> Logger log = Logger.getLogger(CcimpAction.</span><span class="keyword">class</span><span>);  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 防止重复提交的标识</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String REQUEST_TOKEN = </span><span class="string">"duplicate_request_token"</span><span>;  </span></span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 预定义的 forward</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String SUCCESS = </span><span class="string">"success"</span><span>;  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">boolean</span><span> SHOW_PARAMS = </span><span class="keyword">false</span><span>;  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">static</span><span> ThreadLocal helperContainer = </span><span class="keyword">new</span><span> ThreadLocal();  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">static</span><span> ThreadLocal errorsContainer = </span><span class="keyword">new</span><span> ThreadLocal();  </span></span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="keyword">public</span><span> ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,  </span></span></li>
<li class="alt"><span>                                 HttpServletResponse response) <span class="keyword">throws</span><span> Exception {  </span></span></li>
<li class=""><span>        request.setCharacterEncoding(<span class="string">"GBK"</span><span>);  </span></span></li>
<li class="alt"><span>        response.setContentType(<span class="string">"text/html; charset=GBK"</span><span>);  </span></span></li>
<li class=""><span>        response.setHeader(<span class="string">"Pragma"</span><span>, </span><span class="string">"No-cache"</span><span>);  </span></span></li>
<li class="alt"><span>        response.setHeader(<span class="string">"Cache-Control"</span><span>, </span><span class="string">"no-cache"</span><span>);  </span></span></li>
<li class=""><span>        response.setDateHeader(<span class="string">"Expires"</span><span>, </span><span class="number">0</span><span>);  </span></span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>        String forward = <span class="string">"error"</span><span>;  </span></span></li>
<li class="alt"><span>        PageHelper helper = <span class="keyword">new</span><span> PageHelper(request, response);  </span></span></li>
<li class=""><span>        helperContainer.set(helper);  </span></li>
<li class="alt"><span>        log.debug(<span class="string">"当前 Action:"</span><span> + </span><span class="keyword">this</span><span>.getClass().getName());  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>        <span class="comment">// 检查用户是否登录</span><span>  </span></span></li>
<li class=""><span>        <span class="keyword">if</span><span> (!helper.checkAccess()) {  </span></span></li>
<li class="alt"><span>            log.debug(<span class="string">"用户未登录,页面访问被阻止。"</span><span>);  </span></span></li>
<li class=""><span>            <span class="keyword">return</span><span> mapping.findForward(</span><span class="string">"login"</span><span>);  </span></span></li>
<li class="alt"><span>        }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>        TokenManager tm = <span class="keyword">new</span><span> TokenManager(request);  </span></span></li>
<li class=""><span>        <span class="keyword">if</span><span> (!tm.isTokenValid()) {  </span></span></li>
<li class="alt"><span>            log.debug(<span class="string">"重复提交被阻止。"</span><span>);  </span></span></li>
<li class=""><span>            setAttribute(<span class="string">"result"</span><span>, </span><span class="string">"不允许重复提交。"</span><span>);  </span></span></li>
<li class="alt"><span>            <span class="keyword">return</span><span> mapping.findForward(forward);  </span></span></li>
<li class=""><span>        }  </span></li>
<li class="alt"><span>        tm.saveToken();  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>        <span class="comment">// 在后台输出请求参数</span><span>  </span></span></li>
<li class=""><span>        <span class="keyword">if</span><span> (SHOW_PARAMS) {  </span></span></li>
<li class="alt"><span>            log.debug(<span class="string">"请求参数:\n"</span><span> + getRequestParamsString());  </span></span></li>
<li class=""><span>        }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>        <span class="comment">// 进行参数校验</span><span>  </span></span></li>
<li class="alt"><span>        <span class="keyword">try</span><span> {  </span></span></li>
<li class=""><span>            validate(form);  </span></li>
<li class="alt"><span>            ArrayList errors = getErrors();  </span></li>
<li class=""><span>            <span class="keyword">if</span><span> (errors.size() > </span><span class="number">0</span><span>) {  </span></span></li>
<li class="alt"><span>                StringBuffer buffer = <span class="keyword">new</span><span> StringBuffer();  </span></span></li>
<li class=""><span>                <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>; i < errors.size(); i++) {  </span></span></li>
<li class="alt"><span>                    String msg = (String) errors.get(i);  </span></li>
<li class=""><span>                    buffer.append(msg).append(<span class="string">"\n"</span><span>);  </span></span></li>
<li class="alt"><span>                }  </span></li>
<li class=""><span>                String result = buffer.toString();  </span></li>
<li class="alt"><span>                log.error(<span class="string">"参数验证失败:"</span><span> + result);  </span></span></li>
<li class=""><span>                setAttribute(<span class="string">"result"</span><span>, result);  </span></span></li>
<li class="alt"><span>                <span class="keyword">return</span><span> mapping.findForward(forward);  </span></span></li>
<li class=""><span>            }  </span></li>
<li class="alt"><span>        } <span class="keyword">catch</span><span> (Exception e) {  </span></span></li>
<li class=""><span>            setAttribute(<span class="string">"result"</span><span>, e.getMessage());  </span></span></li>
<li class="alt"><span>            <span class="keyword">return</span><span> mapping.findForward(forward);  </span></span></li>
<li class=""><span>        }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>        <span class="comment">// 执行子类实现的预处理</span><span>  </span></span></li>
<li class="alt"><span>        preProcess();  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>        <span class="keyword">try</span><span> {  </span></span></li>
<li class=""><span>            forward = execute(form);  </span></li>
<li class="alt"><span>        } <span class="keyword">catch</span><span> (Exception e) {  </span></span></li>
<li class=""><span>            reportError(e);  </span></li>
<li class="alt"><span>            <span class="keyword">throw</span><span> e;  </span></span></li>
<li class=""><span>        }  </span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> mapping.findForward(forward);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">void</span><span> reportError(Exception e) {  </span></span></li>
<li class="alt"><span>        log.warn(<span class="string">"发送错误报告..."</span><span>);  </span></span></li>
<li class=""><span>        ErrorReporter.report(getRequest().getRequestURI(), e);  </span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> String getRequestParamsString() {  </span></span></li>
<li class=""><span>        NameValuePair[] params = getHelper().getAllParams();  </span></li>
<li class="alt"><span>        StringBuffer buffer = <span class="keyword">new</span><span> StringBuffer();  </span></span></li>
<li class=""><span>        <span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>; i < params.length; i++) {  </span></span></li>
<li class="alt"><span>            NameValuePair param = params[i];  </span></li>
<li class=""><span>            buffer.append(<span class="string">"setRequestParam(\""</span><span>)  </span></span></li>
<li class="alt"><span>                    .append(param.getName())  </span></li>
<li class=""><span>                    .append(<span class="string">"\", \""</span><span>)  </span></span></li>
<li class="alt"><span>                    .append(param.getValue())  </span></li>
<li class=""><span>                    .append(<span class="string">"\");\n"</span><span>);  </span></span></li>
<li class="alt"><span>        }  </span></li>
<li class=""><span>        <span class="keyword">return</span><span> buffer.toString();  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> addError(String message) {  </span></span></li>
<li class=""><span>        ArrayList errors = getErrors();  </span></li>
<li class="alt"><span>        errors.add(message);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查参数是否为空</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param paramName   request 中的参数名</span> </span></li>
<li class=""><span><span class="comment">     * @param failMessage 如果参数为空,则向用户显示的错误讯息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @throws ValidationFailException 如果参数为空</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> assertExists(String paramName, String failMessage) </span><span class="keyword">throws</span><span> ValidationFailException {  </span></span></li>
<li class="alt"><span>        assertTrue(paramExists(paramName), failMessage);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查参数是否符合条件</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param expression  检查表达式</span> </span></li>
<li class=""><span><span class="comment">     * @param failMessage 如果不符合条件,则向用户显示的错误讯息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @throws ValidationFailException 如果不符合条件</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> assertTrue(</span><span class="keyword">boolean</span><span> expression, String failMessage) </span><span class="keyword">throws</span><span> ValidationFailException {  </span></span></li>
<li class="alt"><span>        <span class="keyword">if</span><span> (!expression) {  </span></span></li>
<li class=""><span>            <span class="keyword">throw</span><span> </span><span class="keyword">new</span><span> ValidationFailException(failMessage);  </span></span></li>
<li class="alt"><span>        }  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查参数是否符合条件</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param expression  检查表达式</span> </span></li>
<li class=""><span><span class="comment">     * @param failMessage 如果不符合条件,则向用户显示的错误讯息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @throws ValidationFailException 如果不符合条件</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> assertFalse(</span><span class="keyword">boolean</span><span> expression, String failMessage) </span><span class="keyword">throws</span><span> ValidationFailException {  </span></span></li>
<li class="alt"><span>        assertTrue(!expression, failMessage);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查参数是否为空</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param value       参数值</span> </span></li>
<li class=""><span><span class="comment">     * @param failMessage 如果参数为空,则向用户显示的错误讯息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @throws ValidationFailException 如果参数为空</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> assertNotEmpty(String value, String failMessage) </span><span class="keyword">throws</span><span> ValidationFailException {  </span></span></li>
<li class="alt"><span>        assertTrue(!StringUtil.isEmptyString(value), failMessage);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查数组是否为空</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param values      数组</span> </span></li>
<li class=""><span><span class="comment">     * @param failMessage 如果数组为空,则向用户显示的错误讯息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @throws ValidationFailException 如果数组为空</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> assertNotEmpty(String[] values, String failMessage) </span><span class="keyword">throws</span><span> ValidationFailException {  </span></span></li>
<li class="alt"><span>        assertTrue(values != <span class="keyword">null</span><span> && values.length > </span><span class="number">0</span><span>, failMessage);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="keyword">protected</span><span> ArrayList getErrors() {  </span></span></li>
<li class="alt"><span>        ArrayList list = (ArrayList) getRequest().getAttribute(<span class="string">"CCIMP_REQUEST_ERRORS"</span><span>);  </span></span></li>
<li class=""><span>        <span class="keyword">if</span><span> (list == </span><span class="keyword">null</span><span>) {  </span></span></li>
<li class="alt"><span>            list = <span class="keyword">new</span><span> ArrayList();  </span></span></li>
<li class=""><span>            getRequest().setAttribute(<span class="string">"CCIMP_REQUEST_ERRORS"</span><span>, list);  </span></span></li>
<li class="alt"><span>        }  </span></li>
<li class=""><span>        <span class="keyword">return</span><span> list;  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 获得一个 AccessControl 实例</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @return 一个 AccessControl 实例</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> AccessControl getAccessControl() {  </span></span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> getHelper().getAccessControl();  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 获得请求对象</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @return 请求对象</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> HttpServletRequest getRequest() {  </span></span></li>
<li class=""><span>        <span class="keyword">return</span><span> getHelper().getRequest();  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 获得回应对象</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @return 回应对象</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> HttpServletResponse getResponse() {  </span></span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> getHelper().getResponse();  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 将对象放入 request</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name  名称</span> </span></li>
<li class=""><span><span class="comment">     * @param value 对象</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setAttribute(String name, Object value) {  </span></span></li>
<li class="alt"><span>        getRequest().setAttribute(name, value);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 将数值放入 request</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name 名称</span> </span></li>
<li class=""><span><span class="comment">     * @param num  数值</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setAttribute(String name, </span><span class="keyword">int</span><span> num) {  </span></span></li>
<li class="alt"><span>        setAttribute(name, <span class="keyword">new</span><span> Integer(num));  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 将 boolean 值放入 request</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name 名称</span> </span></li>
<li class=""><span><span class="comment">     * @param b    boolean 值</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setAttribute(String name, </span><span class="keyword">boolean</span><span> b) {  </span></span></li>
<li class="alt"><span>        setAttribute(name, Boolean.valueOf(b));  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 获得 request 中的值</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name 名称</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @return request 中的值</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> Object getAttribute(String name) {  </span></span></li>
<li class=""><span>        <span class="keyword">return</span><span> getRequest().getAttribute(name);  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">// 获得请求参数</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> String getParam(String name) {  </span></span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> getHelper().getParam(name);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">// 获得请求参数</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> String getParamFromRequestAndSession(String name) {  </span></span></li>
<li class=""><span>        String value = getHelper().getParam(name);  </span></li>
<li class="alt"><span>        <span class="keyword">if</span><span> (StringUtil.isEmptyString(value)) {  </span></span></li>
<li class=""><span>            value = StringUtil.replaceNull(getSessionAttributeOnce(name));  </span></li>
<li class="alt"><span>        }  </span></li>
<li class=""><span>        <span class="keyword">return</span><span> value;  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">// 获得请求参数</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> String getParam(String name, Object defaultValue) {  </span></span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> getHelper().getParam(name, StringUtil.replaceNull(defaultValue));  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">// 获得请求参数</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> String[] getParamValues(String name) {  </span></span></li>
<li class=""><span>        <span class="keyword">return</span><span> getHelper().getParamValues(name);  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> String getSessionString(String name) {  </span></span></li>
<li class=""><span>        <span class="keyword">return</span><span> getHelper().getSessionString(name);  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> String[] getParamNames() {  </span></span></li>
<li class=""><span>        ArrayList nameArr = <span class="keyword">new</span><span> ArrayList();  </span></span></li>
<li class="alt"><span>        Enumeration names = getRequest().getParameterNames();  </span></li>
<li class=""><span>        <span class="keyword">while</span><span> (names.hasMoreElements()) {  </span></span></li>
<li class="alt"><span>            nameArr.add(names.nextElement());  </span></li>
<li class=""><span>        }  </span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> (String[]) nameArr.toArray(</span><span class="keyword">new</span><span> String[nameArr.size()]);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 设置处理结果信息</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param message 处理结果信息(如“记录添加成功!”等,用于显示在页面上)</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setActionMessage(String message) {  </span></span></li>
<li class=""><span>        setSessionAttribute(<span class="string">"ccimp_message"</span><span>, </span><span class="keyword">new</span><span> Message(Message.INFO, message));  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 设置处理结果信息</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @param message 处理结果信息(如“记录添加成功!”等,用于显示在页面上)</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setActionMessage(Message message) {  </span></span></li>
<li class="alt"><span>        setSessionAttribute(<span class="string">"ccimp_message"</span><span>, message);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 设置处理结果错误信息</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param message 处理结果错误信息(如“记录添加失败:ID 重复”等,用于显示在页面上)</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setActionErrorMessage(String message) {  </span></span></li>
<li class=""><span>        setSessionAttribute(<span class="string">"ccimp_message"</span><span>, </span><span class="keyword">new</span><span> Message(Message.ERROR, message));  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 设置是否进行访问权限的检查。单元测试中应将其设置为false。</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @param validation 是否进行访问权限的检查</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setAccessValidation(</span><span class="keyword">boolean</span><span> validation) {  </span></span></li>
<li class="alt"><span>        getHelper().setAccessValidation(validation);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setHelper(PageHelper h) {  </span></span></li>
<li class="alt"><span>        helperContainer.set(h);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="keyword">protected</span><span> PageHelper getHelper() {  </span></span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> (PageHelper) helperContainer.get();  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 执行请求</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param form 表单</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @return 要跳转的 forward 名称</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @throws Exception 如果执行失败</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">abstract</span><span> String execute(ActionForm form) </span><span class="keyword">throws</span><span> Exception;  </span></span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 执行请求之前的预处理</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> preProcess() {  </span></span></li>
<li class="alt"><span>        <span class="comment">// 给子类使用</span><span>  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 校验参数</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param form 表单</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @throws Exception 如果执行校验失败</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> validate(ActionForm form) </span><span class="keyword">throws</span><span> Exception {  </span></span></li>
<li class=""><span>        <span class="comment">// 给子类使用</span><span>  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 写业务日志</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @param action  动作</span> </span></li>
<li class="alt"><span><span class="comment">     * @param object  对象</span> </span></li>
<li class=""><span><span class="comment">     * @param message 日志信息</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> log(String action, String object, String message) {  </span></span></li>
<li class="alt"><span>        getHelper().writeLog(action, object, message);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 写业务日志</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param action  动作</span> </span></li>
<li class=""><span><span class="comment">     * @param message 日志信息</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> log(String action, String message) {  </span></span></li>
<li class="alt"><span>        log(action, <span class="string">""</span><span>, message);  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 设置 session 属性</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name  属性名称</span> </span></li>
<li class=""><span><span class="comment">     * @param value 属性值</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> </span><span class="keyword">void</span><span> setSessionAttribute(String name, Object value) {  </span></span></li>
<li class="alt"><span>        getRequest().getSession().setAttribute(name, value);  </span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 获得 session 属性</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @param name 属性名</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">     * @return 属性值</span> </span></li>
<li class=""><span><span class="comment">     */</span><span>  </span></span></li>
<li class="alt"><span>    <span class="keyword">protected</span><span> Object getSessionAttribute(String name) {  </span></span></li>
<li class=""><span>        <span class="keyword">return</span><span> getRequest().getSession().getAttribute(name);  </span></span></li>
<li class="alt"><span>    }  </span></li>
<li class=""><span>  </span></li>
<li class="alt"><span>    <span class="comment">/**</span> </span></li>
<li class=""><span><span class="comment">     * 获得 session 属性,只取一次</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @param name 属性名</span> </span></li>
<li class="alt"><span><span class="comment">     *</span> </span></li>
<li class=""><span><span class="comment">     * @return 属性值</span> </span></li>
<li class="alt"><span><span class="comment">     */</span><span>  </span></span></li>
<li class=""><span>    <span class="keyword">protected</span><span> Object getSessionAttributeOnce(String name) {  </span></span></li>
<li class="alt"><span>        Object value = getRequest().getSession().getAttribute(name);  </span></li>
<li class=""><span>        getRequest().getSession().removeAttribute(name);  </span></li>
<li class="alt"><span>        <span class="keyword">return</span><span> value;  </span></span></li>
<li class=""><span>    }  </span></li>
<li class="alt"><span>  </span></li>
<li class=""><span>    <span class="comment">/**</span> </span></li>
<li class="alt"><span><span class="comment">     * 检查当前用户是否拥有指定操作的权限</span> </span></li>
<li class=""><span><span class="comment">     *</span> </span></li>
<li class="alt"><span><span class="comment">    
yiding_he 2007-07-17
要避免写 Action 是不可能的,最好是写一个项目中通用的 Action,提供大量已实现的方法。其他 Action 都从此继承,这样要好写得多。

(不要引用这个回复啊,会死人的)

java 代码
 
  1. package com.chinacreator.ccimp.common.struts;  
  2.   
  3. import com.chinacreator.ccimp.common.ErrorReporter;  
  4. import com.chinacreator.ccimp.common.page.PageHelper;  
  5. import com.chinacreator.ccimp.CcimpException;  
  6. import com.chinacreator.commons.beans.NameValuePair;  
  7. import com.chinacreator.commons.utils.StringUtil;  
  8. import com.chinacreator.security.AccessControl;  
  9. import org.apache.log4j.Logger;  
  10. import org.apache.struts.action.Action;  
  11. import org.apache.struts.action.ActionForm;  
  12. import org.apache.struts.action.ActionForward;  
  13. import org.apache.struts.action.ActionMapping;  
  14. import org.apache.commons.fileupload.FileItem;  
  15. import org.apache.commons.fileupload.FileItemFactory;  
  16. import org.apache.commons.fileupload.FileUploadException;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  19.   
  20. import javax.servlet.http.HttpServletRequest;  
  21. import javax.servlet.http.HttpServletResponse;  
  22. import javax.servlet.ServletException;  
  23. import java.util.ArrayList;  
  24. import java.util.Enumeration;  
  25. import java.util.List;  
  26. import java.io.IOException;  
  27.   
  28. /** 
  29.  * 信息平台使用的 struts Action 类。本类包含大量方法方便处理请求、校验参数、写业务日志等。 
  30.  * <p/> 
  31.  * 使用时只需实现 execute 方法即可。 
  32.  * <p/> 
  33.  * 本类已经实现对访问权限的控制,不需要再写。 
  34.  * 如果要获取参数,使用 getParam() 方法即可。 
  35.  * 如果要向 request 存储数据,使用 setAttribute() 方法即可。 
  36.  * 如果要校验参数,实现 validate() 方法即可。validate() 方法没有返回值,校验失败时请抛出异常。 
  37.  * 建议使用 assertExists()、assertTrue() 等方法校验参数。 
  38.  * 
  39.  * @author hyd 
  40.  */  
  41. public abstract class CcimpAction extends Action {  
  42.   
  43.     static Logger log = Logger.getLogger(CcimpAction.class);  
  44.   
  45.     /** 
  46.      * 防止重复提交的标识 
  47.      */  
  48.     public static final String REQUEST_TOKEN = "duplicate_request_token";  
  49.   
  50.     /** 
  51.      * 预定义的 forward 
  52.      */  
  53.     protected static final String SUCCESS = "success";  
  54.   
  55.     public static boolean SHOW_PARAMS = false;  
  56.   
  57.     protected static ThreadLocal helperContainer = new ThreadLocal();  
  58.     protected static ThreadLocal errorsContainer = new ThreadLocal();  
  59.   
  60.     public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,  
  61.                                  HttpServletResponse response) throws Exception {  
  62.         request.setCharacterEncoding("GBK");  
  63.         response.setContentType("text/html; charset=GBK");  
  64.         response.setHeader("Pragma""No-cache");  
  65.         response.setHeader("Cache-Control""no-cache");  
  66.         response.setDateHeader("Expires"0);  
  67.   
  68.         String forward = "error";  
  69.         PageHelper helper = new PageHelper(request, response);  
  70.         helperContainer.set(helper);  
  71.         log.debug("当前 Action:" + this.getClass().getName());  
  72.   
  73.         // 检查用户是否登录  
  74.         if (!helper.checkAccess()) {  
  75.             log.debug("用户未登录,页面访问被阻止。");  
  76.             return mapping.findForward("login");  
  77.         }  
  78.   
  79.         TokenManager tm = new TokenManager(request);  
  80.         if (!tm.isTokenValid()) {  
  81.             log.debug("重复提交被阻止。");  
  82.             setAttribute("result""不允许重复提交。");  
  83.             return mapping.findForward(forward);  
  84.         }  
  85.         tm.saveToken();  
  86.   
  87.         // 在后台输出请求参数  
  88.         if (SHOW_PARAMS) {  
  89.             log.debug("请求参数:\n" + getRequestParamsString());  
  90.         }  
  91.   
  92.         // 进行参数校验  
  93.         try {  
  94.             validate(form);  
  95.             ArrayList errors = getErrors();  
  96.             if (errors.size() > 0) {  
  97.                 StringBuffer buffer = new StringBuffer();  
  98.                 for (int i = 0; i < errors.size(); i++) {  
  99.                     String msg = (String) errors.get(i);  
  100.                     buffer.append(msg).append("\n");  
  101.                 }  
  102.                 String result = buffer.toString();  
  103.                 log.error("参数验证失败:" + result);  
  104.                 setAttribute("result", result);  
  105.                 return mapping.findForward(forward);  
  106.             }  
  107.         } catch (Exception e) {  
  108.             setAttribute("result", e.getMessage());  
  109.             return mapping.findForward(forward);  
  110.         }  
  111.   
  112.         // 执行子类实现的预处理  
  113.         preProcess();  
  114.   
  115.         try {  
  116.             forward = execute(form);  
  117.         } catch (Exception e) {  
  118.             reportError(e);  
  119.             throw e;  
  120.         }  
  121.         return mapping.findForward(forward);  
  122.     }  
  123.   
  124.     private void reportError(Exception e) {  
  125.         log.warn("发送错误报告...");  
  126.         ErrorReporter.report(getRequest().getRequestURI(), e);  
  127.     }  
  128.   
  129.     protected String getRequestParamsString() {  
  130.         NameValuePair[] params = getHelper().getAllParams();  
  131.         StringBuffer buffer = new StringBuffer();  
  132.         for (int i = 0; i < params.length; i++) {  
  133.             NameValuePair param = params[i];  
  134.             buffer.append("setRequestParam(\"")  
  135.                     .append(param.getName())  
  136.                     .append("\", \"")  
  137.                     .append(param.getValue())  
  138.                     .append("\");\n");  
  139.         }  
  140.         return buffer.toString();  
  141.     }  
  142.   
  143.     protected void addError(String message) {  
  144.         ArrayList errors = getErrors();  
  145.         errors.add(message);  
  146.     }  
  147.   
  148.     /** 
  149.      * 检查参数是否为空 
  150.      * 
  151.      * @param paramName   request 中的参数名 
  152.      * @param failMessage 如果参数为空,则向用户显示的错误讯息 
  153.      * 
  154.      * @throws ValidationFailException 如果参数为空 
  155.      */  
  156.     protected void assertExists(String paramName, String failMessage) throws ValidationFailException {  
  157.         assertTrue(paramExists(paramName), failMessage);  
  158.     }  
  159.   
  160.     /** 
  161.      * 检查参数是否符合条件 
  162.      * 
  163.      * @param expression  检查表达式 
  164.      * @param failMessage 如果不符合条件,则向用户显示的错误讯息 
  165.      * 
  166.      * @throws Valida