前提:

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

SpringMVC+Freemarker+JSTL支持的更多相关文章

  1. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)

    什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...

  2. sonne_game网站开发03 spring-mvc+freemarker整合

    今天的任务就是在spring+mybatis+springmvc的基础上,将freemarker整合进来. freemarker是什么? freemarker是一种模板引擎.它的目的是基于模板和数据, ...

  3. springMVC+freemarker中Could not resolve view with name... 问题解决

    用到springMVC+freemarker,自己在做demo过程中报: 严重: Servlet.service() for servlet springmvc threw exception jav ...

  4. IntelliJ IDEA:给web应用提供JSTL支持

    最近在看<Head First Servlet JSP>学习JSP,看到JSTL一章,为了添加JSTL支持折腾了好久. 网上的教程五花八门,而且多数比较旧. 我尝试了各种方法都没有成功,很 ...

  5. SpringMvc跨域支持

    SpringMvc跨域支持 在controller层加上注解@CrossOrigin可以实现跨域 该注解有两个参数 1,origins  : 允许可访问的域列表 2,maxAge:飞行前响应的缓存持续 ...

  6. 给JSP应用提供JSTL支持(IntelliJ IDEA)

    ===========手动分割线===2018-12-26============================================= Maven项目直接添加如下依赖即可: <de ...

  7. spring-mvc+freemarker整合(sonne_game网站开发03)

    今天的任务就是在spring+mybatis+springmvc的基础上,将freemarker整合进来. freemarker是什么? freemarker是一种模板引擎.它的目的是基于模板和数据, ...

  8. IntelliJ IDEA:给 web 应用提供 JSTL 支持

    最近在看<Head First Servlet JSP>学习JSP,看到JSTL一章,为了添加JSTL支持折腾了好久. 网上的教程五花八门,而且多数比较旧. 我尝试了各种方法都没有成功,很 ...

  9. SpringMVC+FreeMarker

    前言: 最近在学习SpringMVC,模板引擎用的是FreeMarker,之前没有接触过.利用SpringMVC开发其实还有许多的步骤,比如控制层,服务层,持久化层,实体等等,先弄了一个小demo来总 ...

随机推荐

  1. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  2. Hibernate部署问题总结

    出现未知实体类(- org.hibernate.MappingException: Unknown entity),找不到cfg.xml包 (org.hibernate.internal.util.c ...

  3. 转——JAVA中calendar,date,string 的相互转换和详细用法

    package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class Ca ...

  4. 《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程

    描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率 ...

  5. python文件操作实例

    把目录 E:\ 下面所有 后缀名为 .py 的 文件复制到 E:\PyLearn #coding:utf-8 import os import shutil def getfile(srcDir,ds ...

  6. FFT的分析以及matlab实验

    FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法. 采样得到的数字信号,做FFT变换,N个采样点,经过FFT之后,就可以得到N个点 ...

  7. ES6学习笔记(2)

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,被称为解构(Destructuring); 数组的解构赋值 let [a, b, c] = [1, 2, 3]; cons ...

  8. JS实现关闭当前子窗口,刷新父窗口

    一.JS实现关闭当前子窗口,刷新父窗口 JS代码如下: <script> function refreshParent() {  window.opener.location.href = ...

  9. Android之全局的dialog的显示

    今天做项目有个需求就是有一个页面需要弹出一个dialog,但是这个dialog不可以影响,这个页面的跳转.这个页面可能跳转也可能不跳转,跳转后,这个dialog,还是显示的, 然而我们平时写的dial ...

  10. java 中 ArrayList LinkedList Vector 三者的异同点

    1.ArrayList和Vector都是基于数组实现的,所以查询速度很快,增加和删除(非最后一个节点)速度慢: Vector是线程安全的,ArrayList不是. 2.LinkedList 是一个双向 ...