生成静态页面的技术是如何实现的

生成静态页面的技术是如何实现的

问题描述:

在浏览很多论坛或者网站的时候,一般都是大型的门户网站或者论坛.发现都是.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/veloeclipse
Velocity 的 JavaDoc: http://www.oschina.net/uploads/doc/velocity-1.5/index.html

把页面做成模板生成,速度都很快的,很多大公司(taobao.com)都用这个框架,

使用Freemarket
FreeMarker允许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是免费的

地址是看不出静态的.url rewrite广泛使用....

静态化,核心是置标/模板技术.将特定的标记替换成具体的内容...了解一下一般的CMS系统,基本都有类似技术.

.html也有可能是动态的。
静态化有很多种实现方式。
你可以基于模板,自己裸写一样可以实现,原理都差不多。
比如一个新闻页面,其它内容来自于数据库,页头页尾等都比较固定,你可以在你的jsp或者ui servlet里头,将整个页面生成一个html文件,最终提供web访问。

正如前边的回帖所言,有很多框架可以直接拿来用。不用自己再造*。

不一定是生成html,也可能是地址栏重写,urlrewrite,可以看下http://wenku.baidu.com/view/f0f89972f242336c1eb95ed7.html
不过一般生成静态页面有两种方式,一种就是采用模板,例如freemaker或Velocity,
另一种是Mapping方式生成静态页面,
给你点代码看看
freemaker生成静态页面
[code="java"]/**
* 生成静态页面主方法
* @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();
}
}[/code]

//Mapping方式生成静态页面
[code="java"] 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 block
        e.printStackTrace();
    } finally{
        try {
            fos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}[/code]