解讀《sdrcMwau:formgenerator 》-02

上次順着顯示頁面BaseTemplate.jsp找到了處理該標記的java代碼:

tag處理程序 lib/sdrc_mwau/com/sdrc/_metaphase/wcc/mwau/form/tagext/FormGeneratorTag.java
數據bean
顯示bean
顯示接口
lib/sdrc_mwau/com/sdrc/metaphase/wcc/mwau/form/formbean/FormPresentationBean.java
lib/sdrc_mwau/com/sdrc/_metaphase/wcc/mwau/form/renderer/WidgetRenderer.class
HTMLWidgetRenderer.class

先看標記
<sdrcMwau:formgenerator data="sdrcFormDataBean"
         presentation="sdrcMODeLFormPresentationBean" name="TemplateForm"
         method="POST" >
<%@ include file="/edsplm/mwau/HiddenParams.incjsp" %>
</sdrcMwau:formgenerator>
中的三個參數是如何被FormGeneratorTag接受的:
        標記處理類在調用doStartTag()之前會事先將標記中所有屬性填入類的本地變量。具體過程是調用一系列的setXXX方法。接着可以看到doStartTag()會使用findAttribute()獲取該對象。
star.gif處理標記開始的方法:
public int doStartTag()
        throws JspTagException
    {
        request = (HttpServletRequest)super.pageContext.getRequest();
        context = (RequestContext)request.getAttribute("sdrcRequestContext");
        errorLog = context.getApplicationLog();
        serverLocale = context.getServerLocale();
        userLocale = context.getUserLocale();
        translate = context.getResourceLookup();
        dataBean = (ModelEntityBean)super.pageContext.findAttribute(dataAttribute_);
        if(dataBean == null)
            throw new JspTagException(translate.getText("com.sdrc._metaphase.wcc.mwau.form.tagext.TextBundle", userLocale, "NO_DATA_BEAN"));
        presBean = (FormPresentationBean)super.pageContext.findAttribute(presentationAttribute_);
        if(presBean == null)
            throw new JspTagException(translate.getText("com.sdrc._metaphase.wcc.mwau.form.tagext.TextBundle", userLocale, "NO_PRES_BEAN"));
        widget_renderer = WidgetRendererFactory.createWidgetRenderer(dataBean, presBean, nameAttribute_, request);
        if(genformAttribute_)
        {
            bodyOutput.append("<FORM NAME=/"");
            bodyOutput.append(nameAttribute_);
            bodyOutput.append("/" ");
            if(methodAttribute_ != null && methodAttribute_.length() > 0)
            {
                bodyOutput.append(" METHOD=/"");
                bodyOutput.append(methodAttribute_);
                bodyOutput.append("/" ");
            }
            if(enctypeAttribute_ != null && enctypeAttribute_.length() > 0)
            {
                bodyOutput.append(" ENCTYPE=/"");
                bodyOutput.append(enctypeAttribute_);
                bodyOutput.append("/" ");
            }
            if(actionAttribute_ != null && actionAttribute_.length() > 0)
            {
                bodyOutput.append(" ACTION=/"");
                bodyOutput.append(actionAttribute_);
                bodyOutput.append("/" ");
            }
            bodyOutput.append(">/r/n");
        }
        bodyOutput.append(widget_renderer.getAdditionalScript());
        bodyOutput.append("/r/n<TABLE>");//輸出表格元素的開頭
        buildInit();
        buildTable();
       
bodyOutput.append("</TABLE>/r/n");//輸出表格元素的結尾
        return 2;
    }star.gif
紅色部分就是在窗體上顯示數據的一些痕跡
star.gif再看這兩個被調用的方法:
    protected void buildInit()
    {
        columnCount = presBean.elementCount();
    }

    protected void buildTable()
    {
        for(int i_row = 0; i_row < columnCount; i_row++)
        {
            boolean is_full_table_column = false;
            String column_id = presBean.getElementId(i_row);
            String full_table_parent_name = presBean.getAttribute(column_id, "ParentAttrName");
            if(full_table_parent_name != null && full_table_parent_name.length() > 0)
                is_full_table_column = true;

            if(!is_full_table_column)
            {
                bodyOutput.append("<TR>/r/n");
                if(presBean.isHiddenField(column_id))
                    buildHiddenField(column_id);
                else
                if(dataBean.isOutput(column_id) || isFullTableParentOutput && buildingFullTableColumn)
                    buildReadOnlyField(column_id);
                else
                    buildEditableField(column_id);
                bodyOutput.append("</TR>/r/n");
            }
        }
    }star.gif
star.gif先看紫色的三個函數,分別對應於頁面上的三種文本1.隱藏的2.普通文字3.輸入框
    protected void addPrompt(String column_id)
    {
        if(!presBean.isHiddenField(column_id) && !presBean.isFullTableColumn(column_id, null))
        {
            bodyOutput.append("<TD CLASS=/"input-label/" VALIGN=/"top/">");
            bodyOutput.append(widget_renderer.getPrompt(column_id));
            bodyOutput.append("</TD>/r/n");
        }
    }

    private void buildEditableField(String column_id)
    {
        addPrompt(column_id);//就是上面的方法,針對可見的文字添加一個td
        addRequiredIndicator(column_id);
        bodyOutput.append("<TD>");
        String editable_field = widget_renderer.getEditableField(column_id);
        bodyOutput.append(editable_field);
        addValidationMsg(column_id);
        bodyOutput.append("</TD>/r/n");
    }

    private void buildHiddenField(String column_id)
    {
        String hidden_value = widget_renderer.getHiddenField(column_id);
        bodyOutput.append(hidden_value);
    }

    private void buildReadOnlyField(String column_id)
    {
        addPrompt(column_id);
        bodyOutput.append("<TD></TD>/r/n");
        bodyOutput.append("<TD CLASS=/"input-body/">");
        String readonly_field = widget_renderer.getReadOnlyField(column_id);
        bodyOutput.append(readonly_field);
        bodyOutput.append("</TD>/r/n");
    }star.gif
上面三個函數的區別是很明顯的,分別調用了三個不同的方法來獲取數據字符串:getEditableField()、getHiddenField()、getReadOnlyField()。而後相同的部分是三者都調用了bodyOutput.append()把獲得的數據字符串輸出到頁面。不同的是“隱藏文本”沒有表格邊框,否則不就顯示了一個空的單元格?可編輯的文本多了一個addRequiredIndicator()調用以及addValidationMsg()檢驗。
star.gif下面讓我們看一下這兩個函數
    protected void addRequiredIndicator(String column_id)
    {
        if(presBean.isCheckBox(column_id) && !presBean.isFullTableColumn(column_id, null))
            bodyOutput.append("<TD>&nbsp;</TD>/r/n");
        else
        if(!presBean.isHiddenField(column_id) && !presBean.isFullTableColumn(column_id, null))
        {
            bodyOutput.append("<TD VALIGN=/"top/">");
            bodyOutput.append(widget_renderer.getRequiredIndicator(column_id));
            bodyOutput.append("</TD>/r/n");
        }
    }

    protected void addValidationMsg(String column_id)
    {
        if(dataBean.isInError(column_id) && !presBean.isFullTable(column_id))
            bodyOutput.append(widget_renderer.getValidationErrorMessage(column_id));
    }star.gif
注意有兩個對象在這裏起了很重要的作用:presBean和widget_renderer
protected FormPresentationBean presBean;(在FormPresentationBean.class)
protected WidgetRenderer widget_renderer;(接口在WidgetRenderer.class中聲明,在HTMLWidgetRenderer.class中實現)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章