网站的静态页面生成方案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

网站的静态页面生成方案yanrong79@gmail.com提升网站性能的方式有很多,例如有效的使用缓存,生成静态页面等等。今天要说的就是生成静态页面的方式。什么叫生成静态页面呢?很简单,例如我们如果访问一个链接,那么服务器就会解析这个请求,让特定的Action去处理。这其中的缺点是显而易见的:如果访问的人,那么就会加重应用服务器的压力,最恶劣的后果就是应用服务器down掉了。那么如何去避免呢?如果我们把对index.do请求后的结果保存成一个html文件,然后每次用户都去访问,这样应用服务器的压力不就减少了?好吧,我已经学会如何生成静态页面了。打开我的浏览器,输入,然后再使用“另存为”功能保存一个html文件,然后上传到服务器,这样就ok了!我不能说这不是解决方案,但是我可以说这不是好的解决方案。我们需要的是自动的生成静态页面,当用户访问,会自动生成index.html,然后显示给用户。1、基础—URLRewrite什么是URLRewrite呢?请googleit☺。不过这里简单的啰嗦一下。从字面上我们就可以理解它的意思:URL重写。用一个简单的例子来说明问题:输入网址,但是实际上访问的却是,那我们就可以说URL被重写了。这项技术应用广泛,有许多开源的工具可以实现这个功能。2、基础—Servletweb.xml如果你还不知道web.xml中一个请求和一个servlet是如何匹配到一起的,那么请搜索一下servlet的文档。这可不是乱说呀,有很多人就认为/xyz/*.do这样的匹配方式能有效。如果你还不知道怎么编写一个servlet,那么请搜索一下如何编写servlet。这可不是说笑呀,在各种集成工具漫天飞舞的今天,很多人都不会去从零编写一个servlet了。3、谈谈方法好了,现在步入正题。谈谈生成静态页面的方法(还是不要说成“原理”,给人一种很高深的感觉)。方法就是这样:方法1其中,对于URLRewriter的部分,可以使用收费或者开源的工具来实现,如果url不是特别的复杂,可以考虑在servlet中实现,那么就是下面这个样子:处理.action的servlet请求indexURLRewriter请求index.action如果静态页面存在显示静态页面生成静态页面显示静态页面请求index.doStrutsservlet方法2图画的有些乱,不过方法还是非常简单,其中最关键的有2个地方:1是urlrewriter,2是生成静态页面的具体代码。4、从一个简单的方式入手现在我们从一个简单的方式入手来看看怎么生成静态页面。假如现在要显示第一页的商品,那么通常的链接会是这个样子:=1。好,我们说了使用最简单的方式,那么我们就不使用urlrewriter工具了,我们来做一个约定:当我们访问的时候,就是在访问=1。规律就是请求的action,和参数的名称,参数的值,都用下滑线分开,而且请求的网页是.shtm。仅仅有这样的约定还处理.action的servlet请求index.action如果静态页面存在显示静态页面否则生成静态页面显示静态页面URLRewriter请求index.doStrutsservlet不够,我们还得编写一个servlet,去处理.shtm的请求:servletservlet-namehtmlCreator/servlet-nameservlet-classweb.hc.HtmlCreatorServlet/servlet-classload-on-startup2/load-on-startup/servletservlet-mappingservlet-namehtmlCreator/servlet-nameurl-pattern*.shtm/url-pattern/servlet-mapping下面就是servlet的内容了:publicclassHtmlCreatorServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;privateLoggerlogger=Logger.getLogger(HtmlCreatorServlet.class);publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doPost(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//编码方式,可以配置到web.xml里。Stringencoding=“UTF-8”;//得到真实的请求地址StringtemplatePath=simpleURLReWrite(request);StringrealPath=request.getSession().getServletContext().getRealPath(/);//想要生成的静态html文件的名字StringhtmlName=getHtmlFileName(request);//静态html的名字,包含绝对路径StringcachFileName=realPath+File.separator+htmlName;logger.debug(cachFileName=+cachFileName);FilecacheFile=newFile(cachFileName);booleanload=true;//如果静态html存在,就直接显示html,否则,我们就生成它。if(cacheFile.exists()){load=false;}if(load){finalByteArrayOutputStreamos=newByteArrayOutputStream();finalServletOutputStreamstream=newServletOutputStream(){publicvoidwrite(byte[]data,intoffset,intlength){os.write(data,offset,length);}publicvoidwrite(intb)throwsIOException{os.write(b);}};finalPrintWriterpw=newPrintWriter(newOutputStreamWriter(os,encoding));HttpServletResponserep=newHttpServletResponseWrapper(response){publicServletOutputStreamgetOutputStream(){returnstream;}publicPrintWritergetWriter(){returnpw;}};logger.debug(HtmlCreatorServletRequestDispatcher=+templatePath);//使用RequestDispatcher去处理真正的请求。//例如index.shtm,则转发到index.doRequestDispatcherdispatcher=getServletContext().getRequestDispatcher(templatePath);dispatcher.include(request,rep);pw.flush();FileOutputStreamfos=null;try{if(os.size()==0){//如果请求的地址无效,那么就发送一个404错误。response.sendError(HttpServletResponse.SC_NOT_FOUND,);}else{//生成静态文件,并且显示这个静态文件fos=newFileOutputStream(cachFileName);os.writeTo(fos);dispatcher=getServletContext().getRequestDispatcher(/+htmlName);dispatcher.include(request,response);}}finally{if(fos!=null){fos.close();}}}else{RequestDispatcherdispatcher=getServletContext().getRequestDispatcher(/+htmlName);dispatcher.include(request,response);}}//这个方法就是把变成=1protectedStringsimpleURLReWrite(HttpServletRequestrequest)throwsServletException,IOException{Stringuri=request.getRequestURI();StringcontextPath=request.getContextPath();logger.debug(HtmlCreatorcontextPath=+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.length1){for(inti=1;iurls.length;i+=2){if(i==1){uri+=?+urls[i]+=+urls[i+1];}else{uri+=&+urls[i]+=+urls[i+1];}}}logger.debug(HtmlCreatorServletgeturi=+uri);returnuri;}//这个方法就是根据来得到生成的html文件名字,也就是product_pageNumber_1.htmlprivateStringgetHtmlFileName(HttpServletRequestrequest)throwsServletException,IOException{Stringuri=request.getRequestURI();StringcontextPath=request.getContextPath();if(contextPath!=null&&contextPath.length()0)uri=uri.substring(contextPath.length());uri=uri.substring(1,uri.length()-5);uri+=.html;returnuri;}真

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功