青海公司网站建设哪家快,音乐网站建设费用,网站框架,互联网行业介绍全站静态化
在大型网站中#xff0c;比如主流电商商品页#xff0c;访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢#xff1f;其实把页面静态化#xff0c;好处有很多。例如#xff1a;访问速度快#xff0c;更有利于搜索引擎收录等。
目前主流的静态化…全站静态化
在大型网站中比如主流电商商品页访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢其实把页面静态化好处有很多。例如访问速度快更有利于搜索引擎收录等。
目前主流的静态化主要有两种
1、纯静态方式将动态页面抓取并保存为静态页面页面实际存在于服务器的硬盘中。2、伪静态方式通过WEB服务器的 URL Rewrite 把外部请求的静态地址转化为实际的动态页面地址页面本质上是动态页面静态页面是不存在的。
这两种方法都达到了实现URL静态化的效果但是也各有各自的特点。
优缺点对比
对比项动态伪静态纯静态网站打开速度中等中等快无DB查询、CPU计算消耗搜索引擎抓取和索引不利有利有利速度快权重高安全性低低高不适用程序、DB攻击目标少稳定性低低高不受程序、DB故障影响硬盘容量低低高静态化网页文件需要存储在硬盘中服务器压力高高低无DB查询、CPU计算消耗实时性高高低数据变更后需要手动触发静态化静态化难度随网站复杂度提升而提升
Freemarker实现Html全站静态化
1、引入maven依赖 dependency
groupIdorg.freemarker/groupId
artifactIdfreemarker/artifactId
version{最新稳定版}/version
/dependency
2、freemarker工具类
1、配置FreeMarkerConfigurer推荐托管在Spring容器和复用SpringMVC同一套配置
bean idfreemarkerConfig classorg.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer
property namefreemarkerSettings
bean classorg.springframework.beans.factory.config.PropertiesFactoryBean
property namelocation valueclasspath:freemarker.properties /
/bean
/property
property nametemplateLoaderPath value/WEB-INF/template/ /
property namefreemarkerVariables
bean
classorg.springframework.beans.factory.config.PropertiesFactoryBean
property namelocation valueclasspath:freemarker.variables.properties /
/bean
/property
/bean
2、引入HtmlTemplateUtil.java文件
package com.xxl.util.core.util;import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateHashModel;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;import java.io.*;
import java.util.Map;/**
* HTML模板.Util
*
* 功能简介
* 1、根据Ftl生成Html字符串
* 2、根据Ftl生成Html文件网站静态化
* 3、Ftl支持使用静态类方法
*
* author xuxueli
*/
public class HtmlTemplateUtil {private static FreeMarkerConfigurer freemarkerConfig;public static FreeMarkerConfigurer loadConfig(){
if (freemarkerConfig null) {
freemarkerConfig (FreeMarkerConfigurer) SpringContentAwareUtil.getBeanByName(freemarkerConfig);
}
return freemarkerConfig;
}/**
* generate static model
* param packageName
* return
*/
public static TemplateHashModel generateStaticModel(String packageName) {
try {
BeansWrapper wrapper BeansWrapper.getDefaultInstance();
TemplateHashModel staticModels wrapper.getStaticModels();
TemplateHashModel fileStatics (TemplateHashModel) staticModels.get(packageName);
return fileStatics;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}/**
* 生成HTML字符串
*
* param content : 页面传参
* param templateName : 模板名称路径,相对于模板目录
*/
public static String generateString(Map?, ? content, String templateName) {
String htmlText ;
try {
// 通过指定模板名获取FreeMarker模板实例
Template tpl loadConfig().getConfiguration().getTemplate(templateName);
htmlText FreeMarkerTemplateUtils.processTemplateIntoString(tpl, content);
} catch (Exception e) {
e.printStackTrace();
}
return htmlText;
}/**
* 生成HTML文件
*
* param content : 页面传参
* param templatePathName : 模板名称路径,相对于模板目录
* param filePathName : 文件名称路径,相对于项目跟目录
* DEMO:HtmlTemplateUtil.generate(freemarkerConfig, new HashMapString, Object(), net/index.ftl, /index.html);
*/
public static void generateFile(Map?, ? content, String templatePathName, String filePathName) {
Writer out null;
try {
// mkdirs
File htmlFile new File(WebPathUtil.webPath() filePathName);
if (!htmlFile.getParentFile().exists()) {
htmlFile.getParentFile().mkdirs();
}
// process
Template template loadConfig().getConfiguration().getTemplate(templatePathName);
out new OutputStreamWriter(new FileOutputStream(WebPathUtil.webPath() filePathName), UTF-8);
template.process(content, out);
out.flush();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
if (out ! null) {
try {
out.close();
out null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}public static void main(String[] args) {
String temp generateString(null, hello.ftl);
System.out.println(temp);/*// generate String
MapString, Object params new HashMapString, Object();
params.put(WebPathUtil, HtmlTemplateUtil.generateStaticModel(WebPathUtil.class.getName()));String result HtmlTemplateUtil.generateString(params, freemarker-test.ftl);// generate Html File
HtmlTemplateUtil.generateFile(params, freemarker-test.ftl, freemarker-test.html);*/
}} 要点
1、“freemarkerConfig”中的配置“templateLoaderPath”为include新ftl文件时的根目录“/”位置省去了繁琐的相对路径配置相当方便
2、“freemarkerConfig”必须放在spring中springMVC和静态化UTIL公用因为web.xml加载顺序为web.xml加载顺序listenerspring - filter - servletspringMVC因此如果放在springMVC中Service中注入不了该config静态化UTIL注入时还未初始化bean会报错 3、freemarker静态化-单页面 public static void main(String[] args) {
String temp generateString(null, hello.ftl);
System.out.println(temp);/*// generate String
MapString, Object params new HashMapString, Object();
params.put(WebPathUtil, HtmlTemplateUtil.generateStaticModel(WebPathUtil.class.getName())); // 可以在Ftl中使用静态工具类 ${WebPathUtil.webPath()}String result HtmlTemplateUtil.generateString(params, freemarker-test.ftl);// generate Html File
HtmlTemplateUtil.generateFile(params, freemarker-test.ftl, freemarker-test.html);*/
}
4、freemarker静态化-分页
1、分页代码HtmlGenerateServiceImpl.java
// 调用处一面墙,html分页
ListWallInfo wallInfoList wallInfoDao.getPageList(0, 10000);
generateHtmlPagination(wallInfoList, null, 20, net/wall/index.ftl, wall/, index);/**
* html分页工具
* param allList : html分页列表
* param pagesize : 每页显示记录数量
* param templatePathName : 模板页面,完整地址 (相相对于freeamrker配置根目录)
* param filePath : html文件,路径目录 --/-/
* param index : html文件,默认前缀 index
*/
private void generateHtmlPagination(List? allList, MapString, Object paramMap,int pagesize, String templatePathName , String filePath , String index){
int allCount allList!null?allList.size():0;MapString, Object params new HashMapString, Object();
params.put(pageNumAll, 1);
params.put(pageNum, 1);
params.put(filePath, filePath);
params.put(index, index);if (MapUtils.isNotEmpty(paramMap)) {
params.putAll(paramMap);
}if (allCount 0) {
int pageNumAll allCount%pagesize0 ? allCount/pagesize : allCount/pagesize 1;
for (int pageNum 1; pageNum pageNumAll; pageNum) {
params.put(pageNumAll, pageNumAll);
params.put(pageNum, pageNum);int from (pageNum-1)*pagesize;
int to (from pagesize) allCount ? (from pagesize) : allCount;
params.put(pageList, allList.subList(from, to));String fileName (pageNum1) ? index : (index _ pageNum);
HtmlTemplateUtil.generate(params, templatePathName, filePath fileName .html);
}
} else {
HtmlTemplateUtil.generate(params, templatePathName, filePath index .html);
}
} 2、分页模板index.ftl #list pageList as item
div classwell text-justify${item.content}/div
/#list!--html分页--
#import /net/common/common.html.pagination.ftl as pagination
pagination.htmlPaging pageNumAllpageNumAll pageNumpageNum html_base_urlbase_urlfilePath indexindex /
3、分页模板公共分页标签common.html.pagination.ftl
#--
html分页模板,文件名称
------------------
pageNum : 当前页数、(1-max)
html_base_url : html文件路径、
--
#macro htmlPagingName pageNum html_base_url index
#if pageNum 1 ${html_base_url}${index}.html
#else${html_base_url}${index}_${pageNum}.html/#if
/#macro
#--
html分页模板
------------------
pageNumAll : 总页数、
pageNum : 当前页数、
html_base_url : html文件路径、
--
#macro htmlPaging pageNumAll pageNum html_base_url index
ul classpagination
!--pre--
#if pageNum-1 gte 1lia hrefhtmlPagingName pageNumpageNum-1 html_base_urlhtml_base_url indexindex / laquo;/a/li
#elseli classdisabledalaquo;/a/li/#if
!--every pre--
#if pageNum-1 gte 5
lia hrefhtmlPagingName pageNum1 html_base_urlhtml_base_url indexindex / 1/a/li
lia hrefhtmlPagingName pageNum2 html_base_urlhtml_base_url indexindex / 2/a/li
lia.../a/li
lia hrefhtmlPagingName pageNumpageNum-2 html_base_urlhtml_base_url indexindex / ${pageNum-2}/a/li
lia hrefhtmlPagingName pageNumpageNum-1 html_base_urlhtml_base_url indexindex / ${pageNum-1}/a/li
#elseif 1 lte (pageNum-1)
#list 1..(pageNum-1) as item
lia hrefhtmlPagingName pageNumitem html_base_urlhtml_base_url indexindex / ${item}/a/li
/#list
/#if
!--every now--
li classactive a hrefhtmlPagingName pageNumpageNum html_base_urlhtml_base_url indexindex / ${pageNum}/a/li
!--every next--
#if pageNumAll-pageNum gte 5
lia hrefhtmlPagingName pageNumpageNum1 html_base_urlhtml_base_url indexindex / ${pageNum1}/a/li
lia hrefhtmlPagingName pageNumpageNum2 html_base_urlhtml_base_url indexindex / ${pageNum2}/a/li
lia.../a/li
lia hrefhtmlPagingName pageNumpageNumAll-1 html_base_urlhtml_base_url indexindex / ${pageNumAll-1}/a/li
lia hrefhtmlPagingName pageNumpageNumAll html_base_urlhtml_base_url indexindex / ${pageNumAll}/a/li
#elseif (pageNum1) lte pageNumAll
#list (pageNum1)..pageNumAll as item
lia hrefhtmlPagingName pageNumitem html_base_urlhtml_base_url indexindex / ${item}/a/li
/#list
/#if
!--next--
#if pageNum1 lte pageNumAlllia hrefhtmlPagingName pageNumpageNum1 html_base_urlhtml_base_url indexindex / raquo;/a/li
#elseli classdisabledaraquo;/a/li/#if
/ul
/#macro 补充freemarker动态分页
1、动态分页对象Pager.java
package com.xxl.core.model.vo;import java.io.Serializable;
import java.util.List;SuppressWarnings(serial)
public class PagerT implements Serializable{private int page; // 入参-第N页
private int pagesize; // 入参-每页长度
SuppressWarnings(unused)
private int offset; // 起始行号【return this.page-10 ? 0 : (this.page-1)*this.rows;】
private ListT data; // 查询-分页数据
private int total; // 查询-总记录数
SuppressWarnings(unused)
private int totalPage; // 查询-总页数【return (total pagesize - 1)/pagesize;】public Pager(int page, int pagesize){
this.page page;
this.pagesize pagesize;
}public int getPage() {
return page;
}
public void setPage(int page) {
this.page page;
}
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize pagesize;
}
public int getOffset() {
return this.page-10 ? 0 : (this.page-1)*this.pagesize;
}
public void setOffset(int offset) {
this.offset offset;
}
public ListT getData() {
return data;
}
public void setData(ListT data) {
this.data data;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total total;
}
public int getTotalPage() {
return (total pagesize - 1)/pagesize;
}
public void setTotalPage(int totalPage) {
this.totalPage totalPage;
}} 2、后端分页代码 // Controller层代码
RequestMapping(/orderList)
PermessionType
public String orderList(HttpServletRequest request, Model model,
RequestParam(requiredfalse, defaultValue1)int page,
RequestParam(requiredfalse, defaultValue20)int pagesize){PagerOrderInfo pager new PagerOrderInfo(page, pagesize);
orderService.selectPage(pager, identity);model.addAttribute(pager, pager);
return net/order/orderList;
} // Service层代码
Override
public void selectPage(PagerOrderInfo pager, LoginIdentity identity) {
ListOrderInfo data orderInfoDao.selectPage(pager.getOffset(), pager.getPagesize(), identity.getUserId());
int total orderInfoDao.selectPageCount(pager.getOffset(), pager.getPagesize(), identity.getUserId());
pager.setData(data);
pager.setTotal(total);
} 3、前端模板 !-- 分页数据 --
#if pager?exists pager.data?exists
#list pager.data as item
tr
td${item.orderId}/td
td${item.userId}/td
td${item.prodId}/td
td${item.orderTime?string(yyyy-MM-dd)}/td
/tr
/#list
/#if
!-- 分页标签 --
netCommon.pager pagerpager baseUrlbase_urlorder/orderList.do /
4、分页标签公共模板net.common.ftl
#macro pager pager baseUrl
!--pre--
#if pager.page gt 1a href${baseUrl}?page${pager.page - 1} 上页/a
#else上页/#if!--every pre--
#if pager.page-1 gte 5
a href${baseUrl}?page1 1/a
a href${baseUrl}?page2 2/a
a.../a
a href${baseUrl}?page${pager.page-2} ${pager.page-2}/a
a href${baseUrl}?page${pager.page-1} ${pager.page-1}/a
#elseif 1 lte (pager.page-1)
#list 1..(pager.page-1) as item
a href${baseUrl}?page${item} ${item}/a
/#list
/#if!--every now--
${pager.page}!--every next--
#if pager.totalPage-pager.page gte 5
a href${baseUrl}?page${pager.page} ${pager.page1}/a
a href${baseUrl}?page${pager.page} ${pager.page2}/a
a.../a
a href${baseUrl}?page${pager.page} ${pager.page-1}/a
a href${baseUrl}?page${pager.page} ${pager.page}/a
#elseif (pager.page1) lte pager.totalPage
#list (pager.page1)..pager.totalPage as item
a href${baseUrl}?page${pager.page} ${item}/a
/#list
/#if!--next--
#if pager.page lt pager.totalPagea href${baseUrl}?page${pager.page1} 下页/a
#else下页/#if
/#macro