项目的js库只加载一次

12 篇文章 0 订阅

使用struts2开发portlet时,需要在jsp页面上加载现有的js库进行交互。这个portlet可能在页面上重复使用,这就要求确保页面上的多个portlet中同样的js文件只会加载一次。经过研究,发现可以通过扩展Jsr286Dispatcher类,然后重写doHeaders方法实现,代码如下:

 

Java代码   收藏代码
  1.     @Override  
  2.     protected void doHeaders(RenderRequest request, RenderResponse response) {  
  3.         super.doHeaders(request, response);  
  4.           
  5. //        if (request.getPortalContext().getProperty(PortalContext.MARKUP_HEAD_ELEMENT_SUPPORT) == null) {  
  6. //          logger.warn("The Portal Server does not support adding markup to the header. This may lead to portlets that do not work properly.");          
  7. //      } else {              
  8.             for (String cssFile : styles) {                      
  9.                 Element htmlHeader = response.createElement("link");                      
  10.                 htmlHeader.setAttribute("rel""stylesheet");                      
  11.                 htmlHeader.setAttribute("type""text/css");                      
  12.                 htmlHeader.setAttribute("href", response.encodeURL(request.getContextPath() + cssFile));    
  13.                   
  14.                 response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, htmlHeader);                      
  15.                 logger.debug("Added {} CSS file to the portal header.", cssFile);                  
  16.             }                  
  17.                   
  18.             for (String javascriptFile : scripts) {                      
  19.                 Element htmlHeader = response.createElement("script");                      
  20.                 htmlHeader.setAttribute("src", response.encodeURL(request.getContextPath() + javascriptFile));                      
  21.                 htmlHeader.setAttribute("type""text/javascript");     
  22.                   
  23.                 response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, htmlHeader);  
  24.                 logger.debug("Added {} Javascript file to the portal header.", javascriptFile);                  
  25.             }              
  26. //      }      
  27.     }  

 运行后发现doHeaders方法不执行,然后查阅Jsr286Dispatcher类的源代码和GenericPortlet类的源代码,发现struts2已经修改了render方法,不再执行调用doHeaders的方法,所以我又重写了render方法,整体代码如下:

