一个站点的主页一般不会频繁变动,而大多数用户在訪问站点时不过浏览一下主页(未登陆)。然后就离开了。对于这类訪问请求。假设每次都要通过查询数据库来显示主页的话,显然会给server带来多余的压力。

这时候我们能够将主页静态化。在减轻数据库server压力的同一时候又能大大提高主页高訪问速度。

对于Java来说,如今有非常多框架但是实现主页的静态化。事实上这并不难。我们也能够自己手动实现。

思路例如以下:

首先编写一个小程序模拟浏览器向webserver发送GET请求。得到主页的HTML代码后,将其保存到文件里。

然后写一个过滤器拦截訪问请求。一旦发现訪问的是主页。那么就直接将保存好的静态HTML文件返回给client。这样就避开了框架(如 Spring MVC),更避开了数据库查询。假设主页内容发生了变化,我们能够再执行一下小程序以得到最新的主页HTML代码。

编写HTTPclient程序模拟浏览器

这里我使用 apache 的 HttpClient 库编写这个小程序。例如以下例。我们通过向 http://locahost:8080/codeschool/ 发送GET请求来得到server返回的HTML代码:
/*** 向localhost:8080发送GET请求,获取返回的HTML代码并保存到文件里* @author whf**/
public class Client {public static void main(String[] args) throws Exception {CloseableHttpClient httpclient = HttpClients.createDefault();try {HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/codeschool");CloseableHttpResponse response = httpclient.execute(httpGet);try {System.out.println(response.getStatusLine());HttpEntity entity = response.getEntity();// entity封装了server返回的数据String html =  EntityUtils.toString(entity);// 将HTML代码写入到文件里saveContent(html, "/home/whf/workspace-sts/codeschool/home.html");EntityUtils.consume(entity);} finally {response.close();}} finally {httpclient.close();}}/*** 将HTML写入到指定文件里* * @param html* @param path 文件路径* @throws IOException*/private static void saveContent(String html, String path) throws IOException {FileOutputStream fos = new FileOutputStream(path);BufferedOutputStream bos = new BufferedOutputStream(fos);bos.write(html.getBytes());bos.close();}}

所需的 dependency 例如以下:

<dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.4</version></dependency></dependencies>


运行一下该程序,就会得到 home.html 文件。

编写过滤器

编写一个 url-pattern 为 /* 的 Filter 过滤器,一旦发现用户訪问的是主页,则直接返回上面生成的 home.html 文件,关闭输出流。代码例如以下:
public class SecureFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(SecureFilter.class);private ServletContext ctx;@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 防止中文乱码request.setCharacterEncoding("UTF-8");HttpServletRequest req = (HttpServletRequest) request;String path = req.getRequestURI();// 请求的是资源。跳过if (true == path.startsWith("/codeschool/resources")) {chain.doFilter(request, response);return;}// 用户未登陆// 用户訪问主页// 返回静态页面if (path.equals("/codeschool/") || path.equals("/")) {writeStaticHomePage(req, (HttpServletResponse) response);return;}chain.doFilter(request, response);}/*** 将静态主页返回给client* * @param req* @param resp* @throws IOException*/private void writeStaticHomePage(HttpServletRequest req,HttpServletResponse resp) throws IOException {// 返回静态化页面// 得到home.html路径String pagePath = (String) ctx.getInitParameter("HOME_PAGE_PATH");if (logger.isDebugEnabled()) {logger.debug("主页静态页面路径:{}", pagePath);}// 将homt.html返回给clientServletOutputStream out = resp.getOutputStream();FileInputStream pageInStream = new FileInputStream(pagePath);BufferedInputStream bufInStream = new BufferedInputStream(pageInStream);byte[] buf = new byte[2048];int len = 0;while ((len = bufInStream.read(buf)) != -1) {out.write(buf, 0, len);}bufInStream.close();out.close();}@Overridepublic void init(FilterConfig cfg) throws ServletException {this.ctx = cfg.getServletContext();}}

能够在web.xml里配置 home.html 的路径:
<!-- 静态主页的路径 --><context-param><param-name>HOME_PAGE_PATH</param-name><param-value>/home/whf/workspace-sts/codeschool/home.html</param-value></context-param>

这样在我们在訪问主页的时候就能明显感觉到速度大大加快。

转载于:https://www.cnblogs.com/llguanli/p/6731492.html

「Java Web」主页静态化的实现相关推荐

  1. java web 静态_「Java Web」主页静态化的实现

    一个站点的主页一般不会频繁变动,而大多数用户在訪问站点时不过浏览一下主页(未登陆).然后就离开了.对于这类訪问请求.假设每次都要通过查询数据库来显示主页的话,显然会给server带来多余的压力. 这时 ...

