zoukankan      html  css  js  c++  java
  • 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....

  • 相关阅读:
    python调用go
    manjaro安装qt
    Ubuntu16.04 ROS安装kinect2并获取骨骼数据+配置kinect2_tracker_pd很不专业的博客-程序员宅基地
    Kinect XBOX 360和六轴机械臂的实时映射
    KinectV2.0 VS2019配置记录
    (29条消息) windows下用kinect V2 识别人体骨骼_interstellar-ai的博客-CSDN博客
    Baxter实战:Ubuntu16.04+Kinect2实现动作跟随
    Kinect2和六轴机械臂的实时映射(初步)
    CS395-T: Robot Learning from Demonstration and Interaction
    无需公网IP,远程SSH访问Linux服务器!
  • 原文地址:https://www.cnblogs.com/jifsu/p/3522346.html
Copyright © 2011-2022 走看看