Java代码   收藏代码
  1. /** 
  2.  *  
  3.  */  
  4. package com.lily.dap.web.portlet.dispatcher;  
  5.   
  6. import java.io.IOException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import javax.portlet.MimeResponse;  
  11. //import javax.portlet.PortalContext;  
  12. import javax.portlet.PortletConfig;  
  13. import javax.portlet.PortletException;  
  14. import javax.portlet.RenderRequest;  
  15. import javax.portlet.RenderResponse;  
  16.   
  17. import org.apache.struts2.portlet.dispatcher.Jsr286Dispatcher;  
  18. import org.slf4j.Logger;  
  19. import org.slf4j.LoggerFactory;  
  20. import org.w3c.dom.Element;  
  21.   
  22. /** 
  23.  * 支持加载js脚本文件、css样式文件 
  24.  *  
  25.  * @author zouxuemo 
  26.  * 
  27.  */  
  28. public class Dispatcher extends Jsr286Dispatcher {  
  29.     protected final Logger logger = LoggerFactory.getLogger(getClass());  
  30.       
  31.     private List<String> scripts = new ArrayList<String>();  
  32.       
  33.     private List<String> styles = new ArrayList<String>();  
  34.       
  35.     @Override  
  36.     public void init(PortletConfig cfg) throws PortletException {  
  37.         super.init(cfg);  
  38.           
  39.         String s = cfg.getInitParameter("scripts");  
  40.         if (s != null) {  
  41.             String[] tmp = s.split(" ");  
  42.             for (String script : tmp) {  
  43.                 script = script.trim();  
  44.                 if (script.charAt(0) != '/')  
  45.                     script = '/' + script;  
  46.                   
  47.                 scripts.add(script);  
  48.             }  
  49.         }  
  50.           
  51.         s = cfg.getInitParameter("styles");  
  52.         if (s != null) {  
  53.             String[] tmp = s.split(" ");  
  54.             for (String style : tmp) {  
  55.                 style = style.trim();  
  56.                 if (style.charAt(0) != '/')  
  57.                     style = '/' + style;  
  58.                   
  59.                 styles.add(style);  
  60.             }  
  61.         }  
  62.     }  
  63.   
  64.     @Override  
  65.     public void render(RenderRequest request, RenderResponse response)  
  66.             throws PortletException, IOException {  
  67.         doHeaders(request, response);  
  68.           
  69.         super.render(request, response);  
  70.     }  
  71.   
  72.     @Override  
  73.     protected void doHeaders(RenderRequest request, RenderResponse response) {  
  74.         super.doHeaders(request, response);  
  75.           
  76. //        if (request.getPortalContext().getProperty(PortalContext.MARKUP_HEAD_ELEMENT_SUPPORT) == null) {  
  77. //          logger.warn("The Portal Server does not support adding markup to the header. This may lead to portlets that do not work properly.");          
  78. //      } else {              
  79.             for (String cssFile : styles) {                      
  80.                 Element htmlHeader = response.createElement("link");                      
  81.                 htmlHeader.setAttribute("rel""stylesheet");                      
  82.                 htmlHeader.setAttribute("type""text/css");                      
  83.                 htmlHeader.setAttribute("href", response.encodeURL(request.getContextPath() + cssFile));    
  84.                   
  85.                 response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, htmlHeader);                      
  86.                 logger.debug("Added {} CSS file to the portal header.", cssFile);                  
  87.             }                  
  88.                   
  89.             for (String javascriptFile : scripts) {                      
  90.                 Element htmlHeader = response.createElement("script");                      
  91.                 htmlHeader.setAttribute("src", response.encodeURL(request.getContextPath() + javascriptFile));                      
  92.                 htmlHeader.setAttribute("type""text/javascript");     
  93.                   
  94.                 response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, htmlHeader);  
  95.                 logger.debug("Added {} Javascript file to the portal header.", javascriptFile);                  
  96.             }              
  97. //      }      
  98.     }  
  99. }  

 

然后在portlet.xml中添加js脚本的初始参数设置,代码如下:

Xml代码   收藏代码
  1. <portlet id="AnalysisPresentation">  
  2.     <description xml:lang="zh">分析数据展现</description>  
  3.     <portlet-name>AnalysisPresentation</portlet-name>  
  4.     <display-name xml:lang="zh">分析数据展现</display-name>  
  5.     <portlet-class>com.lily.dap.web.portlet.dispatcher.Dispatcher</portlet-class>  
  6.   
  7.     <init-param>  
  8.         <name>scripts</name>  
  9.         <value>/scripts/jquery-1.7.1/jquery.min.js /fc/FusionCharts.js /fc/FusionCharts.jqueryplugin.js /scripts/presentation-chart.js</value>  
  10.     </init-param>  
  11.   
  12.     <init-param>  
  13.         <name>styles</name>  
  14.         <value>/styles/report.css</value>  
  15.     </init-param>  
  16.   
  17.     <!-- The view mode namespace. Maps to a namespace in the Struts 2 config file. -->  
  18.     <init-param>  
  19.         <name>viewNamespace</name>  
  20.         <value>/presentation</value>  
  21.     </init-param>  
  22.   
  23.     <!-- The default action to invoke in view mode. -->  
  24.     <init-param>  
  25.         <name>defaultViewAction</name>  
  26.         <value>analysis-presentation</value>  
  27.     </init-param>  
  28.   
  29.     <!-- The edit mode namespace. Maps to a namespace in the Struts 2 config file. -->  
  30.     <init-param>  
  31.         <name>editNamespace</name>  
  32.         <value>/presentation</value>  
  33.     </init-param>  
  34.   
  35.     <!-- The default action to invoke in edit mode. -->  
  36.     <init-param>  
  37.         <name>defaultEditAction</name>  
  38.         <value>analysis-presentation-edit</value>  
  39.     </init-param>  
  40.     ...  
  41. </portlet>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值