<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>


    草之戒_
    posts - 2,comments - 14,trackbacks - 0
          在這里我不說struts2的驗(yàn)證原理以及語法,我只講一下關(guān)于struts2驗(yàn)證返回input視圖的解決辦法。
          當(dāng)然如果你是使用一個(gè)方法對一個(gè)類,則不存在上面的問題,當(dāng)然一個(gè)方法對應(yīng)一個(gè)類,這種方式雖然可讀性很高但是實(shí)際開發(fā)確實(shí)不可取,因?yàn)樗麜诡悩O具增加。如果你是使用一個(gè)類對應(yīng)多個(gè)方法,你肯定碰到過這樣一個(gè)問題,那就是驗(yàn)證時(shí)返回input視圖,struts2默認(rèn)驗(yàn)證失敗返回input視圖,但是我們在寫程序中經(jīng)常會有多個(gè)方法需要驗(yàn)證,打個(gè)比方如:create、update這兩個(gè)操作一般情況下都會驗(yàn)證,但是我們把它寫在一個(gè)類中,我們?nèi)绻麉^(qū)分驗(yàn)證失敗后,到底是create失敗了還是update失敗了呢?這個(gè)時(shí)候有沒有懷疑過struts2,呵呵。
          當(dāng)然struts2其時(shí)已經(jīng)給了我們解決辦法,如果你是一個(gè)細(xì)心的人讀過struts2源碼便過發(fā)現(xiàn)struts2是如何解決問題的,在這里我也簡單的分析一下struts2的源碼,大家請看下面這個(gè)類。
    package com.opensymphony.xwork2.interceptor;

    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.ValidationAware;
    import com.opensymphony.xwork2.interceptor.annotations.InputConfig;
    import com.opensymphony.xwork2.util.logging.Logger;
    import com.opensymphony.xwork2.util.logging.LoggerFactory;

    import java.lang.reflect.Method;

    public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {

        
    private static final long serialVersionUID = 7563014655616490865L;

        
    private static final Logger LOG = LoggerFactory.getLogger(DefaultWorkflowInterceptor.class);

        
    private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];

        
    //默認(rèn)返回input視圖,是在這里定義的
        private String inputResultName = Action.INPUT;
        
        
    //可以在這里更改,一般沒有人會這么做
        public void setInputResultName(String inputResultName) {
            
    this.inputResultName = inputResultName;
        }

        @Override
        
    protected String doIntercept(ActionInvocation invocation) throws Exception {
            Object action 
    = invocation.getAction();

            
    if (action instanceof ValidationAware) {
                ValidationAware validationAwareAction 
    = (ValidationAware) action;

                
    if (validationAwareAction.hasErrors()) {
                    
    if (LOG.isDebugEnabled()) {
                        LOG.debug(
    "Errors on action " + validationAwareAction + ", returning result name 'input'");
                    }
                    
    //one
                    String resultName = inputResultName;
                    
    /*
                    在這里大家讀一下源碼即可明白,當(dāng)前處理的Action如果是一個(gè)ValidationWorkflowAware類型的,
                    則調(diào)用他的getInputResultName作用返回值
                    為了方便我直接把ValidationWorkflowAware放在下面的注釋中,大家看他是一個(gè)接口,
                    也就是說如果我們的Action實(shí)現(xiàn)了ValidationWorkflowAware接口
                    他則會調(diào)用getInputResultName方法返回的值,而非input,而默認(rèn)的ActionSupport沒有實(shí)現(xiàn)這個(gè)接口,我們需要手動(dòng)實(shí)現(xiàn)

                    
    */
                    
    //package com.opensymphony.xwork2.interceptor;
                    
    //public interface ValidationWorkflowAware {
                        
    // String getInputResultName();
                    
    //}

                    
    if (action instanceof ValidationWorkflowAware) {
                        resultName 
    = ((ValidationWorkflowAware) action).getInputResultName();
                    }
                    
    //這里不做講述
                    InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), EMPTY_CLASS_ARRAY).getAnnotation(InputConfig.class);
                    
    if (annotation != null) {
                        
    if (!annotation.methodName().equals("")) {
                            Method method 
    = action.getClass().getMethod(annotation.methodName());
                            resultName 
    = (String) method.invoke(action);
                        } 
    else {
                            resultName 
    = annotation.resultName();
                        }
                    }
                    
    return resultName;
                }
            }

            
    return invocation.invoke();
        }

    }
          大家看到上面是不是已經(jīng)恍然大悟了,呵呵,是的我們實(shí)現(xiàn)了ValidationWorkflowAware接口之后,只需要定義一個(gè)inputResultName屬性生成了對應(yīng)的get、set方法是不是就對應(yīng)有了getInputResultName,而這個(gè)屬性的值我們可以動(dòng)態(tài)傳入一個(gè)值進(jìn)來,呵呵,大家看下面這個(gè)實(shí)例。


    public abstract class ActionSupport extends
            com.opensymphony.xwork2.ActionSupport 
    implements Result,
            ValidationWorkflowAware {

        
    private static final long serialVersionUID = 799075559195465128L;

        
    public static final int ERROR_MSG = -1;
        
    public static final int WARN_MSG = 0;
        
    public static final int SUCCESS_MSG = 1;

        
    public static long getSerialversionuid() {
            
    return serialVersionUID;
        }

        
    private ActionContext actionContext;
        
    private Object id;
        
    private Pagination pagn = new Pagination();
        
    private QueryResult<?> results;
        
    private String inputResultName;

        
    /**
         * 初始化ActionContext對象
         
    */
        
    public ActionSupport() {
            actionContext 
    = ActionContext.getContext();
        }

        
    /**
         * 
         * 
    @return ActionContext對象
         
    */
        
    public ActionContext getActionContext() {
            
    return actionContext;
        }

        
    /**
         * 
         * 
    @return Struts封裝后的ServletContext對象。
         
    */
        
    public Map<String, Object> getApplication() {
            
    return actionContext.getApplication();
        }

        
    /**
         * 
         * 
    @return 取得標(biāo)識。
         
    */
        
    public Object getId() {
            
    return id;
        }

        
    /**
         * 取得指定類型的標(biāo)識。
         * 
         * 
    @param <E>
         * 
    @param c
         * 
    @return
         
    */
        @SuppressWarnings(
    "unchecked")
        
    public <E> E getId(Class<E> c) {
            
    return (E) id;
        }

        
    /**
         * 
         * 
    @return 輸出對象。
         * 
    @throws IOException
         
    */
        
    public PrintWriter getOut() throws IOException {
            
    return getResponse().getWriter();
        }

        
    /**
         * 
         * 
    @return 分頁參數(shù)對象。
         
    */
        
    public Pagination getPagn() {
            
    return pagn;
        }

        
    /**
         * 
         * 
    @return HttpServletRequest對象。
         
    */
        
    public HttpServletRequest getRequest() {
            
    return ServletActionContext.getRequest();
        }

        
    /**
         * 
         * 
    @return HttpServletResponse對象。
         
    */
        
    public HttpServletResponse getResponse() {
            
    return ServletActionContext.getResponse();
        }

        
    /**
         * 
         * 
    @return 查詢結(jié)果集。
         
    */
        
    public QueryResult<?> getResults() {
            
    return results;
        }

        
    /**
         * 
         * 
    @return ServletContext對象。
         
    */
        
    public ServletContext getServletContext() {
            
    return (ServletContext) this.actionContext
                    .get(StrutsStatics.SERVLET_CONTEXT);
        }

        
    /**
         * 
         * 
    @return Struts封裝后的HttpSession對象。
         
    */
        
    public Map<String, Object> getSession() {
            
    return actionContext.getSession();
        }

        
    /**
         * 
         * 
    @return Struts的ValueStack對象。
         
    */
        
    public ValueStack getValueStack() {
            
    return ServletActionContext.getValueStack(getRequest());
        }

        
    /**
         * 向ActionContext中添加一個(gè)信息,此信息會保存到HttpServletRequest中。
         * 
         * 
    @param key
         *            鍵。
         * 
    @param value
         *            值。
         
    */
        
    public void put(String key, Object value) {
            actionContext.put(key, value);
        }

        
    public void setActionContext(ActionContext actionContext) {
            
    this.actionContext = actionContext;
        }

        
    /**
         * 
         * 
    @param id
         *            設(shè)置標(biāo)識。
         
    */
        
    public void setId(Object id) {
            
    this.id = id;
        }

        
    /**
         * 
         * 
    @param pagn
         *            設(shè)置分頁參數(shù)對象。
         
    */
        
    public void setPagn(Pagination pagn) {
            
    this.pagn = pagn;
        }

        
    /**
         * 
         * 
    @param results
         *            設(shè)置返回的結(jié)果集。
         
    */
        
    protected void setResults(QueryResult<?> results) {
            
    this.results = results;
        }

        
    public String getInputResultName() {
            
    return inputResultName;
        }

        
    public void setInputResultName(String inputResultName) {
            
    this.inputResultName = inputResultName;
        }

        
    public abstract String show() throws Exception;

        
    public abstract String edit() throws EditFailureException;

        
    public abstract String destroy() throws DestroyFailureException;

        
    public abstract String create() throws CreateFailureException;

        
    public abstract String deleteConfirm() throws DeleteFailureException;

        
    public abstract String index() throws Exception;

        
    public abstract String update() throws UpdateFailureException;

        
    public abstract String editNew() throws EditFailureException;
    }
          上面是我自定義一個(gè)ActionSupport類,該類實(shí)現(xiàn)了ValidationWorkflowAware,并重寫了getInputResultName方法。然后我再定義一個(gè)Action繼承了該類。
    @Namespace(value = "/test")
    @Action(params 
    = { "actionName""demo" })
    @Results( {
            @Result(name 
    = "xx", type = "redirect", location = "http://www.google.com"),
            @Result(name 
    = "hello", type = "redirect", location = "http://www.baidu.com") })
    @SuppressWarnings(
    "serial")
    public class DownloadController extends ActionSupport {

        
    public String index() {
            System.out.println(
    "-------index-----------");
            
    return "xx";
        }

        
    public void validateIndex() {
            addFieldError(
    "hell"".my hello.");
            System.out.println(
    "ok");
        }
        
    //..省略了其它無關(guān)方法
    }
          在上面我就只是做了一個(gè)簡單了模擬驗(yàn)證然后跳轉(zhuǎn)到指定的頁面。這里你可以這樣請求,測試一個(gè)最終struts2是否調(diào)用了getInputResultName方法并使用其返回值,作為返回視圖的名稱:http://地址:端口/project/test/demo!index.action?inputResultName=hello,大家測試如果跳轉(zhuǎn)到了baidu就說明成功了。
          至此,有問題可以留言。


    轉(zhuǎn)載時(shí)請注明轉(zhuǎn)載地址,onlyeffort.QQ:501276913
    posted on 2010-06-08 20:13 Aidan 閱讀(6130) 評論(7)  編輯  收藏

    FeedBack:
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-08 23:15 | 18傲骨中文
    收藏慢慢看~~  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-09 08:17 | quaff
    請使用@InputConfig

    public class DownloadController extends ActionSupport {

    @InputConfig(methodName="inputIndex")
    //@InputConfig(resultName="input")
    public String index() {
    System.out.println("-------index-----------");
    return "xx";
    }

    public void validateIndex() {
    addFieldError("hell", ".my hello.");
    System.out.println("ok");
    }

    public string inputIndex() {
    return "input";
    }
    }  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-09 08:46 | 雪山飛鵠
    通常都是自己在validator方法中做判斷,沒研究過  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-09 11:34 | Aidan
    @quaff
    Thank you.使用@InputConfig能更簡單的完成任務(wù),而且可讀性更高。  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-09 23:04 | aaaaaa
    struts2早提供了每個(gè)方法一個(gè)validate,就是會執(zhí)行validateXXX方法,比如業(yè)務(wù)方法update,那么會執(zhí)行validateUpdate.  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-10 08:39 | Aidan
    @aaaaaa
    不好意思,我們討論的不是一個(gè)話題。  回復(fù)  更多評論
      
    # re: Struts2-疑難雜癥之Validator返回input視圖
    2010-06-10 08:50 | quaff
    @Aidan
    這是我提交給xwork的,看你的需求就知道這個(gè)功能就是為這個(gè)打造的  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    編程部落   qq群:37996359(上限500人,一起關(guān)注java、討論技術(shù),互相學(xué)習(xí),共同進(jìn)步)
    主站蜘蛛池模板: yy6080久久亚洲精品| 日韩大片免费观看视频播放| a级毛片在线免费| 久久久无码精品亚洲日韩软件| 久久亚洲精品无码av| 国产精品免费电影| 亚洲AV网一区二区三区| 日韩a级毛片免费视频| 亚洲第一黄片大全| 一本久久A久久免费精品不卡| 亚洲人成色7777在线观看不卡| 亚洲日韩中文字幕| 免费无码精品黄AV电影| 亚洲AV日韩综合一区尤物| 午夜小视频免费观看| 亚洲中文字幕无码一久久区| A国产一区二区免费入口| 亚洲AV无码精品无码麻豆| 91福利视频免费观看| 91亚洲自偷在线观看国产馆| 四虎成人免费大片在线| 久久精品亚洲中文字幕无码麻豆| 老司机精品视频免费| 亚洲无码在线播放| 91老湿机福利免费体验| 亚洲乱码中文字幕在线| 18级成人毛片免费观看| 亚洲伊人久久大香线蕉AV| 国产免费av片在线播放| 在线观看免费视频一区| 亚洲专区一路线二| 亚洲av无码天堂一区二区三区| 免费视频一区二区| 在线aⅴ亚洲中文字幕| 亚洲精品岛国片在线观看| 日韩免费无码视频一区二区三区| 一区二区亚洲精品精华液 | 在线观看日本亚洲一区| 亚洲精品网站在线观看不卡无广告| 国产99视频精品免费专区| 亚洲精品无码久久久久APP|