windchill 11.0 ComponentBuilder原理

更多windchill资料参见此处

以CusChoiceTableBuilder为例

类图

在这里插入图片描述

ComponentBuilder注解
@Retention(RetentionPolicy.RUNTIME)  //定义了该Annotation被保留的时间长短:在运行时有效
@Target({ElementType.TYPE})  // 标注位置:TYPE用于描述类、接口(包括注解类型) 或enum声明
@Documented  // javadoc的注解
@Inherited // 被标注过的class的子类所继承
public @interface ComponentBuilder {
    String[] value();
    ComponentBuilderType type() default ComponentBuilderType.CONFIG_AND_DATA;
}
代码片段
@ComponentBuilder("optionmanager.mvc.choicetable")
public class CusChoiceTableBuilder extends AbstractOcmTableBuilder {
    @Override
	public ComponentConfig buildComponentConfig(ComponentParams componentparams) throws WTException {
        TableConfig tableconfig = (TableConfig)super.buildComponentConfig(componentparams);
        tableconfig.setShowCustomViewLink(false);
        tableconfig.setSelectable(true);
        tableconfig.setLabel(getDisplayLabel("CHOICETABLELABEL"));
        tableconfig.setActionModel("choicestable_toolbar_actions");
        tableconfig.setHelpContext("list_choice_help");
        ComponentConfigFactory componentconfigfactory = getComponentConfigFactory();
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("statusFamily_General", true));
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("atoIcon", true));
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("number", true));
        ColumnConfig columnconfig = componentconfigfactory.newColumnConfig("name", true);
        
        //是否可用
        ColumnConfig isAvailable = componentconfigfactory.newColumnConfig("available", "是否可用", true);
        isAvailable.setDataUtilityId("IsAvailableDataUtility");
        tableconfig.addComponent(isAvailable);
        
        columnconfig.setDefaultSort(true);
        tableconfig.addComponent(columnconfig);
        NmHelperBean nmhelperbean = ((JcaComponentParams)componentparams).getHelperBean();
        NmCommandBean nmcommandbean = nmhelperbean.getNmCommandBean();
        Option option = getOption(nmcommandbean);
        if(option != null)
        {
            OptionDataType optiondatatype = option.getOptionDataType();
            if(optiondatatype.equals(OptionDataType.NUMERIC))
                tableconfig.addComponent(componentconfigfactory.newColumnConfig("numericDisplayValue", getDisplayLabel("DATA_VALUE"), true));
        }
        ColumnConfig columnconfig1 = componentconfigfactory.newColumnConfig("ocmActionMenu", getDisplayLabel("ACTION_LABEL"), false);
        columnconfig1.setHidden(true);
        tableconfig.addComponent(columnconfig1);
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("infoPageAction", false));
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("description", true));
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("choiceStartDate", getDisplayLabel("START_DATE_LABEL"), true));
        tableconfig.addComponent(componentconfigfactory.newColumnConfig("choiceEndDate", getDisplayLabel("END_DATE_LABEL"), true));
    }
    @Override
	public Object buildComponentData(ComponentConfig componentconfig, ComponentParams componentparams)
			throws Exception {
        // ...
    }
}
处理逻辑

访问地址

