前提:
網頁編程中,我的思路是,通用的模塊不僅僅只有后台代碼,前端頁面也可以獨立為模塊. 這個和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.但是我確實需要用到他
- <bean id="freemarkerConfig"
- 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....