更多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
-
"/comp/**"请求拦截,并交由componentController处理(见jca-mvc.xml中componentHandlerMappings的定义)
-
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; } } }
-
ComponentConfig类关系如下
- DefaultTableConfig 类图
-
对应的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"%>
-
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>
-
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;
}
- 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 页面为例
-
MVCDispatcher 拦截 /app/*的请求(参见web.xml的配置),并交由ParameterizableViewController处理(参见jca-mvc.xml,mvc.xml,common-urlMappings.properties)
-
ParameterizableViewController 交由 /WEB-INF/jsp/shell.jsp 视图处理(参见jca-mvc.xml)
-
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>
-
loadShell方法中加载页面内容部分(即将ptc1/ext/higer/custProj/array-grid 页面的内容加载到页面上)的调用栈如下: