描述:本内容主要是讲2个tomcat之间同时共享一个静态话页面,统一入口是springMVC的一个controller,静态化的更新只需要传false、true。把完成的web项目放入a、b服务器Tomca,可同时访问同一个页面。

Tomcat虚拟资源映射

一、tomcat中共享虚拟目录

、在tomcat中server.xml文件中,可配置多个tomcat映射到同一个内存服务磁盘,并共享资源
<Context docBase="C:\springMVCFreeMarker" path="/springMVCFreeMarker" privileged="true"/>

docBase:内存服务磁盘 path文件保存路径

、配置springMVC.xml文件,静态资源,请求则不会进行拦截。
<mvc:resources location="/springMVCFreeMarker/" mapping="/springMVCFreeMarker/**" />

二 、测试

http://localhost:1111/ path名/后面任何文件…

例:http://localhost:1111/springMVCFreeMarker/1.jpg

三、页面静态化的控制需要

场景:
1、不通过静态化,每次都从*.ftl模版中加载,并得到视图(不需要文件加载)。
2、每一的请求都是一个新的html文件。
3、静态化一次,下次静态化手动控制。

Freemarker的半自动静态化

一、视图解析器

 <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
 <property name="suffix" value=".ftl" />
 <property name="contentType" value="text/html; charset=UTF-8"></property>
 <property name="viewClass"alue="com. freemarker. Controller.FreeMarkerViewUtil"/>
 <property name="exposeRequestAttributes" value="true" />
 property name="exposeSessionAttributes" value="true" />
 <property name="exposeSpringMacroHelpers" value="true" />
 </bean>
 1、<!-- 将请求和会话属性作为变量暴露给FreeMarker模板使用。要做到这一点,可以设置exposeRequestAttributes或者exposeSessionAttributes为true -->
 2、<!-- 使用这些宏,必须设置FreeMarkerViewResolver的exposeMacroHelpers属性为true -->  

二、视图模版加载配置

<bean id="fmXmlEscape" class="freemarker. template. utility. XmlEscape" />
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker. FreeMarkerConfigurer">
<! -- ##模版的存放路径:value="/WEB-INF/view/"-->
    <property name="templateLoaderPath" value="/WEB-INF/view/" />
    <property name="freemarkerVariables">
        <map>
            <entry key="xml_escape" value-ref="fmXmlEscape" />
        </map>
    </property>
    <property name="freemarkerSettings">
        <props>
            <! -- ##模板更新事件,设置为1秒,正式环境设置为3600秒 -->
            <prop key="template_update_delay">1</prop>
            <! -- 编码utf8 -->
            <prop key="default_encoding">UTF-8</prop>
            <! -- ##数字显示格式 -->
            <prop key="number_format">0.##########</prop>
            <! -- ##显示日期格式 -->
            <prop key="datetime_format">yyyy-MM-dd HH:mm: ss</prop>
    <! -- ##如果变量为null,转化为空字符串,比如做比较的时候按照空字符串做比较 -->
            <prop key="classic_compatible">true</prop>
            <prop key="template_exception_handler">ignore</prop>
            </props>
        </property>
    </bean>

Maven配置

     <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>
        <dependency>
            <groupId>freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.4. RELEASE</version>
        </dependency>

三、视图工具FreeMarkerViewUtil

注意导包!!!!
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreeMarkerViewUtil extends FreeMarkerView {
    private final static String PATH = "C:\\springMVCFreeMarker";

    @Override
    protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        exposeModelAsRequestAttributes(model, request);
        SimpleHash fmModel = buildTemplateModel(model, request, response);
        if (logger.isDebugEnabled()) {
            logger.debug("Rendering FreeMarker 模版 [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'");
        }
        Locale locale = RequestContextUtils.getLocale(request);
        if (Boolean.TRUE.equals(model.get("CREATE_HTML")) && model.get("RENEW") != null) {
            createHTML(getTemplate(locale), fmModel, request, response,model.get("RENEW").toString());
            System.err.println("1、已经静态化了");
        } else if (Boolean.FALSE.equals(model.get("CREATE_HTML"))) {
            processTemplate(getTemplate(locale), fmModel, response);
            System.err.println("2、不需要静态化");
        } else {
            createHTML(getTemplate(locale), fmModel, request, response,"");
            System.err.println(" 3、请求每次更新");
        }
    }

    public void createHTML(Template template, SimpleHash model, HttpServletRequest request,
            HttpServletResponse response,String o) throws IOException, TemplateException, ServletException {
        String requestHTML = this.getRequestHTML(request);
        String htmlPath = PATH + requestHTML;
        final  String STATICPATH = "http://"+request.getServerName()+":"+request.getServerPort()+"/springMVCFreeMarker";
        Boolean on = UpdateFile(htmlPath,o);
        if (on) {
            File htmlFile = new File(htmlPath);
            if (!htmlFile.getParentFile().exists()) {
                htmlFile.getParentFile().mkdirs();
            }
            if (!htmlFile.exists()) {
                htmlFile.createNewFile();
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
            template.process(model, out);
            out.flush();
            out.close();
            response.sendRedirect(STATICPATH + requestHTML);
            System.err.println("新的生成!");
        } else {
            // request.getRequestDispatcher("../FreeMarker/"+requestHTML).forward(request,response);
            response.sendRedirect(STATICPATH + requestHTML);
            System.err.println("不需要静态化!");
        }

    }

    /**
     * 计算要生成的静态文件相对路径 因为大家在调试的时候一般在Tomcat的webapps下面新建站点目录的,
     * 但在实际应用时直接布署到ROOT目录里面,这里要保证路径的一致性。
     *
     * @param request
     *            HttpServletRequest
     * @return /目录/*.htm
     */
    private String getRequestHTML(HttpServletRequest request) {
        String contextPath = request.getContextPath();
        String requestURI = request.getRequestURI();
        requestURI = requestURI.replaceFirst(contextPath, "");
        requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".html";
        return requestURI;
    }

    /**
     * 传入xxx重新生成:
     *
     * @param filePath
     * @param updateTime
     * @return
     */
    private boolean UpdateFile(String filePath,String onRENEW) {
        File dest = new File(filePath);
        //dest.exists()&& dest.lastModified() > (System.currentTimeMillis() - updateTime)
        if ((filePath.endsWith(".html") &&onRENEW.equals("RENEW"))||(filePath.endsWith(".html") &&onRENEW.equals(""))) {
            return true;
        } else if (!dest.exists()) {
            return true;
        }
        return false;
    }

}