http://windchillweb.klsz.com/Windchill/ptc1/comp/optionmanager.mvc.optiontable?oid=OR%3Acom.ptc.windchill.option.model.Group%3A15764302797&u8=1&optionType=WCTYPE|com.ptc.windchill.option.model.Option|com.ptc.windchill.option.DesignChoiceKaTeX parse error: Expected 'EOF', got '&' at position 38: …on_model_Option&̲context=ocmoptionmanager O R : w t . p d m l i n k . P D M L i n k P r o d u c t : 15764261418 OR:wt.pdmlink.PDMLinkProduct:15764261418 OR:wt.pdmlink.PDMLinkProduct:15764261418&AjaxEnabled=thirdLevelNav

  1. "/comp/**"请求拦截,并交由componentController处理(见jca-mvc.xml中componentHandlerMappings的定义)

  2. ComponentController代码处理片段如下(实例化的配置见jca-mvc.xml)

    public ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception {
        PerfomanceMonitor var3 = null;
        if (cmpPerflogger.isDebugEnabled()) {
            var3 = new PerfomanceMonitor();
            var3.start(log, "Creating component definition took: ");
        }
         // 从请求地址中获取组件id,即上面的地址的组件id为optionmanager.mvc.optiontable
        String var4 = MVCUrlHelper.getComponentId(var1);
        ComponentParams var5 = this.componentParamsFactory.createComponentParams(var1, var2);
        SessionHelper.getLocale();
        // 依据请求id获取到对应的定义信息。
        ComponentDefinition var6 = this.getComponentDefinition(var4, var5);
        if (var6 == null) {
            throw new ServletException("Unable to create definition for component id: " + var4);
        } else {
            // 获取组件对应的视图
            String var7 = this.getView(var6.getComponentConfig());
            if (var7 == null) {
                throw new ServletException("Unable to find view for component id: " + var4);
            } else {
                if (log.isDebugEnabled()) {
                    log.debug("View for  componentId  <" + var4 + "> is   ::: " + var7);
                }
    			// 使用组件对应的视图构造ModelAndView
                ModelAndView var8 = new ModelAndView(var7);
                var8.addObject("componentDefinition", var6);
                // 从组件定义信息中获取到对应的数据,并设置到ModelAndView中.
                ComponentData var9 = var6.getComponentData();
                var8.addObject(var4, var6);
                if (!var6.getComponentConfig().getId().equals(var4)) {
                    var8.addObject(var6.getComponentConfig().getId(), var6);
                }
    
                // 处理组合组件的数据.
                if (var9 instanceof MultiComponentData) {
                    Map var10 = ((MultiComponentData)var9).getDefinitions();
                    if (log.isDebugEnabled()) {
                        log.debug("MultiComponentData  :: " + var10);
                    }
    
                    var8.addAllObjects(var10);
                }
    			// 做ComponentBuilderInterceptor中完成后的动作.
                if (this.getComponentBuilderInterceptor() != null) {
                    this.getComponentBuilderInterceptor().afterCompletion(var8, var5);
                }
    
                if (cmpPerflogger.isDebugEnabled() && var3 != null) {
                    var3.stop(log, (Throwable)null);
                    cmpPerflogger.debug("Creating component definition took: " + var3.getElapsedSeconds());
                }
    
                return var8;
            }
        }
    }
    
  3. ComponentConfig类关系如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. DefaultTableConfig 类图

在这里插入图片描述

  1. 对应的view为:/WEB-INF/jsp/components/table.jsp

    <%@ taglib uri="http://www.ptc.com/windchill/taglib/jcaMvc" prefix="mvc"%>
    <%@include file="/netmarkets/jsp/util/begin_comp.jspf"%>
    <mvc:table setPageTitle="true"/>
    <%@ include file="/netmarkets/jsp/util/end_comp.jspf"%>
    
  2. taglib uri=“http://www.ptc.com/windchill/taglib/jcaMvc” 定义

    <!-- \codebase\WEB-INF\tlds\jcaMvc.tld -->
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
    
       <description>Windchill JCA-MVC library</description>
       <display-name>Windchill JCA-MVC tags</display-name>
       <tlib-version>1.1</tlib-version>
       <short-name>jcaMvc</short-name>
       <uri>http://www.ptc.com/windchill/taglib/jcaMvc</uri>
    
       <tag-file>
          <name>table</name>
          <description>render a jca table</description>
          <path>/WEB-INF/tags/mvc/table.tag</path>
       </tag-file>
    </taglib>
    
    <!-- table.tag -->
    <%@ include file="commonImports.tagf" %>
    
    <%@ attribute name="componentDef"
          type="com.ptc.mvc.components.ComponentDefinition"
          rtexprvalue="true"
          required="false"
          description="ComponentDefinition to be renderd"
    %>
    <%@ attribute name="compId"
          type="java.lang.String"
          rtexprvalue="true"
          required="false"
          description="Id of the Table component to be renderd"
    %>
    <%@ attribute name="setPageTitle"
          type="java.lang.String"
          rtexprvalue="false"
          required="false"
          description="Boolean, true if the page title should be the table title"
    %>
    <%@ attribute name="renderTo"
          type="java.lang.String"
          rtexprvalue="true"
          required="false"
          description="container to which this table need to be rendered"
    %>
    
    <%@ include file="commonProcessing.tagf" %>
    
    <script language="javascript">PTC.jca.setPageTitle=<%=setPageTitle%>;</script>
    
    <%
        try{
    %>
            <comp:renderTable componentDef='${componentDef}' compId='${compId}' />
    <%
        }finally {
            //make sure that jsp attribute is cleaned up
            ((PageContext)jspContext).setAttribute("renderTo",null);
        }
    %>
    
    <!--
    comp 的定义:<%@ taglib uri="http://www.ptc.com/windchill/taglib/components" prefix="comp"%>
    -->
    

    taglib uri=“http://www.ptc.com/windchill/taglib/components” 的定义如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
       <tag>
          <name>renderTable</name>
          <tag-class>com.ptc.jsca.RenderJSTableTag</tag-class>
          <body-content>scriptless</body-content>
           ...
       </tag>
    </taglib>
    
  3. com.ptc.jsca.RenderJSTableTag

    类图

