描述:本内容主要是讲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. 一、springMVC、freemarker页面半自动静态化

    说明:刚刚接到公司的通知,实现(半自动化),即通过参数控制是否需要静态化页面(哪里我说错了,勿喷!谢谢) 1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件 2,自由控制某 ...

  2. Spring MVC + freemarker实现半自动静态化

    这里对freemarker的代码进行了修改,效果:1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件2,自由控制某个页面是否需要静态化原理:对org.springframe ...

  3. JAVAEE——宜立方商城10:使用freemarker实现网页静态化、ActiveMq同步生成静态网页、Sso单点登录系统分析

    1. 学习计划 1.使用freemarker实现网页静态化 2.ActiveMq同步生成静态网页 2. 网页静态化 可以使用Freemarker实现网页静态化. 2.1. 什么是freemarker ...

  4. FreeMarker实现网页静态化

    1.FreeMarker实现网页静态化. FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servl ...

  5. 【转】使用Freemarker实现网页静态化

    使用Freemarker实现网页静态化 2017年08月20日 20:45:51 阅读数:1981 1.1. 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于 ...

  6. Freemarker 之 Java静态化 实例一

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

  7. SpringBoot 常用配置 静态资源访问配置/内置tomcat虚拟文件映射路径

    Springboot 再模板引擎中引入Js等文件,出现服务器拒绝访问的错误,需要配置过滤器 静态资源访问配置 @Configuration @EnableWebMvc public class Sta ...

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

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

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

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

随机推荐

  1. Android WebRTC 音视频开发总结(二)-- webrtcdemo介绍

    这节主要介绍WebRTCDemo的结构,以此来简单了解WebRTC的调用流程,转载请说明出处(博客园RTC.Blacker) 1.先看WebRTCDemo的代码结构,如下图: 2.WebRTCDemo ...

  2. 【风马一族_mysql】MySQL免安装版环境配置图文教程

    mysql存放在某一个磁盘中(笔者使用E盘) 配置系统变量 打开 电脑的属性 点击 高级系统设置 选择 高级 点击 环境变量 选择 系统变量 点击 变量Path,追加 值 E:\mysql-5.6.2 ...

  3. C puzzles详解【16-20题】

    第十六题 The following is a small C program split across files. What do you expect the output to be, whe ...

  4. kickstart简介 20140707

    kickstart是红帽发行版中的一种安装方式,它通过以配置文件的方式来记录linux系统安装是的各项参数和想要安装的软件.只要配置正确, 整个安装过程中无需人工交互参与,达到无人值守安装的目的,因而 ...

  5. SMTP sendMail 失败解决办法

    If you are seeing messages like this in your message log when running a process through the process ...

  6. 三个有用的SQL辅助工具

    三个有用的SQL辅助工具 编写人:CC阿爸 2015-1-23 工欲善其事必先利其器,今天在这里,我想与大家一起分享三个有用的SQL辅助工具.有兴趣的同学,可以一同探讨与学习一下,否则就略过吧. 相信 ...

  7. Silverlight 独立存储(IsolatedStorageFile)

    1.在Web中添加天气服务引用地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2.在Web中添加Wcf服务接口I ...

  8. LevelDB源码之四LOG文件

    “LOG文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据.因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及 ...

  9. FaceBook微光闪烁---第三方开源--shimmer-android

    Android上的微光闪烁shimmer效果,实现的手段不少,其中比较好的是facebook做的开源库:shimmer-android,其在github上的项目主页是:https://github.c ...

  10. 通过HttpClient方式连接网络

    xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...