springMVC、freemarker页面半自动静态化

2023-11-16

    1,请求.do的URL时直接生成对应的.htm文件,并将请求转发到该htm文件
    2,自由控制某个页面是否需要静态化

 

如果看图不懂的呢,说白了这个中技术就是:java对象+ftl模型=输出html视图

1、在sprinMVC中:MVC框架中的View层组件、Html页面静态化、代码生成工具

2、为什么要用FreeMarker:简单容易学、逻辑分离明确

3、FreeMarker优点:FreeMarker不依赖于Servlet,网络或Web 环境(没一毛钱关系)

maven

复制代码

 1 <dependency>
 2   <groupId>org.freemarker</groupId>
 3   <artifactId>freemarker</artifactId>
 4   <version>2.3.20</version>
 5 </dependency>
 6 <dependency>
 7   <groupId>freemarker</groupId>
 8   <artifactId>freemarker</artifactId>
 9   <version>2.3.8</version>
10 </dependency>
11 <dependency>
12   <groupId>org.springframework</groupId>
13   <artifactId>spring-context-support</artifactId>
14   <version>4.2.4.RELEASE</version>
15 </dependency>

复制代码

 

 

一、web.xml配置(配置大部分都一样)

二、在springMVC文件中配置freemarker视图解析器

 

复制代码

<!--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" value="com.freemarker.Controller.FreeMarkerViewUtil" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
    </bean>
    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
    <!-- Freemarker配置 -->
    <bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/view/" />
        <property name="freemarkerVariables">
            <map>
                <entry key="xml_escape" value-ref="fmXmlEscape" />
            </map>
        </property>
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">1</prop>
                <prop key="default_encoding">UTF-8</prop>
                <prop key="number_format">0.##########</prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="classic_compatible">true</prop>
                <prop key="template_exception_handler">ignore</prop>
            </props>
        </property>
    </bean>

复制代码

 

 

三、建立模型文件(freemarker完全支持el表达式语言)

我的目录是:WebContent/WEB-INF/view/index.ftl,建立一个文件后缀为ftl即可!

复制代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
  <title>演示${title}</title> 
  <meta http-equiv="pragma" content="no-cache"> 
  <meta http-equiv="cache-control" content="no-cache"> 
  <meta http-equiv="expires" content="0"> 
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  <meta http-equiv="description" content="This is my page"> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
  <#list users as user> 
  测试..............username : ${user.username} 
  测试..............password : ${user.password} 
  </#list>

</body> 
</html>

复制代码

 

四、编写视图解析器(FreeMarkerViewUtil.java),继承自org.springframework.web.servlet.view.freemarker.FreeMarkerView在这里对原类进行扩展

 

复制代码

 1 package com.freemarker.Controller;
 2 
 3 import java.io.BufferedWriter;
 4 import java.io.File;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.OutputStreamWriter;
 8 import java.io.Writer;
 9 import java.util.Locale;
10 import java.util.Map;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletResponse;
14 import org.springframework.web.servlet.support.RequestContextUtils;
15 import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
16 import freemarker.template.SimpleHash;
17 import freemarker.template.Template;
18 import freemarker.template.TemplateException;
19 
20 public class FreeMarkerViewUtil extends FreeMarkerView {
21     @Override
22     protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
23             throws Exception {
24         // Expose model to JSP tags (as request attributes).
25         exposeModelAsRequestAttributes(model, request);
26         // Expose all standard FreeMarker hash models.
27         SimpleHash fmModel = buildTemplateModel(model, request, response);
28 
29         if (logger.isDebugEnabled()) {
30             logger.debug("Rendering FreeMarker 模版 [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'");
31         }
32         // Grab the locale-specific version of the template.
33         Locale locale = RequestContextUtils.getLocale(request);
34 
35         /*
36          * 默认生成静态文件,除非在编写ModelAndView时指定CREATE_HTML = false, 这样对静态文件生成的粒度控制更细一点
37          * 例如:ModelAndView mav = new ModelAndView("search");
38          * mav.addObject("CREATE_HTML", false);
39          */
40         if (Boolean.FALSE.equals(model.get("CREATE_HTML"))) {
41             processTemplate(getTemplate(locale), fmModel, response);
42         } else {
43             createHTML(getTemplate(locale), fmModel, request, response);
44         }
45     }
46 
47     public void createHTML(Template template, SimpleHash model, HttpServletRequest request,
48             HttpServletResponse response) throws IOException, TemplateException, ServletException {
49         // 站点根目录的绝对路径
50         String basePath = request.getSession().getServletContext().getRealPath("/");
51         String requestHTML = this.getRequestHTML(request);
52         // 静态页面绝对路径
53         String htmlPath = basePath + requestHTML;
54         System.out.println("静态页面绝对路径===========>>:"+htmlPath);
55         File htmlFile = new File(htmlPath);
56         if (!htmlFile.getParentFile().exists()) {
57             htmlFile.getParentFile().mkdirs();
58         }
59         if (!htmlFile.exists()) {
60             htmlFile.createNewFile();
61         }
62         Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8"));
63         // 处理模版
64         template.process(model, out);
65         out.flush();
66         out.close();
67         /* 将请求转发到生成的htm文件 */
68         request.getRequestDispatcher(requestHTML).forward(request, response);
69     }
70 
71     /**
72      * 计算要生成的静态文件相对路径 因为大家在调试的时候一般在Tomcat的webapps下面新建站点目录的,
73      * 但在实际应用时直接布署到ROOT目录里面,这里要保证路径的一致性。
74      * 
75      * @param request
76      *            HttpServletRequest
77      * @return /目录/*.htm
78      */
79     private String getRequestHTML(HttpServletRequest request) {
80         // web应用名称,部署在ROOT目录时为空
81         String contextPath = request.getContextPath();
82         // web应用/目录/文件.do
83         String requestURI = request.getRequestURI();
84         // basePath里面已经有了web应用名称,所以直接把它replace掉,以免重复
85         requestURI = requestURI.replaceFirst(contextPath, "");
86         // 将.do改为.html,稍后将请求转发到此html文件
87         requestURI = requestURI.substring(0, requestURI.indexOf(".")) + ".html"; 
88         return requestURI;
89     }
90 }

