jsp转换成html
相信很多⼈都希望⾃⼰的页⾯越快越好,最好是能静态的,提⾼客户访问速度。也便于搜索引擎搜索。所以,就希望我们的动态读取数据库的页⾯,尽可能的⽣成静态页⾯。⼀下系列⽂章,介绍⼀下个⼈的解决⽅案。
本系列将介绍个⼈的⼀种⽅法,在不改变原来jsp⽂件的基础上,只需要加⼊少量的代码,就让你的新闻发布系统,很容易就完全变成静态的页⾯。
本⽂假设你是⽤java 开发的web动态页⾯。
第⼀步,加⼊servlet.代码如下。
public class ToHtml extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = "";
String name = "";
ServletContext sc = getServletContext();
String file_name = Parameter("file_name");// 你要访问的jsp⽂件名,如index,不包括扩展名
// 则你访问这个servlet时加参数.如localhost/test/toHtml?file_name=index
url = "/" + file_name + ".jsf";// 你要⽣成的页⾯的⽂件名。我的扩展名为jsf .
name = ConfConstants.CONTEXT_PATH+"\\"+ file_name + ".htm";// 这是⽣成的html⽂件名,如index.htm.⽂件名字与源⽂件名相同。扩展名为htm
//ConfConstants.CONTEXT_PATH为你的应⽤的上下⽂路径。
RequestDispatcher rd = sc.getRequestDispatcher(url);
final ByteArrayOutputStream ōs = 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();
FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = Writer();
out
.print("<p align=center><font size=3 color=red>页⾯已经成功⽣成!single<br>/space/? 233</font></p>");
}
}
第⼆步、配置你的l
<servlet>
<servlet-name>toHtml</servlet-name>
<servlet-class>mj.util.html.ToHtml</servlet-class>//你的servlet的类。
</servlet>
<servlet-mapping>
<servlet-name>toHtml</servlet-name>
<url-pattern>/toHtml</url-pattern>
</servlet-mapping>
第三步、运⾏servlet。如:localhost:8080/test/toHtml?file_name=index
OK,这就在你的test项⽬的根⽬录下,⽣成了⼀个index.htm的静态⽂件。 
局限性:本⽂只能⽣成⼀个⽂件!访问⼀次,⽣成⼀个⽂件。并且⽣成的⽂件名也与原来的⽂件名相同。
⽐较适合主页⽣成静态页⾯。
本系列的后续⽂章将解决更多的问题。使之在新闻发布系统中,很容易就集成应⽤。
----------------------------------------------------------------------------------------------------
⽣成静态页⾯技术解决⽅案之⼆
注意:转贴本⽂,请加上本⽂链接/space/?233/action_viewspace_itemid_21.html
在上⼀篇⽂章中,⽣成静态页⾯,是有⼀定的局限性的。⽣成主页是很⽅便,但要⽣成⼆级页⾯,就不⽅便了。
本⽂假设⼀个新闻发布系统。希望后台发布的,前台显⽰的是静态的⽂档。这就涉及,主页要是静态的,同时⼆级列表也是静态的,新闻内容也是静态的。也就是说,在发布⼀篇新闻的时候,可能涉及到三个地⽅⽣成静态⽂档。并且,要⽣成⼀个⽹页,必须访问⼀个servlet。在⼤量⽣成静态⽹页的时候,
以下⽅法,可以解决这些问题。
⼀、加⼊⼀下servelet
/**
* @file_name ⽂件名及⽂件之后的参数.最好为a.jsf?fileId=aaaa
* @path ⽂件所在的路径.相对于根⽬录⽽⾔的.
* @realName⽂件要保存的名字
* @realPath⽂件要保存的真实路径。默认与⽂件所在的⽬录相同。
*/
public class ToHtmlPath extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = "";
jsp和html哪个更好
String name = "";
ServletContext sc = getServletContext();
String file_name = Parameter("file_name");// 你要访问的jsp⽂件,如news.jsf。
// file_name如:fileDetail.jsf?fileId=56.要是有参数,只有⼀个参数。并且以参数名作为⽂件名。
String realName = Parameter("realName");// 要保存的⽂件名。如aaa;注意可以没有这个参数。
String path = Parameter("path");// 你要访问的jsp⽂件路径。如news。注意可以没有这个参数。
String realPath = Parameter("realPath");// 你要保存的⽂件路径,如htmlNews.注意可以没有这个参数。
// 下⾯确定要保存的⽂件名字。
if (realName == null || realName == "") {
int a = 0;
a = file_name.indexOf("=") + 1;
realName = file_name.substring(a);
if (realName.indexOf(".")>0) {
realName = file_name.substring(0, file_name.indexOf("."));
}
}
// 下⾯构造要访问的页⾯。
if (path == null || path == "") {
url = "/" + file_name;// 这是你要⽣成HTML的jsp⽂件,如
} else {
url = "/" + path + "/" + file_name;// 这是你要⽣成HTML的jsp⽂件,如
}
// 下⾯构造要保存的⽂件名,及路径。
// 1、如果有realPath,则保存在realPath下。
// 2、如果有path则保存在path下。
// 3、否则,保存在根⽬录下。
if (realPath == null || realPath == "") {
if (path == null || path == "") {
name = ConfConstants.CONTEXT_PATH + "\\" + realName + ".htm";// 这是⽣成的html⽂件名,如index.htm.说明:ConfConstants.CONTEXT_PATH为你的上下⽂路径。
} else {
name = ConfConstants.CONTEXT_PATH + "\\" + path + "\\"
+ realName + ".htm";// 这是⽣成的html⽂件名,如index.htm.
}
} else {
name = ConfConstants.CONTEXT_PATH + "\\" + realPath + "\\"
+ realName + ".htm";// 这是⽣成的html⽂件名,如index.htm.
}
// 访问请求的页⾯,并⽣成指定的⽂件。
RequestDispatcher rd = sc.getRequestDispatcher(url);
final ByteArrayOutputStream ōs = 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();
FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = Writer();
out.print("<p align=center><font size=3 color=red>success!</font></p>");
}
}
⼆、在l⾥⾯配置你的servlet
<servlet>
<servlet-name>toHtmlPath</servlet-name>
<servlet-class>mj.util.html.ToHtmlPath</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>toHtmlPath</servlet-name>
<url-pattern>/toHtmlPath</url-pattern>
</servlet-mapping>
三、写⼀个通⽤的⽅法, 供调⽤。
public class CallHtml {
public static void callOnePage(String fileName, String path,
String realName, String realPath) {
try {
String str = "localhost:8080/test/toHtmlPath?file_name="
+ fileName + "&&path=" + path + "&&realName=" + realName
+ "&&realPath=" + realPath;
int httpResult;
URL url = new URL(str);
URLConnection connection = url.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
httpResult = ResponseCode();
if (httpResult != HttpURLConnection.HTTP_OK) {
System.out.println("没有连接成功");
} else {
System.out.println("连接成功了 ");
}
} catch (Exception e) {
// TODO: handle exception
}
}
//这个⽅法适当重载,就可以省去⼀些参数传递。
}
四、在你的新闻发布save时,调⽤⽅法。
1、CallHtml.callOnePage("info.jsf?file_id=aaa",news,"", "");//将在news⽬录下⽣成⼀个aaa.htm的静态⽂件
2、CallHtml.callOnePage("newsList.jsf",news,"", "");//将在news⽬录下⽣成⼀个newsList.htm的静态⽂件,显⽰最新的新闻。
3、CallHtml.callOnePage("index.jsf","","", "");//⽣成主页。
好了,这就保持了,主页、列表、新闻内容都是最新的静态页⾯了。
----------------------------------------------------------------------------------------------------
⼀个实现将动态页⾯转为静态的⽅案
1.前⾔
为了能深⼊浅出的理解这个框架的由来,我们⾸先来了解⼀下JSP解析器将我们写的JSP代码转换成的JAVA ⽂件的内容。
下⾯是⼀个JSP⽂件test.jsp
经过TOMCAT转换出的JAVA ⽂件test$jsp.java 内容如下:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class test$jsp extends HttpJspBase {
static {
}
public testOutRedir$jsp( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init() throws org.apache.jasper.runtime.JspException {
}
public void _jspService(HttpServletRequest request, HttpServletResponse  response)
throws java .io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
String  _value = null;
try {
if (_jspx_inited == false) {
synchronized (this) {
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
}
}
_jspxFactory = DefaultFactory();
response.setContentType(text/html;charset=GB2312);
pageContext = _PageContext(this, request, response,
, true, 8192, true);
application = ServletContext();
config = ServletConfig();
session = Session();
out = Out();
//为了节省篇幅,我删除了解释器添加的注释
out.write(\r\n);
//上⼀句是由于后⾯的换⾏产⽣的
out.write();
out.write(\r\n\r\n\r\n\r\n);
out.print( 输出 );
out.write(\r\n\r\n\r\n\r\n);
} catch (Throwable t) {
if (out != null && BufferSize() != 0)
out.clearBuffer();
if (pageContext != null) pageContext.handlePageException(t);
} finally {
if (_jspxFactory != null) _leasePageContext(pageContext);
}
}
}
从上⾯的代码中可以清晰的看到JSP内建的⼏个对象(out、request、response、session、pageContext、application、config、page)是怎么产⽣的,懂servlet的朋友⼀看就能明⽩。
下⾯重点理解⼀下out对象,它被声明为JspWriter类型,JspWriter是⼀个抽象类,在包javax.servlet.jsp中可以到它的定义。
abstract public class javax.servlet.jsp.JspWriter extends java .io.Writer{
final public static int NO_BUFFER = 0;
final public static int DEFAULT_BUFFER = -1;
final public static int UNBOUNDED_BUFFER = -2;
protected int bufferSize;
protected Boolean autoFlush;
protected javax.servlet.jsp.JspWriter(int arg1, boolean arg2);
abstract public void newLine() throws IOException ;
abstract public void print(boolean arg0) throws IOException ;
abstract public void print(char arg0) throws IOException ;
abstract public void print(int arg0) throws IOException ;
abstract public void print(long arg0) throws IOException ;
abstract public void print(float arg0) throws IOException ;
abstract public void print(double arg0) throws IOException ;
abstract public void print(char[] arg0) throws IOException ;
abstract public void print(String arg0) throws IOException ;
abstract public void print(Object arg0) throws IOException ;
abstract public void println() throws IOException ;
abstract public void println(boolean arg0) throws IOException ;
abstract public void println(char arg0) throws IOException ;
abstract public void println(int arg0) throws IOException ;
abstract public void println(long arg0) throws IOException ;
abstract public void println(float arg0) throws IOException ;
abstract public void println(double arg0) throws IOException ;
abstract public void println(char[] arg0) throws IOException ;
abstract public void println(String arg0) throws IOException ;
abtract public void println(Object arg0) throws IOException ;
abstract public void clear() throws IOException ;
abstract public void clearBuffer() throws IOException ;
abstract public void flush() throws IOException ;
abstract public void close() throws IOException ;
public int getBufferSize() ;
abstract public int getRemaining() ;
public boolean isAutoFlush() ;
}
我相信当我写到这⾥你可能已经知道我想怎么做了。是的,来个偷天换⽇,继承JspWriter类,然后实现其定义的虚函数,然后把out变量替换成你⾃⼰实现的类的实例就ok了。
2.实现替换
假设
3.更新问题
下⾯就讨论⼀下如何更新⽣成静态⽂件,其实从上⾯实现中你可以看到,很简单的就是将⽣成的静态⽂件删除即可,⾄于什么时候删除,要看你的需求了。我能想到的⼏种情况如下
当⽤来⽣成页⾯的数据更新时
如果不需要很提供时时的数据可以定时更新
永远不更新
----------------------------------------------------------------------------------------------------
JSP⽣成静态HTML页⾯范例
先建⽴⼀个模本页⾯:template.htm
<Html>
<head>
<title>###title###</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<LINK href="../Css.css" rel=stylesheet type=text/css>
</head>
<body>
<table width="500" border="0" align="center" cellpadding="0" cellspacing="2">
<tr>
<td align="center">###title###</td>
</tr>
<tr>
<td align="center">作者:###author###  </td>
</tr>
<tr>
<td>###content###
</td>
</tr>
</table>
</body>
</html>
=========================================
再写⼀个jsp页⾯: buildhtml.jsp
<%@ page contentType="text/html; charset=gb2312" import="Java .util.*,java .io.*"%>
<%
try{
String title="jsp⽣成静态html⽂件";
String content="⼩样,还搞不定你?";
String editer="webjxcom";
String filePath = "";
filePath = RealPath("/")+"template.htm";
out.print(filePath);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。