网站的静态页面生成方案 .

news/2024/5/11 15:32:21/文章来源:https://blog.csdn.net/a52071453/article/details/84234773

  提升网站性能的方式有很多,例如有效的使用缓存,生成静态页面等等。今天要说的就是生成静态页面的方式。这个也是我近期一直在搞的一个问题,近期在做使用html + servlet做个人网站,为什么是这2个东西呢?

1、直接用servlet是为了保证网站能以最快的速度执行命令..个人总感觉像Struts hibernate spring之类的虽然方便但是效能带来的损耗不太能接收

2、使用html同样是为了保证最快的反应速度,毕竟html 比jsp少了一层服务器执行.速度上要快的多

一、在这里要先说一下什么是页面静态化:


   简单的说,我们如果访问一个链接 http://abc.com/test.do,服务器对应的模块会处理这个请求,转到对应的jsp界面,最后生成我们想要看到的数据。

    这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了。那么如何去避免呢?如果我们把对 test.do 请求后的结果保存成一个 html 文件,然后每次用户都去访问 http://abc.com/test.html ,这样应用服务器的压力不就减少了?

那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里就牵涉到我们要讲解的内容了,静态页面生成方案... 我们需要的是自动的生成静态页面,当用户访问 http://abc.com/test.do,会自动生成 test.html ,然后显示给用户。


二、下面我们在简单介绍一下要想掌握页面静态化方案应该掌握的知识点

1、 基础— URL Rewrite
  什么是 URL Rewrite 呢 ? URL 重写。用一个简单的例子来说明问题:输入网址http://www.abc.com/test.do ,但是实际上访问的却是 http://www.abc.com/test.action,那我们就可以说 URL 被重写了。这项技术应用广泛,有许多开源的工具可以实现这个功能。