  2. java如何页面全站静态化

    一般新闻发布全站如何静态化,实其具体的方法很多,可以通过freemarker去实现,也可以通过apache配制文件去实现(apache自带有页面静态生成功能,当你配制后第一次访问该页面时就生成了静态文 ...

  3. 「java工程师」常见面试题及其答案(持续更新)

    「高级java工程师」常见面试题及其答案: 「高级java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 面向对象与面向过程的区别? JRE.JDK.JVM的 ...

  4. 怎么通过id渲染页面_「快页面」动态配置化页面渲染器原理介绍

    引言 「快页面」是知乎内部一个快速搭建后台管理页面的平台,使用者仅用半小时即可将一个常规复杂度的后台页面开发完成. 「快页面」平台的基石是它的「渲染器」,一个能将 JSON 配置渲染成页面的 Reac ...

  5. 「Java基础」范型

    范型概述 1 范型是为了解决什么问题? 范型的出现是为了解决安全问题,它限制数据传入的类型,下面举例说明 // Demo1: 不使用范型ArrayList al = new ArrayList(); ...

  6. 开源 java CMS - FreeCMS2.6 静态化管理

    2019独角兽企业重金招聘Python工程师标准>>> java 开源论坛系统http://javabbs.javaz.cn 项目地址:http://www.freeteam.cn/ ...

  7. java使用的页面静态化技术_java秒杀系列(2)- 页面静态化技术

    ###前言 通过代码片段分别介绍服务端渲染.客户端渲染.对象缓存三种方式的写法. 代码片段仅供参考,具体实现需要根据业务场景自行适配,但思想都是一样. 一.服务端渲染方式 ####1.接口返回html ...

  8. 微服务的「扩展立方」与 Docker 化实践

    2019独角兽企业重金招聘Python工程师标准>>> 微服务的扩展立方模型 "扩展立方模型"是指微服务架构的在拆分时包括三个维度,如上图所示,X 轴表示水平副本 ...

  9. html静态化和动态页面,web动态页面静态化,伪静态

    动态页面静态化 首选,我们需要了解两个概念, 静态页面 和 动态页面 静态页面 最早的时候,网站内容是通过在主机空间中放置大量的静态网页实现的 静态网页最大的缺点就是每个人看到的一样的. 以静态网页为 ...

最新文章

  1. 二维矩阵与二维矩阵之间的卷积
  2. getrealdays oracle_oracle 日期函数介绍
  3. ansole终端链接linux,基于Linux系统的智能家居远程控制系统设计论文.doc
  4. go语言的rune类型
  5. C语言 第八章 函数、指针与宏
  6. linux命令基础知识 管道流,linux基础知识-I/O重定向,管道(示例代码)
  7. linux云自动化运维基础知识4(系统结构,vim,管理输入输出,正则表达式)
  8. 金融销售关键在于客户感受
  9. c语言else语句,C# if…else 语句 | 菜鸟教程
  10. 数据库锁机制1------共享锁
  11. Jira和禅道哪个好
  12. 人工智能的必须的数学基础和编程基础
  13. mysql查询第10到第20条记录_“取出数据表中第10条到第20条记录”的sql语句+selecttop用法...
  14. Apache httpd服务器下载及安装
  15. 中兴二面(综合面试及口语测评)
  16. Windows10安装Ubuntu子系统+配置SSH连接+安装xfce4图形界面+配置xrdc远程桌面连接
  17. java Spring IOC
  18. 全民直播凉了,斗鱼、虎牙们会步其后尘吗?
  19. 【Rust 日报】2021-10-24 sea-orm:异步动态 ORM
  20. 统计字符串中每个字符的个数。(原始字符串是:“aabccdeefff”,结果是:a2 b1 c2 d1 e2 f3)

热门文章

  1. visual c++ 部分窗口样式设置
  2. 【Linux独家秘方】Linux 定时备份oracle库的数据
  3. Java开发:什么是序列化?
  4. java 颜色比较_我该如何比较Java中的颜色?
  5. redhat6搭建ftp
  6. 画活动图教程_二次元人物头发怎么画?画好头发有什么技巧?
  7. PageRank行将过时 搜索引擎遭遇范式转移
  8. IJCAI 2019 《GraspSnooker: Automatic Chinese Commentary Generation for Snooker Videos》论文笔记
  9. ICCV 2017 《Illuminating Pedestriant via Simultaneous Detection Segmentation》论文笔记
  10. 滑雪课程设计Ski Course Design