问题描述
在浏览很多论坛或者网站的时候,一般都是大型的门户网站或者论坛.发现都是.html的静态页面.比如: http://www.domain.com/thread-htm-fid-240.html 的形式.我觉得这个肯定是在后台通过程序将JSP页面生成的html页面.我想问的就是这个是如何实现的? 通过什么技术 或者是 什么设计模式 ?这样做的有点和缺点都有哪些?有点我认为可以减少对数据库的操作,增加搜索引擎的抓取几率吧,不知道理解的对不对.在本站和网络上也搜索了不少,但是感觉说的都太模糊了.想请做过这方面的朋友给详细介绍一下.因为本人也是做java开发的,一直都做的是企业的项目开发,没有涉及过这方面的问题. 现在想学习一下.提高竞争力.
解决方案
用Velocity吧 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当 作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。Velocity的Eclipse插件的Update地址是:http://propsorter.sourceforge.net/veloeclipseVelocity 的 JavaDoc: http://www.oschina.net/uploads/doc/velocity-1.5/index.html把页面做成模板生成,速度都很快的,很多大公司(taobao.com)都用这个框架,
解决方案二:
不一定是生成html,也可能是地址栏重写,urlrewrite,可以看下http://wenku.baidu.com/view/f0f89972f242336c1eb95ed7.html不过一般生成静态页面有两种方式,一种就是采用模板,例如freemaker或Velocity,另一种是Mapping方式生成静态页面,给你点代码看看freemaker生成静态页面/** * 生成静态页面主方法 * @param contextServletContext * @param data一个Map的数据结果集 * @param templatePathftl模版路径 * @param targetHtmlPath生成静态页面的路径 */static final String templatePath = "/WEB-INF/freemaker/"; //模板存放的路径//指定ServletContext生成静态页面public static void crateHTML(ServletContext context,Map data,String htmlPath,String filename,String ftlname,String bianma){Configuration freemarkerCfg = new Configuration();// 加载模版freemarkerCfg.setServletContextForTemplateLoading(context, "/");freemarkerCfg.setEncoding(Locale.getDefault(), "UTf-8");try {// 指定模版路径ftlname = templatePath+ftlname;Template template = freemarkerCfg.getTemplate(ftlname,"UTf-8");template.setEncoding("UTf-8");// 静态页面路径htmlPath = context.getRealPath(htmlPath)+"/"+filename;;File htmlFile = new File(htmlPath);Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), bianma)); // 处理模版template.process(data, out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}//Mapping方式生成静态页面public static void createHTML4Mapping(HttpServletRequest request,HttpServletResponse response,String jsp_url,String html_url){FileOutputStream fos = null;try {ServletContext sc = request.getSession().getServletContext();RequestDispatcher rd = sc.getRequestDispatcher(jsp_url);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));HttpServletResponse rep = new HttpServletResponseWrapper(response){public ServletOutputStream getOutputStream(){return stream;}public PrintWriter getWriter(){return pw;}};rd.include(request, rep);pw.flush();fos = new FileOutputStream(html_url);os.writeTo(fos);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
解决方案三:
.html也有可能是动态的。静态化有很多种实现方式。你可以基于模板,自己裸写一样可以实现,原理都差不多。比如一个新闻页面,其它内容来自于数据库,页头页尾等都比较固定,你可以在你的jsp或者ui servlet里头,将整个页面生成一个html文件,最终提供web访问。正如前边的回帖所言,有很多框架可以直接拿来用。不用自己再造轮子。
解决方案四:
地址是看不出静态的.url rewrite广泛使用....----静态化,核心是置标/模板技术.将特定的标记替换成具体的内容...了解一下一般的CMS系统,基本都有类似技术.
解决方案五:
使用FreemarketFreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境 FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库 最重要的是 FreeMarker是免费的