J-Hi對struts2與webwork的無配置文件的實現原理 – JAVA編程語言程序開發技術文章

實現方式
1、在struts.xml或xwork.xml加如下配置信息
        <global-results>
           
            <result name=”auto”>/${proxy.config.packageName}/${proxy.method}.jsp</result>          
        </global-results>
2、在BaseAction類中加入proxy的方法實現
      private ActionProxy proxy;
   
    public ActionProxy getProxy(){
        if(proxy  == null)
            proxy = ActionContext.getContext().getActionInvocation().getProxy();
        return proxy;
    }


3、做一個JSP文件,文件名一定要與action的方法名相同,列如:a.jap那麼action的方法的寫法
    public String a() throws Exception{
       
        return AUTO;
    }
4、在某個Jsp頁面中調於這個無配置actoin的寫法
    actionName!a.action


分析
   ActionProxy類是struts2或webwork提供的一個action代理類,它的作用是它的作用是記錄當前這個action的對象、action的名稱、配置信息及該action所屬的包名等信息。該接口的聲明如下
public interface ActionProxy {


    /**
     * @return the Action instance for this Proxy
     */
    Object getAction();


    /**
     * @return the alias name this ActionProxy is mapped to
     */
    String getActionName();


    /**
     * @return the ActionConfig this ActionProxy is built from
     */
    ActionConfig getConfig();


    /**
     * Sets whether this ActionProxy should also execute the Result after executing the Action
     *
     * @param executeResult
     */
    void setExecuteResult(boolean executeResult);


    /**
     * @return the status of whether the ActionProxy is set to execute the Result after the Action is executed
     */
    boolean getExecuteResult();


    /**
     * @return the ActionInvocation associated with this ActionProxy
     */
    ActionInvocation getInvocation();


    /**
     * @return the namespace the ActionConfig for this ActionProxy is mapped to
     */
    String getNamespace();


    /**
     * Execute this ActionProxy. This will set the ActionContext from the ActionInvocation into the ActionContext
     * ThreadLocal before invoking the ActionInvocation, then set the old ActionContext back into the ThreadLocal.
     *
     * @return the result code returned from executing the ActionInvocation
     * @throws Exception
     * @see ActionInvocation
     */
    String execute() throws Exception;


    /**
     * Sets the method to execute for the action invocation. If no method is specified, the method provided by
     * in the actions configuration will be used.
     *
     * @param method the string name of the method to invoke
     */
    void setMethod(String method);


    /**
     * Returns the method to execute, or null if no method has been specified (meaning “execute” will be invoked)
     */
    String getMethod();
}
 
   J-Hi借用瞭這個代理類,在action的基類也就是BaseAction中添加瞭對該類實例的引用,從而實體全局配置
       <result name=”auto”>/${proxy.config.packageName}/${proxy.method}.jsp</result> 
   其中${proxy.config.packageName}用來指定當前action所屬的包名,例如,”testjs”就是配置文件的包名
<xwork>
    <package name=”testjs” extends=”hi” >
      <action name=”materialList”
            class=”org.hi.testjs.action.webwork.MaterialListAction”>
            <result name=”success”>/testjs/MaterialList.jsp</result>
            <interceptor-ref name=”modelParamsStack” />
        </action>
.
</xwork>  ${proxy.method}是指調用該action的方法名
  name=”auto” 是我們特意為這樣無配置的actoin起瞭一個特定的名字,也就是說 
      
    public String a() throws Exception{
        return “auto”;     
        或
        return AUTO;
    }  效果是一樣的
 
  我們特意將這段result的配置放在瞭<global-results>中原因是省去寫配置文件,隻要是return “auto”;就會調用這個結果。那麼它的結果是什麼呢?對,是一個JSP,也就是說你通過actionName!method.action後,系統會自動執行這個方法,並自動調用這個aciton所屬包名下的與方法名相同的jsp文件。例如配置文件的包名為”testjs”,actionName為”materialList”,對應的class為”org.hi.testjs.action.webwork.MaterialListAction”,你在這個action類中增加瞭一個a(),想通過調用該方法實現無配置調用jsp,那麼你就應該將這個jsp文件放到web/testjs(與包名相同)目錄下,並且該jsp的文件名為a.jsp(與方法名相同)。調用這個action方法的寫法如下:materialList!a.action。OK,大工告成!!


技巧
   為瞭適應不同人對action的開發習慣,J-Hi對struts2與webwork的生成方式是不同的。struts2是所有的操作都放在一個Action類中通過方法調用,而webwork是每個一操作一個Action類。兩種方式均有優勢也優有不足之處,大傢在使用時全憑自己的習慣就好。我們之所以實現無配置,主要是考慮到J-Hi它不隻是一個開發管理系統的平臺,也應該可以做網站或電子商務前端的開發。我們知道對於後臺管理系統主要考慮的是系統安全性(頁面的佈局與樣式風格要統一),而網站或電子商務前端恰好相反,它追求的是安全不是問題因為它歡迎更多的瀏覽者不需要對每個操作都做權限控制(頁面的風格也五花八門,炫、酷不規則是這類系統的特點)。因此提供瞭無配置文件的方式,以滿足這類需求(當然純頁面還是要由美工來完成,無規則平臺的生成器是無法勝任該工作的)。由此而帶來的另一個問題是,平臺已經生成瞭很多aciton的功能,如何讓前臺與後臺共用這些已生成的action類呢?下面我們以struts2為例
   在BaseAction中有一個protected String returnCommand()方法,該方法是確定返回的結果的名字
    protected String returnCommand(String message){
        String viewMode = HiConfigHolder.getViewMode();
       
        if(viewMode.equals(“dwz”)){                   
            if ((ajax == null || !ajax.trim().equals(“1”

發佈留言