生成靜態(tài)頁面技術(shù)解決方案系列(一)
2006-10-26
相信很多人都希望自己的頁面越快越好,最好是能靜態(tài)的,提高客戶訪問速度。也便于搜索引擎搜索。所以,就希望我們的動(dòng)態(tài)讀取數(shù)據(jù)庫的頁面,盡可能的生成靜態(tài)頁面。一下系列文章,介紹一下個(gè)人的解決方案。
本系列將介紹個(gè)人的一種方法,在不改變原來jsp文件的基礎(chǔ)上,只需要加入少量的代碼,就讓你的新聞發(fā)布系統(tǒng),很容易就完全變成靜態(tài)的頁面。
本文假設(shè)你是用java開發(fā)的web動(dòng)態(tài)頁面。
第一步,加入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 = request.getParameter("file_name");// 你要訪問的jsp文件名,如index,不包括擴(kuò)展名
// 則你訪問這個(gè)servlet時(shí)加參數(shù).如http://localhost/test/toHtml?file_name=index
url = "/" + file_name + ".jsf";// 你要生成的頁面的文件名。我的擴(kuò)展名為jsf .
name = ConfConstants.CONTEXT_PATH+"\\"+ file_name + ".htm";// 這是生成的html文件名,如index.htm.文件名字與源文件名相同。擴(kuò)展名為htm
//ConfConstants.CONTEXT_PATH為你的應(yīng)用的上下文路徑。
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輸出的內(nèi)容寫到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = response.getWriter();
out
.print("<p align=center><font size=3 color=red>頁面已經(jīng)成功生成!single<br>http://www.agilejava.org/space/? 233</font></p>");
}
}
第二步、配置你的web.xml
<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>
第三步、運(yùn)行servlet。如:http://localhost:8080/test/toHtml?file_name=index
OK,這就在你的test項(xiàng)目的根目錄下,生成了一個(gè)index.htm的靜態(tài)文件?!?
局限性:本文只能生成一個(gè)文件!訪問一次,生成一個(gè)文件。并且生成的文件名也與原來的文件名相同。
比較適合主頁生成靜態(tài)頁面。
本系列的后續(xù)文章將解決更多的問題。使之在新聞發(fā)布系統(tǒng)中,很容易就集成應(yīng)用。
*
生成靜態(tài)頁面技術(shù)解決方案系列(二)
2006-10-28
注意:轉(zhuǎn)貼本文,請加上本文鏈接http://www.agilejava.org/space/?233/action_viewspace_itemid_21.html
在上一篇文章中,生成靜態(tài)頁面,是有一定的局限性的。生成主頁是很方便,但要生成二級頁面,就不方便了。
本文假設(shè)一個(gè)新聞發(fā)布系統(tǒng)。希望后臺發(fā)布的,前臺顯示的是靜態(tài)的文檔。這就涉及,主頁要是靜態(tài)的,同時(shí)二級列表也是靜態(tài)的,新聞內(nèi)容也是靜態(tài)的。也就是說, 在發(fā)布一篇新聞的時(shí)候,可能涉及到三個(gè)地方生成靜態(tài)文檔。并且,要生成一個(gè)網(wǎng)頁,必須訪問一個(gè)servlet。在大量生成靜態(tài)網(wǎng)頁的時(shí)候,
以下方法,可以解決這些問題。
一、加入一下servelet
/**
* @file_name 文件名及文件之后的參數(shù).最好為a.jsf?fileId=aaaa
* @path 文件所在的路徑.相對于根目錄而言的.
* @realName文件要保存的名字
* @realPath文件要保存的真實(shí)路徑。默認(rèn)與文件所在的目錄相同。
*/
public class ToHtmlPath extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = "";
String name = "";
ServletContext sc = getServletContext();
String file_name = request.getParameter("file_name");// 你要訪問的jsp文件,如news.jsf。
// file_name如:fileDetail.jsf?fileId=56.要是有參數(shù), 只有一個(gè)參數(shù)。并且以參數(shù)名作為文件名。
String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以沒有這個(gè)參數(shù)。
String path = request.getParameter("path");// 你要訪問的jsp文件路徑。如news。注意可以沒有這個(gè)參數(shù)。
String realPath = request.getParameter("realPath");// 你要保存的文件路徑,如htmlNews.注意可以沒有這個(gè)參數(shù)。
// 下面確定要保存的文件名字。
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("."));
}
}
// 下面構(gòu)造要訪問的頁面。
if (path == null || path == "") {
url = "/" + file_name;// 這是你要生成HTML的jsp文件,如
} else {
url = "/" + path + "/" + file_name;// 這是你要生成HTML的jsp文件,如
}
// 下面構(gòu)造要保存的文件名,及路徑。
// 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輸出的內(nèi)容寫到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = response.getWriter();
out.print("<p align=center><font size=3 color=red>success!</font></p>");
}
}
二、在web.xml里面配置你的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>
三、寫一個(gè)通用的方法, 供調(diào)用。
public class CallHtml {
public static void callOnePage(String fileName, String path,
String realName, String realPath) {
try {
String str = "http://localhost:8080/test/toHtmlPath?file_name="
+ fileName + "&&path=" + path + "&&realName=" + realName
+ "&&realPath=" + realPath;
int httpResult;
URL url = new URL(str);
URLConnection connection = url.openConnection();
connection.connect();
HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
httpResult = httpURLConnection.getResponseCode();
if (httpResult != HttpURLConnection.HTTP_OK) {
System.out.println("沒有連接成功");
} else {
System.out.println("連接成功了 ");
}
} catch (Exception e) {
// TODO: handle exception
}
}
//這個(gè)方法適當(dāng)重載,就可以省去一些參數(shù)傳遞。
}
四、在你的新聞發(fā)布save時(shí),調(diào)用方法。
1、CallHtml.callOnePage("info.jsf?file_id=aaa",news,"", "");//將在news目錄下生成一個(gè)aaa.htm的靜態(tài)文件
2、CallHtml.callOnePage("newsList.jsf",news,"", "");//將在news目錄下生成一個(gè)newsList.htm的靜態(tài)文件,顯示最新的新聞。
3、CallHtml.callOnePage("index.jsf","","", "");//生成主頁。
好了,這就保持了,主頁、列表、新聞內(nèi)容都是最新的靜態(tài)頁面了。
2006-10-26
相信很多人都希望自己的頁面越快越好,最好是能靜態(tài)的,提高客戶訪問速度。也便于搜索引擎搜索。所以,就希望我們的動(dòng)態(tài)讀取數(shù)據(jù)庫的頁面,盡可能的生成靜態(tài)頁面。一下系列文章,介紹一下個(gè)人的解決方案。
本系列將介紹個(gè)人的一種方法,在不改變原來jsp文件的基礎(chǔ)上,只需要加入少量的代碼,就讓你的新聞發(fā)布系統(tǒng),很容易就完全變成靜態(tài)的頁面。
本文假設(shè)你是用java開發(fā)的web動(dòng)態(tài)頁面。
第一步,加入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 = request.getParameter("file_name");// 你要訪問的jsp文件名,如index,不包括擴(kuò)展名
// 則你訪問這個(gè)servlet時(shí)加參數(shù).如http://localhost/test/toHtml?file_name=index
url = "/" + file_name + ".jsf";// 你要生成的頁面的文件名。我的擴(kuò)展名為jsf .
name = ConfConstants.CONTEXT_PATH+"\\"+ file_name + ".htm";// 這是生成的html文件名,如index.htm.文件名字與源文件名相同。擴(kuò)展名為htm
//ConfConstants.CONTEXT_PATH為你的應(yīng)用的上下文路徑。
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輸出的內(nèi)容寫到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = response.getWriter();
out
.print("<p align=center><font size=3 color=red>頁面已經(jīng)成功生成!single<br>http://www.agilejava.org/space/? 233</font></p>");
}
}
第二步、配置你的web.xml
<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>
第三步、運(yùn)行servlet。如:http://localhost:8080/test/toHtml?file_name=index
OK,這就在你的test項(xiàng)目的根目錄下,生成了一個(gè)index.htm的靜態(tài)文件?!?
局限性:本文只能生成一個(gè)文件!訪問一次,生成一個(gè)文件。并且生成的文件名也與原來的文件名相同。
比較適合主頁生成靜態(tài)頁面。
本系列的后續(xù)文章將解決更多的問題。使之在新聞發(fā)布系統(tǒng)中,很容易就集成應(yīng)用。
*
生成靜態(tài)頁面技術(shù)解決方案系列(二)
2006-10-28
注意:轉(zhuǎn)貼本文,請加上本文鏈接http://www.agilejava.org/space/?233/action_viewspace_itemid_21.html
在上一篇文章中,生成靜態(tài)頁面,是有一定的局限性的。生成主頁是很方便,但要生成二級頁面,就不方便了。
本文假設(shè)一個(gè)新聞發(fā)布系統(tǒng)。希望后臺發(fā)布的,前臺顯示的是靜態(tài)的文檔。這就涉及,主頁要是靜態(tài)的,同時(shí)二級列表也是靜態(tài)的,新聞內(nèi)容也是靜態(tài)的。也就是說, 在發(fā)布一篇新聞的時(shí)候,可能涉及到三個(gè)地方生成靜態(tài)文檔。并且,要生成一個(gè)網(wǎng)頁,必須訪問一個(gè)servlet。在大量生成靜態(tài)網(wǎng)頁的時(shí)候,
以下方法,可以解決這些問題。
一、加入一下servelet
/**
* @file_name 文件名及文件之后的參數(shù).最好為a.jsf?fileId=aaaa
* @path 文件所在的路徑.相對于根目錄而言的.
* @realName文件要保存的名字
* @realPath文件要保存的真實(shí)路徑。默認(rèn)與文件所在的目錄相同。
*/
public class ToHtmlPath extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = "";
String name = "";
ServletContext sc = getServletContext();
String file_name = request.getParameter("file_name");// 你要訪問的jsp文件,如news.jsf。
// file_name如:fileDetail.jsf?fileId=56.要是有參數(shù), 只有一個(gè)參數(shù)。并且以參數(shù)名作為文件名。
String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以沒有這個(gè)參數(shù)。
String path = request.getParameter("path");// 你要訪問的jsp文件路徑。如news。注意可以沒有這個(gè)參數(shù)。
String realPath = request.getParameter("realPath");// 你要保存的文件路徑,如htmlNews.注意可以沒有這個(gè)參數(shù)。
// 下面確定要保存的文件名字。
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("."));
}
}
// 下面構(gòu)造要訪問的頁面。
if (path == null || path == "") {
url = "/" + file_name;// 這是你要生成HTML的jsp文件,如
} else {
url = "/" + path + "/" + file_name;// 這是你要生成HTML的jsp文件,如
}
// 下面構(gòu)造要保存的文件名,及路徑。
// 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輸出的內(nèi)容寫到xxx.htm
os.writeTo(fos);
fos.close();
PrintWriter ōut = response.getWriter();
out.print("<p align=center><font size=3 color=red>success!</font></p>");
}
}
二、在web.xml里面配置你的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>
三、寫一個(gè)通用的方法, 供調(diào)用。
public class CallHtml {
public static void callOnePage(String fileName, String path,
String realName, String realPath) {
try {
String str = "http://localhost:8080/test/toHtmlPath?file_name="
+ fileName + "&&path=" + path + "&&realName=" + realName
+ "&&realPath=" + realPath;
int httpResult;
URL url = new URL(str);
URLConnection connection = url.openConnection();
connection.connect();
HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
httpResult = httpURLConnection.getResponseCode();
if (httpResult != HttpURLConnection.HTTP_OK) {
System.out.println("沒有連接成功");
} else {
System.out.println("連接成功了 ");
}
} catch (Exception e) {
// TODO: handle exception
}
}
//這個(gè)方法適當(dāng)重載,就可以省去一些參數(shù)傳遞。
}
四、在你的新聞發(fā)布save時(shí),調(diào)用方法。
1、CallHtml.callOnePage("info.jsf?file_id=aaa",news,"", "");//將在news目錄下生成一個(gè)aaa.htm的靜態(tài)文件
2、CallHtml.callOnePage("newsList.jsf",news,"", "");//將在news目錄下生成一個(gè)newsList.htm的靜態(tài)文件,顯示最新的新聞。
3、CallHtml.callOnePage("index.jsf","","", "");//生成主頁。
好了,這就保持了,主頁、列表、新聞內(nèi)容都是最新的靜態(tài)頁面了。