上次順着顯示頁面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()獲取該對象。
處理標記開始的方法:
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;
}
紅色部分就是在窗體上顯示數據的一些痕跡
再看這兩個被調用的方法:
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");
}
}
}
先看紫色的三個函數,分別對應於頁面上的三種文本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");
}
上面三個函數的區別是很明顯的,分別調用了三個不同的方法來獲取數據字符串:getEditableField()、getHiddenField()、getReadOnlyField()。而後相同的部分是三者都調用了bodyOutput.append()把獲得的數據字符串輸出到頁面。不同的是“隱藏文本”沒有表格邊框,否則不就顯示了一個空的單元格?可編輯的文本多了一個addRequiredIndicator()調用以及addValidationMsg()檢驗。
下面讓我們看一下這兩個函數
protected void addRequiredIndicator(String column_id)
{
if(presBean.isCheckBox(column_id) && !presBean.isFullTableColumn(column_id, null))
bodyOutput.append("<TD> </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));
}
注意有兩個對象在這裏起了很重要的作用:presBean和widget_renderer
protected FormPresentationBean presBean;(在FormPresentationBean.class)
protected WidgetRenderer widget_renderer;(接口在WidgetRenderer.class中聲明,在HTMLWidgetRenderer.class中實現)