2、 基础— Servlet web.xml
   如果你还不知道 web.xml 中一个请求和一个 servlet 是如何匹配到一起的,那么请搜索一下 servlet 的文档。这可不是乱说呀,有很多人就认为 /xyz/*.do 这样的匹配方式能有效。
如果你还不知道怎么编写一个 servlet ,那么请搜索一下如何编写 servlet。这可不是说笑呀,在各种集成工具漫天飞舞的今天,很多人都不会去从零编写一个 servlet了。

三、基本的方案介绍



其中,对于 URL Rewriter的部分,可以使用收费或者开源的工具来实现,如果 url不是特别的复杂,可以考虑在 servlet 中实现,那么就是下面这个样子:?
?

三、实现一个servlet生成html的基本功能,包含了URL 重定向功能。
现在我们来看看一个普通的url分页请求怎么生成静态页面。

  假如现在要显示第一页的数据信息 ,那么通常的链接会是这个样子 : http://abc.com/xx.do?pageNumber=1 。
我们说一下这个最简单的方式,打个比方:当我们访问 http://abc.com/xx_pageNumber_1.shtml 的时候 ,就是在访问 http://abc.com/xx.do?pageNumber=1 。规律就是请求的 action(动作),和参数的名称,参数的值,都用下滑线分开,而且请求的网页的最终后缀是 .shtm 。然后呢?我们需要编写一个servlet,去处理 .shtm 的请求:

<servlet>
   <servlet-name>creatorHtmlServlet</servlet-name>
   <servlet-class>com.jlins.CreatorHtmlServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>creatorHtmlServlet</servlet-name>
   <url-pattern>*.shtm</url-pattern>
</servlet-mapping>

下面就是 servlet 的内容了:

import javax.servlet.http.*;
import java.io.*;
import org.apache.log4j.*;
import javax.servlet.*;
public class CreatorHtmlServlet extends HttpServlet { private Logger logger=Logger.getLogger(CreatorHtmlServlet.class);  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);  }  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   String encoding = "UTF-8"; //获得请求address String templatePath = URLReWrite(request); //获得相对路径 String realPath= request.getSession().getServletContext().getRealPath("/"); //获得要生成的静态html文件的名字 String htmlName = getHtmlFileName(request); //获得详细路径的 html文件的名字String cachhtmlFileName = realPath + File.separator + htmlName; File cacheFile = new File(cachhtmlFileName); boolean load = true;  //文件存在的话就可以直接返回了,不需要做任何处理 if(cacheFile.exists()) {load = false;  } if(load) {final ByteArrayOutputStream os = new ByteArrayOutputStream(); final ServletOutputStream stream = new ServletOutputStream(){public void write(byte[] data,int offset, int length){os.write(data,   offset,   length); } public void write(int b) throws IOException{ os.write(b);} };  final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, encoding)); HttpServletResponse rep =  new HttpServletResponseWrapper(response){public ServletOutputStream getOutputStream() { return stream; } public PrintWriter getWriter() {  return pw;  } };  logger.debug("HtmlCreatorServlet RequestDispatcher = " + templatePath);  //  使用 RequestDispatcher转发请求,请求真是的地址   //  例如 index.shtm ,则转发到 index.do     RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(templatePath);dispatcher.include(request, rep); pw.flush(); FileOutputStream fos = null; try { if(os.size() == 0) { // 验证一下用户转发的地址是否有效,无效的话就提示错误  response.sendError(HttpServletResponse.SC_NOT_FOUND, ""); }  else { // servlet调用其他命令在相应的目录生成html文件,并且把文件返回给客户端 fos = new FileOutputStream(cachhtmlFileName); os.writeTo(fos); dispatcher = getServletContext(). getRequestDispatcher("/"+htmlName); dispatcher.include(request, response); }  } finally {  if(fos != null) { fos.close(); }  } } else {  RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/"+htmlName);  dispatcher.include(request, response); }  } // 主要的功能就是把http://abc.com/xx_pageNumber_1.shtm // 转换成 http://abc.com/xx.do?pageNumber=1  形式 protected String URLReWrite(HttpServletRequest request) throws ServletException, IOException { String uri = request.getRequestURI();String contextPath = request.getContextPath(); logger.debug("HtmlCreator contextPath = " + contextPath); if (contextPath != null && contextPath.length() > 0) uri = uri.substring(contextPath.length()); uri = uri.substring(0, uri.length()-5); String[] urls = uri.split("_"); uri = urls[0] + ".do"; if(urls.length > 1) {  for(int i = 1; i < urls.length; i += 2) { if(i==1) {uri += "?" + urls[i] + "=" + urls[i+1];} else {  uri += "&" + urls[i] + "=" + urls[i+1]; }  }  }   logger.debug("HtmlCreatorServlet get uri = " + uri); return uri; }  // 主要功能根据 http://abc.com/xx_pageNumber_1.shtm  // 来得到即将要生成的html文件名字,也就是 xx_pageNumber_1.html private String getHtmlFileName(HttpServletRequest request)throws ServletException, IOException{String uri = request.getRequestURI(); String contextPath = request.getContextPath(); if (contextPath != null && contextPath.length() > 0) uri = uri.substring(contextPath.length()); uri = uri.substring(1, uri.length()-5);  uri += ".html"; return uri;    } }

 

上面就是整个代码了,非常的简单吧

我们这章要讨论一下如何让用户遵守访问方式和如何更新生成的html文件

四、如何让用户遵守访问方式
  前面我们已经通过代码讲解,用户访问 xx_pageNumber_1.shtm,那么我们可以直接返回已经存在的html文件给用户,大大的减轻应用服务器的压力。可是如果客户直接访问 xx.do?pageNumber=1 呢?浏览器是客户的,如果他们要想恶意的请求你的网站你是没有办法控制的,难道我们要在页面上告诉访问者“请遵守访问方式,否则您将被如何如何”吗?

  针对上面这种情况,我们需要在 index.do 中做点手脚。简单的说就是在我们自己转发请求的时候设置一个变量告诉被请求的地址我们是合法的,例如:xx.do?pageNumber=1后面追加一个 &my=true,这样的话就可以在被请求的action中检测是否有my这个变量,如果有说明合法,该怎么操作都行,如果没有就是违法的,直接跳转到错误页面。这样就能用最简单的方式控制用户的非法请求了.


接着我们讲解一下如何刷新这些html

  因为是一次性的生成Html,如果对应的数据发生变化,比如update或者delete情况,我们就应该更新相应的html文件,那如何对html文件进行更新呢?

大体上有几个方式

1、最笨的方式,手动刷新.
例如:网站首页,当管理员更新一个功能之后,手动点击后台的一个按钮直接更新对应的html文件

2、定时刷新。
每隔一段指定的时间去更新所有已经存在的html文件,当然前提是你要先验证哪些已经生成了html文件.至于怎么验证?你可以在每生成一个文件的时候往内存的某个list或者某个文件,或者某个表写入当前生成的文件名..

3、智能刷新
先说一下,这个不好做,但是做好了很牛方便。
管理员在后台的每个操作 增删改查,都进行监听,并在操作完成后去验证一下对应的文件是否存在,存在就更新,不存在就不操作. (要想实现这种方式,在进行框架设计的时候就要把这一模块考虑好,让后台的每一步操作都实现一个已经公共的被观察的对象.--可以查考一下观察者模式)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_817652.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给你的网站加上站内搜索---Compass入门教程

给你的网站加上站内搜索---Compass入门教程 syxChina(syxchina.cnblogs.com) Compass(基于Lucene)入门教程 1 序言 2 Compass介绍 3 单独使用Compass 4 springhibernate继承compass 4-1 jar包 4-2 配置文件 4-3 源代码 4-4 说明 4-5 测试 5 总结下吧 1 序言 这些天一直在学点新…

SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎

前两天看到了一个中国新闻网&#xff0c;这个网站的搜索form的action是http://search.chinanews.com/search.do 便知道是struts1的产物&#xff0c;现在都用struts2了&#xff0c;所以给自己的任务是实现Struts2 SSH分页浏览新闻、Lucene分页高亮排序搜索新闻这个两个功能。 ID…

WordPress速度 - 如何使您的WordPress网站加载速度快

WordPress速度 - 如何使您的WordPress网站加载速度快 快速加载网站对于获取和保持稳定的流量非常重要。因此&#xff0c;对于想要发展WP网站&#xff0c;增加流量和增加收入的每个人来说&#xff0c;WordPress的速度都是一个问题。 但是&#xff0c;有几个因素可能会降低WP网站…

h5打开app跳不到指定页面 uni_初学uni-app,把网站变APP

快速入门uni-app&#xff0c;把想看的网站变APP。下载hbuildx&#xff0c;这里官方提供了几种安装包&#xff0c;有完全版&#xff0c;还有beta版&#xff0c;还有标准版&#xff0c;随便下一个吧&#xff0c;或者直接下载标准版的&#xff0c;因为它最小。1.创建uni-app&#…

利用URLOS搭建自己的CDN网站加速节点真是其乐无穷

CDN可以帮助我们提交网站静态内容的访问速度&#xff0c;而且可以针对不同线路进行分配优化&#xff0c;用最适合的网络线路访问我们的网站内容。比如源站地址在东莞&#xff0c;机房线路是电信&#xff0c;远在山西太原的用户网络环境是联通的&#xff0c;访问源站时速度非常慢…

如何找到一个网站(链接域名)的ip地址

用ping查看域名ip地址1. winR打开cmd2. 输入ping空格域名

大数据hadoop之大型互联网电商公司网站日志分析

2019独角兽企业重金招聘Python工程师标准>>> 博主今天分享大型项目的分析demo&#xff0c;下面是假设某个公司的网站项目想要得到活动日、节假日的网站流量分析。此类需求使用hadoop离线平台来分析性价比百分百完美。下面博主直接上教程。。。 操作步骤&#xff1a;…

Java实现广告屏播放切换_使用javascript实现某网站的头部广告向上切换效果

学了javascript后&#xff0c;看到某网站的一个头部广告效果很不错&#xff0c;感觉自己也能做出来&#xff0c;于是经过我一下午的奋斗&#xff0c;哈哈&#xff0c;我成功了&#xff0c;虽然实现可能很麻烦&#xff0c;但没法&#xff0c;如果你理解我的程序&#xff0c;如果…

在线人数实时显示php_PHP+jquery实时显示网站在线人数的方法_PHP教程

本文实例讲述了PHPjquery实时显示网站在线人数的方法。分享给大家供大家参考。具体分析如下&#xff1a;在线人数最简单的就是直接利用js调用php&#xff0c;这样可以显示出有多少人访问了本站&#xff0c;如果要在用户未刷新页面的状态实时显示用户在线人数&#xff0c;我们可…

linux的帮助,帮助信息_Linux公社 - Linux系统门户网站

除Linux公社(LinuxIDC.com)注明之服务条款外&#xff0c;其它因使用Linux公社(LinuxIDC.com)及旗下网站服务而引致之任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其所造成的各种损失(包括因下载而感染电脑病毒)&#xff0c;Linux公社(LinuxIDC.com)概不负责&#xff…

gitbook生成html静态页面,gitbook输出为静态网站

你有两种方式输出一个静态网站&#xff1a;本地预览时自动生成当你在自己的电脑上编辑好图书之后&#xff0c;你可以使用Gitbook的命令行进行本地预览&#xff1a;E:\gitbook\gitbook-studying>gitbook serve ./图书目录这里会启动一个端口为4000用于预览的服务器&#xff1…

网站数据过多卡顿怎么优化_怎么做网站SEO?如何做网站SEO优化?正确的网站SEO优化怎么做?...

怎么做网站SEO?不同的seo从业者有自己的seo方法和程序&#xff0c;也有自己的观点。在靖歌阁看来&#xff0c;他们认为效率是结果的终维度&#xff0c;其他一切都是空谈。在给定的时间内&#xff0c;有多少关键词被排名&#xff0c;有多少在第一页&#xff0c;有多少大的索引词…

网站php上传服务器地址,thinkphp上传服务器地址

thinkphp上传服务器地址 内容精选换一换下载地址: https://github.com/bcgsc/abyss/archive/2.2.4.tar.gz。下载地址: http://downloads.sourceforge.net/project/boost/boost/1.56.0/boost_1_56_0.tar.bz2。下载地址&#xff1a;https://www.bcgsc.ca为了实现通过NAT Server可…

h5页面怎么处理文件流_网站聚合页面是什么、好处及怎么做?重复页怎么处理?...

竞价QQ交流群&#xff1a;482183592信息流QQ交流群&#xff1a;340191802整合营销交流群&#xff1a;543613831聚合页面&#xff0c;很多新人不太懂&#xff0c;所以这篇就来带大家了解一下。1、聚合页面是什么&#xff1f;有哪些形式&#xff1f;2、聚合页面对SEO优化有什么利…

xp服务器下建立web站点,windowsxp系统下配置Web IIS7.0网站的方法

最近&#xff0c;一位windowsxp系统用户反馈自己非常希望能够在电脑中配置Web IIS7.0网站&#xff0c;可是操作了很久都没有成功。这该怎么办呢&#xff1f;接下来&#xff0c;系统城小编就带大家看看配置Web IIS7.0网站的具体方法&#xff0c;希望对大家有帮助&#xff01;具体…

发布网站

引用lubaihua33 的 发布网站在Visual studio2005中建好一个网站项目&#xff0c;项目文件放于桌面。向外发布网站的方法如下&#xff1a; 1&#xff09; 开始—程序—管理工具—Internet信息服务&#xff08;IIS&#xff09;管理器&#xff0c;在弹出的对话框中&#xff1a;选…

Java开发牛人十大必备网站

以下是我收集的Java开发牛人必备的网站。这些网站可以提供信息&#xff0c;以及一些很棒的讲座, 还能解答一般问题、面试问题等。质量是衡量一个网站的关键因素&#xff0c;我个人认为这些网站质量都很好。接下来&#xff0c;我会跟大家分享我是如何使用这些网站学习和娱乐的。…

Python爬虫练习二-定时抓取网站的更新内容

前言&#xff1a; 通过第一阶段的学习&#xff0c;接下来简单的抓取一下网站更新的内容并且以邮件的方式提醒 代码&#xff1a; 一、简单抓取网站以邮件进行通知&#xff1a; 原理&#xff1a; 1、将需要使用的包导入 2、编写邮件发送模板&#xff0c; 3、分析需要抓取…

shell脚本统计网站pv,每分钟/小时/天~

脚本内容如下: #!/bin/bash ####获取输入 read -p "请输入日志名称: " log_name ####将日志进行统计&#xff0c;每秒钟的请求数 cat ./$log_name | cut -d -f4 | uniq -c | sort -n -r -o ./temp_sorted.log ###定义一天的pv&#xff0c;初始值为0 all_pv0 ###循…

java网站源码_六个编程学习网站,拥有了你就无往而不利

其实现在学习编程并没有你想象中的那么难。在互联网发达的今天&#xff0c;网上的学习资料非常多。只要你用心的去找&#xff0c;基本都能够找到你想找到的东西。而在这个时候&#xff0c;掌握几个学习编程的网站就很有必要了&#xff0c;对你的学习绝对会有很多很大的好处。今…