# JSP动态脚本链入

# 场景

常用于JSP页面的客户化开发,不修改标准产品前端页面,按照规范将javascript文件放置在对应位置,标准产品JSP页面也能加载到客户化开发的javascript文件。

# 开发示例

下面的过程,我们以新建协同为例,不修改系统的jsp或js文件,通过一个动态引入的js文件,达到替换系统的协同发送按钮的目的。

# 确定页面的ModelAndView

可以访问对应页面,请求中加入ctp_dump_modelAndView参数确定ModelAndView的名称

http://127.0.0.1/seeyon/collaboration/collaboration.do?method=newColl&rescode=F01_newColl&ctp_dump_modelAndView=true

查看Response的Header,ModelAndView.name即为View的名称。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
ModelAndView.name: apps/collaboration/newCollaboration
Pragma: No-cache
Cache-Control: no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
Vary: Accept-Encoding

推荐使用Fiddler工具。

至此,我们确定新建协同页面的ModelAndView为apps/collaboration/newCollaboration。

# 建立自定义的JavaScript文件

1、在webapps/seeyon的extend/js目录下,建立与ModelAndView名称相同的子目录(请注意大小写),如

apps/collaboration/newCollaboration

2、创建任意名称的js文件,如

webapps/seeyon/extend/js/apps/collaboration/newCollaboration/replaceButton.js

编写控制逻辑:利用IE的开发人员工具或直接查看源代码,我们可以确定新建协同的发送按钮Id为sendId,因此,我们这样编写replaceButton.js

// 在原有的按钮后面添加我们自己定义的发送按钮
$('#sendId').after('<input id="btnCustomSend" type="button" value="发送"/>');
// 隐藏原发送按钮
$('#sendId').hide();

3、新建的js文件在重启后生效。

# 常见问题

一、我在V8.0SP2及更早的版本,通过动态脚本注入到新建协同页面能生效,但升级到V8.2之后却不生效了?

-- 老版本新建协同JSP动态脚本注入地址
extend\js\apps\collaboration\newCollaboration

原因:新版本新建协同页面不是apps\collaboration\newCollaboration.jsp了,新版本采用pageDesign模板设计器的模式支持多套新建协同页面,JSP地址换成了如下三个页面:

-- V8.1以上新建协同JSP动态脚本注入地址
pageDesigner\template\tpflowNew\0\newCollaboration
pageDesigner\template\tpflowNew\1\newCollaboration
pageDesigner\template\tpflowNew\2\newCollaboration

# 代码实现原理

注:以下只是标准产品实现原理演示,客开无需自行封装。

后端:com.seeyon.ctp.common.web.ExtendJavascriptInteceptor#postHandle,将EXTEND_JS传递给前端:

String parentPath = SystemEnvironment.getApplicationFolder() + "/extend/js/";
String path = parentPath + viewName.replace("raw:", "");
File directory = new File(parentPath);
File file = new File(path);
if (FileUtil.inDirectory(file, directory)) {
    list = this.getListFiles(path, "js", false);
    int size = list.size();
    List<String> l = new ArrayList<String>(size);
    for (String js : list) {
        l.add("extend/js/" + viewName + "/" + js);
    }
    list = l;
}
view.addObject("EXTEND_JS", list);

前端:标准产品的common_footer.jsp公共jsp文件中,实现了解析扩展的url路径,追加到页面中:

<c:if test="${fn:length(EXTEND_JS)>0}">
    <c:forEach var="js" items="${EXTEND_JS}">
        <script type="text/javascript" src="${staticPath}/${js}${ctp:resSuffix()}"></script>
    </c:forEach>
</c:if>
创建人:chenlin