网站优化之使用Free marker静态化网站文章页
博客做出来的时候就想要把一些栏目和文章页都静态化处理,当时没啥时间搞,就一直没去弄。但是最近的工作就是做网站,用cms快速搭出了几个网站,cms搭建网站是真的方便啊 如果没有需要二次开发实现的功能,那基本不需要写后端代码的。而且做出来的还不错,怪不得看很多博主都是用cms搭建的博客。 我是用的FreeCMS,展示层就有用Free Marker来做。 然后就参考这个cms的源码 把自己博客的文章页静态化了下。
原文连接:ZJBLOG
静态化主要是为了提高网页打开的速度,然后还有利于SEO,更容易被搜索引擎识别收录,而且比较稳定和安全。
free marker静态化原理是用模板+数据模型=输出html网页。
freemarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)
首先引入jar包
Free marker的jar包和文档
链接:https://pan.baidu.com/s/1GZNvnOT6wbb2S6646c7cSQ 密码:q0af
maven依赖
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
代码
根据模板文件和数据模型创建html的方法
private void createHtml(String templetPath, String siteInfoPath, HashMap<String, Object> map) throws Exception {
// ①创建配置对象(创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。)
Configuration cfg = new Configuration(Configuration.getVersion());// 注意:这里需要传递一个版本
// ②读取模板文件夹
cfg.setDirectoryForTemplateLoading(new File(templetPath));// 设置要加载的模板文件的路径,这里的templetPath就是模板的路径webapp/templet/
// ③设置模板的编码格式
cfg.setDefaultEncoding("UTF-8");
// ④获取模板对象
Template template = cfg.getTemplate("info.html");// info.html是模板名称
// ⑥将模板和数据模型合并 --> 输出模板,生成文件
// 静态页面路径
File htmlFile = new File(siteInfoPath); //siteInfoPath是静态化生成的html存放的路径,webapp/site/info/2019-11-30(文章日期)/文章id.html(根据自己的需要来设置)
if (!htmlFile.getParentFile().exists()) {
htmlFile.getParentFile().mkdirs(); //文章不存在则创建
}
PrintWriter pw = new PrintWriter(htmlFile);
template.process(map, pw);// 合并 map:数据模型 pw:输出流对象 map中存的是模板文件中需要的数据文章列表等,在模板文件中用${..}获取,可参考free marker文档
pw.close();// 关闭流
}
静态化文章页的方法
/**
* 静态化文章页
*
* @param articleId
* @throws IOException
*/
@RequestMapping({"/toCrea****"})
public String toCreate****(HttpServletRequest request, Long articleId) throws Exception { LOGGER.info("静态化文章方法开始"); //查询要静态化的文章信息
Article article = new Article();
article.setArticleId(articleId);
Article articleDetail = articleService.selectByKeyWords(article);
//文章发布的时间,用于将静态化的文章网页放在对应时间的文件夹中
String articleTime = Tools.getStrDateTime(articleDetail.getCreationtime(), "yyyy-MM-dd"); // 给文章添加访问路径(发布一篇文章后静态化该文章,静态化时将该文章的静态化后路径添加至数据库)
String pageUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/site/info" + articleId + ".html";
articleDetail.setPageUrl(pageUrl);
articleService.upArticle(articleDetail); // 创建数据模型(这里使用map类型) --[数据模型可以是List、Map对象 注意:Map类型的key必须是String类型]
HashMap<String, Object> map = new HashMap<>();
map.put("contextPathNo", request.getSession().getServletContext().getContextPath());// 项目名称,用于生成后html页面的静态资源调用css,img等
// 文章信息
......//其他信息代码省略。。。 map.put("info", articleDetail);
...... //模板所在的路径
String templetPath = request.getSession().getServletContext().getRealPath("/templet");
//静态化生成的html路径
String siteInfoPath = request.getSession().getServletContext()
.getRealPath("/site/info/" + articleTime + "/" + articleId + ".html"); createHtml(templetPath, siteInfoPath, map); return "success";
}
模板文件info.html(省略了很多代码,仅作为示例)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>${info.articleTitle }</title>
<link href="${contextPathNo}/css/details.css" rel="stylesheet">
<script src="${contextPathNo}/js/jquery-1.7.2.min.js"></script>
</head>
<body>
<!-- 文章信息 -->
<h2 class="c_titile" style="font:'宋体', Arial, Helvetica, sans-serif;color: #756F71">${info.articleTitle}</h2>
<p class="box_c" style="font: 12px '宋体', Arial, Helvetica, sans-serif;color: #756F71">
<span class="d_time">发布时间:${info.creationtime?string('yyyy-MM-dd hh:mm') }</span> <!-- ?string将date类型时间转为字符串显示--> <span>编辑:${info.articleAuthor}</span>
阅读:<span id='ajaxInfoClickSpan'><img src='${contextPathNo}/images/ajax-loader.gif'/></span><!-- 文章点击量 需要动态展示 -->
<input type="hidden" value="${info.articleId?c}" id="articleIdinit"><!-- ?c将long类型文章id正常显示,不加?c会被,分割--> </p>
<ul class="infos">${info.articleDetail }
</ul> <!-- 其他的例如文章列表、判断等 --> <#if (info.parent==333)> <a class="n2" href="${contextPathNo}/toSharesss">程序人生</a> </#if>
<!-- 非空判断 frm没有null-->
<#if upArticle??>
<p>
上一篇:<a href="${contextPathNo}/toDetail}">${upArticle.articleTitle}</a>
</p>
</#if>
<!-- 遍历列表,if else 。获取长度需要?使用.没用-->
<ul class="rank">
<#list newTimeArticleList as newList>
<#if (newList.articleTitle?length>16)>
<li><a href="${contextPathNo}/toDetail"
title="${newList.articleTitle }" target="_blank">${newList.articleTitle?substring(0,16)}...</a></li>
<#else>
<li><a href="${contextPathNo}/toDetail"
title="${newList.articleTitle }" target="_blank">${newList.articleTitle}</a></li>
</#if>
</#list>
</ul> <!-- 大概的模板,更多的内容参考文档-->
</body> </html>
这样就能根据模板来生成一个html静态网页了。
需要注意的是,有些动态展示的内容 是不能直接静态化的,比如 文章的点击数和 右侧的最热文章,最新文章,底部的上一篇下一篇等。。。
暂时没有的解决方式 我就用了ajax来加载的。。
网站优化之使用Free marker静态化网站文章页的更多相关文章
- java自适应响应式 企业网站源码 SSM freemaker生成静态化 手机 平板 PC springmvc
java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持两套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用 ...
- 为什么网站URL需要设置为静态化
http://www.wocaoseo.com/thread-95-1-1.html 为什么网站URL需要静态化?网站url静态化的好处是什么?现在很多网站的链接都是静态规的链接,但是网站 ...
- PHP静态化
一.判断大型网站的标准 1.pv值(page views)网站浏览量: 概念:一个网站,所有的页面,在一天24小时内,被访问的总量,达到千万级别,或者几百万以上. 2.uv值(unique visit ...
- 网站优化不等于搜索引擎优化SEO
对于SEO相信搞网络营销的人基本上都知道这个名词,英文全称为search engine optimization,中文一般叫搜索引擎优化,也有的叫搜索引擎定位(Search Engine Positi ...
- PHP实现HTML页面静态化
随着网站的内容的增多和用户访问量的增多,无可避免的是网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,我们往往需要在此时对我们的网站进行代码优化和服务器配置的优化.一般情况下会从以下方面 ...
- ThinkPHP5中如何实现模板完全静态化
模板完全静态化,也就是通过模板完全生成纯静态的网页,相比动态页面和伪静态页面更安全更利于SEO访问更快.相比前二者各有利弊吧,现在稍微对这三种形式的优缺点对比一下,以及在ThinkPHP5项目中实现完 ...
- PHP 实现页面静态化
PHP文件执行阶段:语法分析->编译->运行 静态html文件执行顺序:运行 动态程序: 连接数据库服务器或者缓存服务器->获取数据->填充到模板->呈现给用户 关于优化 ...
- Thymeleaf实现页面静态化
如果用户所有的请求,都需要Thyleaf渲染后直接返回给用户,后台就存在大量的查询操作,数据库的压力就会骤然上升,请求的时间就会延长,带来极不好用户体验,现在市面上流行的就是页面的静态化处理,下面就来 ...
- SpringBoot2 整合FreeMarker模板,完成页面静态化处理
本文源码:GitHub·点这里 || GitEE·点这里 一.页面静态化 1.动静态页面 静态页面 即静态网页,指已经装载好内容HTML页面,无需经过请求服务器数据和编译过程,直接加载到客户浏览器上显 ...
随机推荐
- 模块基础 day15
目录 模块的四种形式 内置模块 pip安装的模块 自定义模块 包(模块) import和from···import 循环导入 模块的搜索路径 python文件的两种用途 模块的四种形式 模块就是一系列 ...
- Java中的substring()用法
String str = "Hello Java World!"; Method1: substring(int beginIndex) 返回从起始位置(beginIndex)至 ...
- .NET项目中实现多工程文件共用的方法
一处开发,多处同步编辑使用,并且发布时各个项目均可独立 一.直接编辑项目工程文件 .csproj 具体实现为:编辑 .csproj 文件,在<ItemGroup>中添加新的 <Con ...
- linux sudo root 权限绕过漏洞(CVE-2019-14287)
0x01 逛圈子社区论坛 看到了 linux sudo root 权限绕过漏洞(CVE-2019-14287) 跟着复现下 综合来说 这个漏洞作用不大 需要以下几个前提条件 1.知道当前普通用户的密 ...
- Git学习以及使用
最近学习了下git的使用,不得不感叹真的是甩了svn几条街 官网下载实在太慢,附加一个网站方便大家下载https://github.com/waylau/git-for-win 安装好后打开Git B ...
- LVS DR模式实践
client:192.168.4.10/24 proxy:192.168.4.5/24 VIP: 192.168.4.15/24 web1:192.168.4.100/24 VIP:192.168 ...
- TCP/IP协议第一卷第一章
1.链路层 链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.把链路层地址和网络层地址联系起来 ...
- NOIP模拟 26
我辛辛苦苦敲了3.5h的码 得分和一份8B的码一样多 自闭555. T1 marshland 最小费用可行流, 板子不会,建图更不会. 当然是用暴搜得到0分的好成绩啦 补了补板子. %了%RNB. 学 ...
- Java操作数栈
- 与局部变量表一样,均以字长为单位的数组.不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问.操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区.- 存储的数据与局部变量表一致含in ...
- Vue基础系列(二)——Vue中的methods属性
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家指出. 作者简介: 一个不知名的前端开发 ...