zoukankan      html  css  js  c++  java
  • 二、freemarker.controller半自动静态化+Tomcat虚拟资源映射

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

    Tomcat虚拟资源映射

    一、tomcat中共享虚拟目录

    1、在tomcat中server.xml文件中,可配置多个tomcat映射到同一个内存服务磁盘,并共享资源
    <Context docBase="C:springMVCFreeMarker" path="/springMVCFreeMarker" privileged="true"/>
    
    docBase:内存服务磁盘 path文件保存路径
    
    2、配置springMVC.xml文件,静态资源,请求则不会进行拦截。
    <mvc:resources location="/springMVCFreeMarker/" mapping="/springMVCFreeMarker/**" />

    二 、测试

    http://localhost:1111/ path名/后面任何文件…
    
    例:http://localhost:1111/springMVCFreeMarker/1.jpg

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

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

    Freemarker的半自动静态化

    一、视图解析器

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

        

  • 相关阅读:
    Unity3D游戏高性能战争迷雾系统实现
    Unity3D跨平台动态库编译---记kcp基于CMake的各平台构建实践
    怪异现象:执行静态方法,其类的静态构造函数没有执行
    MVC项目不同域之间的UrlRouting
    Quartz+TopShelf实现Windows服务作业调度
    MongoDB数据仓储
    Redis作为缓存服务器
    SignalR实现在线聊天室功能
    DDD-EF-数据仓储
    领域Command
  • 原文地址:https://www.cnblogs.com/xxt19970908/p/5593988.html
Copyright © 2011-2022 走看看