复制代码

 

五、测试类(Controller)

复制代码

 1 package com.freemarker.Controller;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import org.springframework.stereotype.Controller;
 9 import org.springframework.web.bind.annotation.RequestMapping;
10 import org.springframework.web.servlet.ModelAndView;
11 import com.spring.vo.User;
12 
13 @Controller
14 @RequestMapping("/home")
15 public class FreeMarkerController {
16 
17     @RequestMapping("index1")
18     public ModelAndView Add(HttpServletRequest request, HttpServletResponse response) {
19         ModelAndView mav = new ModelAndView("index");
20         User user = new User();
21         user.setUsername("<h2>小明=========================================================></h2>");
22         user.setPassword("<a href='https://www.hao123.com/'>百度</a>");
23         List<User> users = new ArrayList<User>();
24         users.add(user);
25         mav.addObject("users", users);
26         return mav;
27     }
28 
29     @RequestMapping("index2")
30     public ModelAndView index() {
31         ModelAndView mav = new ModelAndView("index");
32         mav.addObject("title", "网站标题");
33         //说明:在这里可以控制不生成静态htm
34         mav.addObject("CREATE_HTML", false);
35         return mav;
36     }
37 }

复制代码

访问http://localhost:1010/springMVC_FreeMarker/home/index1.do,访问index1.do才会生成html文件,生成的html文件是根据@RequestMapping("index1")name决定的.

   如果不需要生成静态化页面

mav.addObject("CREATE_HTML", false);

 

 

文件目录

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springMVC、freemarker页面半自动静态化 的相关文章

随机推荐

  • 动态显示带图片列表【Android】

    一 功能描述 1 动态获取服务器端商品信息显示 2 动态加载服务器端图片显示 二 技术点 ListView BaseAdapter JSON数据解析 Handler Thread HttpUrlConnection AsyncTask Ht
  • unity 字体 素材_教程篇

    Unity异步加载 在使用Unity引擎开发项目时 很多时候需要用到异步加载场景或资源 如需打开一个非常大的场景时需要等待 两个场景之间的一个过渡 游戏关卡的加载等等 通过添加一个进度条的方式可以很好的增强用户体验 并让用户了解场景的加载进
  • 【DevOps】Centos 7.9 安装、部署与使用 k8s集群(v1.21.3)

    卸载 k8s集群 1 平滑移除 Node kubectl get node kubectl cordon node name 不可调度 kubectl drain node name 驱逐资源 kubectl delete node nam
  • 【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片

    基于requests和re模块 爬取百度图片 前言 此篇文章中介绍requests的基本用法 和基于requests和re模块 爬取百度图片的案例 正文 1 requests模块 1 1 requests模块介绍 requests模块 类似
  • 看书标记【统计学习理论与方法】1

    第一章 概率论基础 在R中 分布函数名为func 则形如dfunc的函数就提供了相应的概率分布函数 dfunc x p1 p2 形如pfunc的函数提供了相应的累积分布函数 pfunc q p1 p2 分位数函数 p为由概率构成的向量 qf
  • go 首字母大写,代表对外部可见,首字母小写代表对外部不可见,适用于所有对象,包括函数、方法

    go中根据首字母的大小写来确定可以访问的权限 无论是方法名 常量 变量名还是结构体的名称 如果首字母大写 则可以被其他的包访问 如果首字母小写 则只能在本包中使用 可以粗暴的理解为首字母大写是公有的 首字母小写是私有的
  • yolov5车辆识别、目标检测教程

    车辆识别视频 yolov5车辆识别视频 车牌识别视频 订阅专栏获得源码 我们首先介绍一下最原始的YOLO模型 然后简要介绍一下YOLOv5版本的改进 主要通过具体的例子一起看看怎么把YOLOv5模型用好 YOLOv1的网络结构并没有什么特别
  • Nacos启动出现Error creating bean with name ‘memoryMonitor‘ 、‘externalDumpService‘

    目录 问题 解决方法 这里是CS大白话专场 让枯燥的学习变得有趣 没有对象不要怕 我们new一个出来 每天对ta说不尽情话 好记性不如烂键盘 自己总结不如收藏别人 问题 用KubeSphere创建Nacos时出现Error creating
  • CSAPP Lab5- MallocLab

    实验目标 本实验需要用c语言实现一个动态的存储分配器 也就是你自己版本的malloc free realloc函数 实验步骤 tar xvf malloclab handout tar解压文件 我们需要修改的唯一文件是mm c 包含如下几个
  • 信息收集之 端口扫描

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 网络安全快速入门 为什么要扫描端口 知道主机开放了哪些端口 就可以推断出端口所对应的服务 从而根据
  • 深度学习编译中间件TVM之编译&安装

    参考文档 mxnet官方install手册 TVM 0 4 0官方安装指导手册 LLVM下载地址 Debian Ubuntu Linux下安装LLVM Clang编译器 开发环境介绍 操作系统版本 Ubuntu16 04 LTS 64 bi
  • ElasticSearch学习4--复杂查询

    1 查询分类 查询所有 查询出所有数据 一般测试用 例如 match all 全文检索 full text 查询 利用分词器对用户输入内容分词 然后去倒排索引库中匹配 例如 match query 根据单个字段查询 multi match
  • vue3学习—state的变化和使用

    sate的变化和使用 一 state的变化 1 reactive 1 什么是reactive 2 reactive注意点 2 state的类型 1 setup里面的vuex的使用方式 2 封装获取state方式 二 state使用 1 st
  • 《区块链技术与应用》学习笔记3——BTC共识协议

    1 数字货币中经常出现的问题 双花攻击 1 数字货币本身为带有签名的数据文件 可以进行复制 对于用户来说就可以花两次 2 解决 对货币添加唯一编号 每次支付向货币发行单位查询真伪 3 问题 货币发行单位是一个第三方机构 并且这是一个典型的第
  • el-table page翻页后保留所勾选项。

    项目场景 el table 翻页后保留所勾选项 问题描述 例如 刚开始还在使用原始的方式进行翻页回显 因为翻页之后 点选时selection会出现undefined 所以这里需要进行判断 这里可以通过判断选择selection中有没有row
  • Ubuntu 16.04下编译Caffe-CPU版最可靠完整的版本!!!!(踩了所有的坑,试了几乎所有方法)

    Ubuntu 16 04下编译Caffe CPU版最可靠完整的版本 踩了所有的坑 试了几乎所有方法 Introduction 我踩的坑 各种软件包的版本 GCC版本的确定与调整 一 相关依赖包的安装 二 caffe的下载 三 protobu
  • 文盘Rust -- FFI 浅尝

    rust FFI 是rust与其他语言互调的桥梁 通过FFI rust 可以有效继承 C 语言的历史资产 本期通过几个例子来聊聊rust与C 语言交互的具体步骤 场景一 调用C代码 创建工程 cargo new bin ffi sample
  • 【DFS和BFS习题集+分类总结】(更新至2023.1.1)(17788字)

    目录 第一题 八皇后 dfs 路径输出 前驱版 第一题的补充练习 N皇后 dfs 打表 第二题 自然数的拆分 第三题 图的遍历 BFS和DFS 第四题 fire net dfs 第五题 nightmare 可以走回头路的DFS 第六题 滑雪
  • 【漏洞修复】Diffie-Hellman Key Agreement Protocol 资源管理错误漏洞(CVE-2002-20001)

    CANCANJUN Diffie Hellman Key Agreement Protocol 资源管理错误漏洞 CVE 2002 20001 概述 漏洞名称 Diffie Hellman Key Agreement Protocol 资源
  • springMVC、freemarker页面半自动静态化

    1 请求 do的URL时直接生成对应的 htm文件 并将请求转发到该htm文件 2 自由控制某个页面是否需要静态化 如果看图不懂的呢 说白了这个中技术就是 java对象 ftl模型 输出html视图 1 在sprinMVC中 MVC框架中的