博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC+Freemarker+JSTL支持
阅读量:5230 次
发布时间:2019-06-14

本文共 2521 字,大约阅读时间需要 8 分钟。

前提:

   网页编程中,我的思路是,通用的模块不仅仅只有后台代码,前端页面也可以独立为模块. 这个和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....

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/jifsu/p/3522346.html

你可能感兴趣的文章
721. Accounts Merge
查看>>
OpenCv-Python 图像处理基本操作
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
团队的绩效评估计划
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
Python 面向对象(其四)
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
shell脚本图书
查看>>