在这里插入图片描述

// 获取表格渲染器
protected TableRenderer getExportTableRender(String var1) {
    TableRenderer var2;
    try {
        if (log.isDebugEnabled()) {
            log.debug("format = " + var1);
        }

        var2 = (TableRenderer)DefaultServiceProvider.getService(TableRenderer.class, var1);
    } catch (Exception var4) {
        log.debug("Couldn't find export tableRenderer ", var4);
        var2 = (TableRenderer)DefaultServiceProvider.getService(TableRenderer.class, "export");
    }
    return var2;
}
  1. TableRenderer

在这里插入图片描述

由TableRenderer生成页面的最终html代码

// DefaultTableRenderer 渲染表格的处理方法 
protected void drawTable(NmHTMLTable var1) throws Exception {
    Writer var2 = this.getTableContext().getOut();
    this.jsonOut = new JSONWriter(var2);
    String var3 = this.getTableContext().getTableID();
    if (this.isRow()) {
        String var4 = this.getHelper().getRequest().getParameter("tableID");
        if (var4 != null && var4.equals(var3)) {
            this.writeRowData(var2);
        }
    } else if (this.isDynamic()) {
        this.writeRowData(var2);
    } else {
        // 已经表格的配置信息生成extjs的js代码
        this.tableConfig = this.getTableConfig(var1);
        HttpServletRequest var8 = (HttpServletRequest)this.getHelper().getRequest();
        var8.setAttribute("jscaTable", Boolean.TRUE);

        try {
            if (this.getHelper().getRequest().getParameter("dynamicDataSource") != null) {
                this.addDynamicCallback(this.tableConfig);
                var2.write("<!-- BEGIN PURE JSON -->");
            }
			// 直接写到页面
            var2.write("<script type=\"text/javascript\">");
            var2.write("PTC.ExtJSONTableConfig =");
            var2.write(this.tableConfig.toJSONString());
            var2.write(";PTC.ExtJSONTableConfig.initialRows=");
            this.drawRows(var1, this.getColumnModel().getSelectAllString());
            var2.write(";PTC.ExtJSONTableConfig.totalRows=" + this.getPagingModel().getRowCount() + ";");
        } finally {
            var8.removeAttribute("jscaTable");
            this.doJsonRender(var2);
            var2.write("PTC.ExtJSONTableConfig = {}; ");
            var2.write("</script>");
            if (this.getHelper().getRequest().getParameter("dynamicDataSource") != null) {
                var2.write("<!-- END PURE JSON -->");
            }
        }
    }
}

上面的drawTable方法生成的代码如下:

<script language="javascript">PTC.jca.setPageTitle=true;</script>
<div id="table__optionmanager.mvc.choicetable_TABLE" class="frame_outer">
    <script type="text/javascript">
        PTC.ExtJSONTableConfig = {
            "hidden" : false,
            "extraData" : {},
            "selectable" : true,
            "pageSize" : 2000,
            "customActionsMenuColumnId" : "ocmActionMenu",
            "variableRowHeight" : false,
            "singleSelect" : false,
            "tableName" : "选择",
            "currentColumnModel" : {
                "sortInfo" : {
                    "field" : "name",
                    "direction" : "ASC"
                },
                "gridColumnModel" : [{
                        "displayHeaderLabel" : false,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "css" : "padding: 2px 1px 0 1px;",
                        "hidden" : false,
                        "resizable" : false,
                        "tooltip" : "按 常规状况 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.simpleRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "statusFamily_General",
                        "width" : 13,
                        "header" : "常规状况",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "statusFamily_General",
                        "origId" : "statusFamily_General"
                    }, {
                        "displayHeaderLabel" : false,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : false,
                        "tooltip" : "按 对象类型指示符 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.simpleRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "atoIcon",
                        "width" : 20,
                        "header" : "对象类型指示符",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "atoIcon",
                        "origId" : "atoIcon"
                    }, {
                        "displayHeaderLabel" : true,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : true,
                        "tooltip" : "按 编号 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.nmActionRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "number",
                        "width" : 45,
                        "header" : "编号",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "number",
                        "origId" : "number"
                    }, {
                        "displayHeaderLabel" : true,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : true,
                        "tooltip" : "按 是否可用 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.simpleRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "available",
                        "width" : 63,
                        "header" : "是否可用",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "available",
                        "origId" : "available"
                    }, {
                        "displayHeaderLabel" : true,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : true,
                        "tooltip" : "按 名称 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.simpleRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "name",
                        "width" : 45,
                        "header" : "名称",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "name",
                        "origId" : "name"
                    }, {
                        "displayHeaderLabel" : false,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "css" : "padding: 2px 0px 0 1px;",
                        "hidden" : true,
                        "resizable" : false,
                        "tooltip" : "操作",
                        "sortable" : false,
                        "jscaRenderer" : "jsca.columns.actionsMenuRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "ocmActionMenu",
                        "width" : 30,
                        "header" : "操作",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "ocmActionMenu",
                        "origId" : "ocmActionMenu"
                    }, {
                        "displayHeaderLabel" : false,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : false,
                        "tooltip" : "查看信息",
                        "sortable" : false,
                        "jscaRenderer" : "jsca.columns.nmActionRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "infoPageAction",
                        "width" : 20,
                        "header" : "查看信息",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "infoPageAction",
                        "origId" : "infoPageAction"
                    }, {
                        "displayHeaderLabel" : true,
                        "renderer" : "PTC.jca.jscaCellRenderer",
                        "hidden" : false,
                        "resizable" : true,
                        "tooltip" : "按 说明 排序",
                        "sortable" : true,
                        "jscaRenderer" : "jsca.columns.simpleRenderer",
                        "isWrapped" : false,
                        "dataIndex" : "description",
                        "width" : 45,
                        "header" : "说明",
                        "columnResizeProperty" : ["AUTO_SIZE"],
                        "id" : "description",
                        "origId" : "description"
                    }
                ],
                "storeFields" : [{
                        "name" : "statusFamily_General"
                    }, {
                        "name" : "atoIcon"
                    }, {
                        "name" : "number"
                    }, {
                        "name" : "available"
                    }, {
                        "name" : "name"
                    }, {
                        "name" : "ocmActionMenu"
                    }, {
                        "name" : "infoPageAction"
                    }, {
                        "name" : "description"
                    }, {
                        "name" : "oid"
                    }, {
                        "name" : "jsca_context"
                    }, {
                        "name" : "selectableRow"
                    }, {
                        "name" : "rowHidden"
                    }, {
                        "name" : "dynamicLocation"
                    }
                ]
            },
            "selectedMessage" : "已选择 #{selected} 个对象",
            "storeURL" : {
                "method" : "POST",
                "params" : {
                    "choiceType" : ["WCTYPE\\x7Ccom.ptc.windchill.option.model.Choice\\x7Ccom.ptc.windchill.option.DesignChoice\\x24com_ptc_windchill_option_model_Choice"],
                    "u8" : ["1"],
                    "context" : ["ocm\\x24optionmanager\\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\\x24"],
                    "tableID" : ["optionmanager.mvc.choicetable"],
                    "oid" : ["VR:com.ptc.windchill.option.model.Option:15480107037"]
                },
                "url" : "ptc1/comp/optionmanager.mvc.choicetable",
                "pve" : true
            },
            "pageOffset" : 0,
            "tableID" : "optionmanager.mvc.choicetable",
            "rowHeight" : 22,
            "serverSortInfo" : "name$u",
            "enableGroupingMenu" : "true",
            "showHeader" : true,
            "showItemsCount" : true,
            "displayedMessage" : "已显示 #{displayed} 个对象,共 #{total} 个",
            "toolbar" : {
                "tooltip" : "",
                "actionID" : "object_choicestable_toolbar_actions",
                "text" : "",
                "items" : [{
                        "toolBarDesc" : true,
                        "handler" : function (target, event, table) {
                            if (deleteConfirm(event, table)) {
                                javascript : submitIt('deleteChoiceToolbar', 'null', '', '', '', '', '', '', '', '', '', '', '', '', 'portlet', 'poppedup', 'context', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', 'oid', 'VR:com.ptc.windchill.option.model.Option:15480107037', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', 'none', 'com.ptc.windchill.option.form.DeleteChoiceFormProcessor', 'execute', 'null', '', '', false, 'P948923807621365', 'row', '', true, 'table__optionmanager.mvc.choicetable_TABLE')
                            };
                            PTC.learningConnector.sendCommand('deleteChoiceToolbar', 'choice', 'null');
                        },
                        "hidden" : false,
                        "tooltip" : "删除 ",
                        "icon" : "netmarkets/images/delete.gif",
                        "selectRequired" : true,
                        "actionType" : "choice",
                        "shortCut" : true,
                        "actionID" : "P948923807621365",
                        "disabled" : false,
                        "id" : "P948923807621365",
                        "text" : "删除 ",
                        "actionName" : "deleteChoiceToolbar",
                        "multiSelect" : true
                    }, {
                        "toolBarDesc" : true,
                        "actionType" : "choice",
                        "handler" : function (target, event, table) {
                            javascript : popupAction('createChoice_choice', 'ptc1/choice/createChoice', '', '', '', '', '', '', '', '', '', '', '', '', 'portlet', 'poppedup', 'context', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', 'oid', 'VR:com.ptc.windchill.option.model.Option:15480107037', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', 'none', 'ext.higer.ocm.formprocessor.CusCreateChoiceFormProcessor', 'execute', 'height=800,width=1280,status=yes', '', '', false, 'P948923807621366', 'component', '', false, 'table__optionmanager.mvc.choicetable_TABLE');
                            PTC.learningConnector.sendCommand('createChoice', 'choice', 'null');
                        },
                        "shortCut" : true,
                        "hidden" : false,
                        "tooltip" : "新建选择",
                        "icon" : "netmarkets/images/new_choice.gif",
                        "actionID" : "P948923807621366",
                        "disabled" : false,
                        "id" : "P948923807621366",
                        "text" : "新建选择",
                        "actionName" : "createChoice"
                    }, {
                        "toolBarDesc" : true,
                        "handler" : function (target, event, table) {
                            if (onClickValidation(event, 'list_copy')) {
                                javascript : noContentAction('list_copy', 'ptc1/object/list_copy', '', '', '', '', '', '', '', '', '', '', '', '', 'portlet', 'poppedup', 'context', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', '', '', 'ocm\x24optionmanager\x24OR:wt.pdmlink.PDMLinkProduct:15505410567\x24\x7Ccomp\x24optionmanager\x24VR:com.ptc.windchill.option.model.Option:15480107037\x24', 'none', 'com.ptc.netmarkets.model.NmObjectCommands', 'list_copy', 'height=300,width=300', 'com.ptc.netmarkets.util.utilResource.COPY_SUCCESS_MSG', 'com.ptc.netmarkets.util.utilResource.NONE_CHECKED', false, 'P948923807621367', 'component', '', true, 'table__optionmanager.mvc.choicetable_TABLE')
                            };
                            PTC.learningConnector.sendCommand('list_copy', 'object', 'null');
                        },
                        "hidden" : false,
                        "tooltip" : "复制选定对象",
                        "icon" : "netmarkets/images/copy.gif",
                        "selectRequired" : true,
                        "actionType" : "object",
                        "shortCut" : true,
                        "actionID" : "P948923807621367",
                        "disabled" : false,
                        "id" : "P948923807621367",
                        "text" : "复制",
                        "actionName" : "list_copy",
                        "multiSelect" : true
                    }
                ]
            },
            "LockColIndex" : -1,
            "findInTableMode" : "CLIENT_AND_SERVER",
            "displayedMoreMessage" : "已显示 #{displayed} 个对象,共 #{total} 个以上",
            "help" : {
                "tooltip" : "帮助",
                "selector" : "list_choice_help",
                "url" : "http://windchillweb.klsz.com/Windchill-WHC/index.html?id=OptionsChoicesTable&locale=zh-CN"
            },
            "pageLimit" : 2000,
            "saveFormData" : false,
            "serverSorted" : true,
            "allMode" : true,
            "displayedLoadCompleteMessage" : " 共 #{total} 个对象",
            "singleSelectView" : false,
            "collapse" : false
        };
        PTC.ExtJSONTableConfig.initialRows = [];
        PTC.ExtJSONTableConfig.chunk = {
            "id" : "170",
            "fromIndex" : 0,
            "totalCount" : 0,
            "transmissionState" : "OPEN",
            "resultState" : "SUCCESSFUL"
        };
        PTC.ExtJSONTableConfig.totalRows = 0;
        PTC.jca.renderTable(PTC.ExtJSONTableConfig);
        PTC.ExtJSONTableConfig = {};

    </script>
</div>
<input type="hidden" name="optionmanager.mvc.choicetableofi" value="0"/><input type='hidden' id='noItemString_table__optionmanager.mvc.choicetable_TABLE' value='没有可显示的对象'/>
<input type='hidden' id='selectAllCheckBox_table__optionmanager.mvc.choicetable_TABLE' value='null'/>
<input type='hidden' id='saveAsViewJavascriptUrl_table__optionmanager.mvc.choicetable_TABLE' value="null"/><input type='hidden' id='saveViewJavascriptUrl_table__optionmanager.mvc.choicetable_TABLE' value="null"/>

/app/#ptc1/** 页面处理逻辑

以 http://windchillweb.klsz.com/Windchill/app/#ptc1/ext/higer/custProj/array-grid 页面为例

  1. MVCDispatcher 拦截 /app/*的请求(参见web.xml的配置),并交由ParameterizableViewController处理(参见jca-mvc.xml,mvc.xml,common-urlMappings.properties)

  2. ParameterizableViewController 交由 /WEB-INF/jsp/shell.jsp 视图处理(参见jca-mvc.xml)

  3. shell.jsp 渲染 头部、导航及内容部分

    <!-- 代码片段 -->
    <body class="wcshell">
        <script type="text/javascript">
            PTC.navigation.override();
            PTC.navigation.loadShell();  // 加载页面内容(即#/ptc1后面的请求的页面)
            <% if (presentationBean.getData().isJsDebug()) { %>PTC.debug.isJsDebug = TRUE_FUNC;<% } %>
        </script>
    </body>
    </html>
    
  4. loadShell方法中加载页面内容部分(即将ptc1/ext/higer/custProj/array-grid 页面的内容加载到页面上)的调用栈如下:

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_snail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值