三、Controller层使用场景

              

编写ftl模版

    说明:Html视图是通过加载ftl模版后得到的:java对象数据+ftl模型=视图view,模版ftl文件一般存放的路径:WebContent/WEB-INF/view/*.ftl

    

二、freemarker.controller半自动静态化+Tomcat虚拟资源映射的更多相关文章

  1. Freemarker 之 Java静态化 实例一

    Freemarker是一种强大的web端模板技术,在当前Web开发中,SEO和客户端浏览速度尤为重要,其中将网页静态化是一个很好的解决方案.下面介绍Java中web开发结合Freemarker来实现静 ...

  2. 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  3. Tomcat 虚拟目录映射

    最近老是被一个旧Ant工程所困扰,代码版本都改好了测试也通过了,就是打不了war包,一看build.xml 我的天 各种逆天啊....头大.于是乎想起了最基础的tomcat虚拟目录虽是一个很基础的点, ...

  4. 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)

    Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...

  5. tomcat虚拟目录映射网络共享目录

    <Host name="localhost" debug="0" appBase="webapps" unpackWARs=" ...

  6. 页面静态化技术Freemarker技术的介绍及使用实例.

    一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...

  7. 利用freemarker 静态化网页

    1.介绍-FreeMarker是什么 模板引擎:一种基于模板的.用来生成输出文本的通用工具 基于Java的开发包和类库 2.介绍-FreeMarker能做什么 MVC框架中的View层组件 Html页 ...

  8. 利用FreeMarker静态化网页

    1.介绍-FreeMarker是什么 模板引擎:一种基于模板的.用来生成输出文本的通用工具 基于Java的开发包和类库 2.介绍-FreeMarker能做什么 MVC框架中的View层组件 Html页 ...

  9. 网页静态化技术Freemarker的详细介绍

    网页静态化技术Freemarker 一.Freemarker的基本介绍 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道 ...

随机推荐

  1. ubuntu Chromium 安装 pepperflashplugin

    sudo apt-get update sudo apt-get install chromium-browser sudo apt-get install pepperflashplugin-non ...

  2. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: &#39;utf8&#39; codec can&#39;t decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  3. Google C++单元测试框架GoogleTest---TestFixture使用

    一.测试夹具(Test Fixtures):对多个测试使用相同的数据配置 如果你发现自己写了两个或更多的测试来操作类似的数据,你可以使用测试夹具.它允许您为几个不同的测试重复使用相同的对象配置. 要创 ...

  4. android tab选项卡的使用

    项目做完了,写写博客,在项目中遇到的一些问题,或者是自己觉得很不错的东西.这一篇主要是想和大家分享一下我在项目中封装的一个东西,就是tab选项卡.先看看效果图: 我在网上看了很多有关选项卡的demo, ...

  5. java 读取数据库中表定义

    将数据库中的表信息读取出来 package com.cloud.smartreport.utils; import java.sql.Connection; import java.sql.Datab ...

  6. 【C语言入门教程】4.9 指向指针的指针

    指针变量可以指向另一个指针变量,这种操作并不是将一个指针变量所指向的内存地址传递给另一个指针变量,而是定义一种指向指针类型的指针变量,可将其称为双重指针.双重指针的定义形式为: 数据类型 **变量名: ...

  7. 【转】 HTTP 协议简介

    一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是分层的,从底层至应用层分别为:物理层.链路层.网络层.传输层和应用层,如下图所示: 从 ...

  8. Error : Must specify a primary resource (JAR or python or R file)

    spark-submit 报错:must specify resource 取消关注 | 1 ... 我的submit.sh内容: /bin/spark-submit \ --class abc.pa ...

  9. PHP各种缓存

    缓存类型PHP缓存包括PHP变异缓存和PHP数据缓存两种:PHP编译缓存:        PHP数据缓存:    对数据库数据进行缓存    对PHP模板数据缓存 js数据缓存

  10. Differential Geometry之第二章曲线的局部理论

    第二章.曲线的局部理论 2.1 曲线的概念 关于非正则曲线的讨论: ,这是个非正则点(尖点),且它是非正则曲线. 直观上,间断点,孤立点,结点(交叉点),尖点是非正则点. 有记载说:当同一条曲线用不同 ...