SpringMVC+Freemarker+JSTL支持


前提:

   網頁編程中,我的思路是,通用的模塊不僅僅只有后台代碼,前端頁面也可以獨立為模塊. 這個和asp.net中的UserController很像

   比如有個人員基本信息的展示界面,需要在多個界面中嵌入,都重新來寫一遍肯定不合適.

   那么衍生到: 我的字典模塊,枚舉類型的讀取,展示為下拉框,地址選擇控件等....

   在用Jsp的時候,jsp:include 或者引入jstl 直接c:import 都可以,而且支持傳參

     在用struts2 的時候,s:action executeResult="true" 也是個不錯的選擇.

   換到springmvc了,雖然他貌似也有spring:import (猜的,我不太喜歡用框架自帶標簽)....

問題來了,我從jsp到struts2再到springMVC,需要學習struts2的標簽,然后換到spring的標簽么? 個人認為不需要. 因為我從接觸jstl后,接觸到的javaEE所有的環境,都能用jstl,我為什么要學那么多隨時可能淘汰的標簽.而且寫的代碼生成工具,每次都因為要換框架,要對其中的一些代碼進行擴展重構,代碼冗余太多. 那么我想把標簽庫統一.減少學習難度

SpringMVC +freemarker+Sitemesh的配置網上太多了. 而在探討freemarker中加入jstl支持這個問題,大多數人認為freemarker本身就是標記語言,不需要再加入jstl.(我在想說這個的人是不是把jstl和el表達式搞混了).

 

 freemarker引入jstl

  傳統方式:

  在每個模版頁面增加 : <#assign c=JspTaglibs["http://java.sun.com/jstl/core_rt"]>

  然后在模版中就可以使用(注意,不可以在一個header中引入,其他頁面包含,這樣不生效,需要每個模版頁面都寫):

  <@c.import url="someurl" /> 這樣的方式進行頁面的引入了

  ############ 要說實現功能,上面已經達到目的了.不過我不喜歡,程序員開發中,還需要關心這些和業務無關的標簽是不是引入了.頁面也不干凈

  我的方式:

    1.  把網上那些傳統的freemarker配置,從springmvc的 servlet-config.xml 中移動到非springMVC配置文件中

      怎么配置的,找了一家博客  看看配置. 注意: 他里面的一句話 spring的配置文件applicationContext.xml中加入以下配置

                這個配置一定要在applicationContext*.xml , 不能在 mvc的配置文件中. 因為我在實際的操作中,通過Spring的ApplicationContext中,沒有找到這個bean.但是我確實需要用到他

    1. <bean id="freemarkerConfig"  
    2.         class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"

    2. 重寫Spring的 ContextLoaderListener ,並把新的類型配置到web.xml

      

public class ServletContextInitListener extends ContextLoaderListener { 
    @Override
    public void contextInitialized(ServletContextEvent event) { 
        super.contextInitialized(event);  //先運行,讓spring初始化
        initFreemarkerJSTLTaglibFactory(event.getServletContext());
    } 
    private void initFreemarkerJSTLTaglibFactory(ServletContext context){
        try {
      //SpringUtils 網上太多了,隨便拷貝一個 FreeMarkerConfigurer config
=SpringUtils.getBean(FreeMarkerConfigurer.class); TaglibFactory taglibFactory = config.getTaglibFactory(); context.setAttribute("c", taglibFactory.get("/WEB-INF/tlds/c.tld")); //讀取taglib,並放到 application 中 context.setAttribute("fn", taglibFactory.get("/WEB-INF/tlds/fn.tld")); System.out.println("初始化jstl庫"); } catch (Exception e) { e.printStackTrace(); } } }

這樣,系統運行后,模版頁面不需要做任何事情,可以直接使用 <@c.import /> 等所有c和fn標簽的功能了,代價就是 占用全局變量 c 和 fn.

 

這個方式和我在Struts2+freemarker中處理struts2的s標簽類似,只不過Struts2中,我把這個在攔截器里面,每次壓入ActionContext ,但是讀取tld還是在listener中,一開始讀取也放到攔截器,並且沒有緩存,造成整個網站響應都很慢,原因就是每次都去讀取tld....

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM