top
Loading...
JavaServlet編程及應用之六
天極IT資訊短信服務 電腦小技巧
資費:包月5元
手機:
介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。


Servlet 鏈提供了Servlet 應用的一種特殊功能。與UNIX 和DOS 命令中的管道類似,可以將多個Servlet 以特定順序鏈接起來。在Servlet 鏈中,一個Servlet 的輸出被當作下一個Servlet 的輸入,而鏈中最后一個Servlet 的輸出被返回到瀏覽器。

編程思路:首先編寫一個表過濾器Servlet,它的作用主要是按照一定的表格格式輸出,在通過Servlet 表過濾器(TableFilter.java)后,無格式化的Servlet(ghq.java)所有的行將會被格式化成HTML表格。

表過濾器 TableFilter.java 的源代碼如下:(代碼節選)



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class TableFilter extends HttpServlet
{
public void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException
{
// Get all headers set by the previous servlet and echo them
java.util.Enumeration e = req.getHeaderNames();
while (e.hasMoreElements()) {
String header = (String)e.nextElement();
String value = req.getHeader(header);
resp.setHeader(header, value);
}
// Get the input and output streams
ServletInputStream in = req.getInputStream();
ServletOutputStream out = resp.getOutputStream();
// Only process if this is a recognized MIME type
String type = req.getContentType();
if (type.equals("text/html") || type.equals("text/table") ||
type.equals("application/x-www-form-urlencoded")) {
resp.setContentType("text/html");
// Create a buffered reader that we can use to read
// a single line at a time
BufferedReader br = new BufferedReader(new InputStreamReader(in));

boolean inTable = false;
int tableCols = 0;
boolean headerRow = false;

// Read until no more data exists

while (true) {
String s = br.readLine();

// null indicates end of file

if (s == null) {
break;
}

// If we are in the middle of a table command, process
// the line

if (inTable) {

// Search for the end of the table
if (s.startsWith("<!--end table")) {
out.println("</table></center>");
inTable = false;
}
else {
// We've got a row of a table - format it
s = formatRow(s, tableCols, headerRow);
headerRow = false;
}
}
else {

// Search for the start of a table
if (s.startsWith("<!--table")) {
int pos = s.indexOf("columns=");
tableCols = 0;
if (pos >= 0) {

// Get the number of columns

String cols = s.substring(pos + 8);
int endPos = cols.indexOf(" ");
if (endPos > 0) {
cols = cols.substring(0, endPos);
}
tableCols = Integer.parseInt(cols);
}

.........
.........

這個表過濾器servlet 分析另一個servlet 的輸出,查找含有特殊格式指令的HTML 注釋,這些指令包括表有多少列、是否顯示表頭等等。在該表格格式指令之后的所有行將會被格式化成一個HTML 表格。這樣鏈中的前一個servlet 只要簡單地將數據用逗號分隔,數據就可以一行一行地直接輸出了,而無須修改這些數據格式化HTML 表格。

沒有格式化輸出的HTML 表格ghq.java 的源代碼如下:

import javax.servlet.*;
import javax.servlet.http.*;

public class ghq extends HttpServlet
{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException
{
// Create a PrintWriter to write the response
java.io.PrintWriter out = new java.io.PrintWriter(resp.getOutputStream());
// Set the content type of the response
resp.setContentType("text/html;charset=gb2312");
// Print the HTML header
out.println("<html>");
out.println("<head>");
out.println("<title>Java Servlets Sample - " + "通訊錄 </title>");
out.println("</head>");
out.println("<h2><center>");
out.println("通訊錄</center></h2>");
out.println("<br>");

// Output special table formatting instructions for
// the TableFilter servlet

out.println("<!--table columns=3 header=yes-->");

// Output the table
out.println("姓名,性別,聯系電話");
out.println("谷物,男,4324552");
out.println("江淮,女,2345265");
out.println("王冠,男,7867655");
out.println("張羅,男,5654343");
out.println("許愿,女,8876554");
out.println("<!--end table-->");

// Wrap up
out.println("</html>");
out.flush();
out.close();
}
public void init(ServletConfig cfg)
throws ServletException
{
super.init(cfg);
}
public void destroy()
{
super.destroy();
}
}

編程技巧說明:

觸發Servlet 鏈,有3種觸發Servlet 鏈的方式:

* 通過在URL 中用逗號分隔的多個Servlet 來直接觸發。

* 將多個Servlet 指定同一個別名,然后通過別名方式來觸發Servlet 鏈。

* 指定一種MIME 類型,規定凡是這種MIME 類型的響應都要通過某一個Servlet 來過濾,這也是一種Servlet 鏈的應用。

其中第三種應用比較特殊,可以用來格式化文本,在一些Internet 翻譯網站也可能用來對結果文本進行翻譯。

用第一種直接在URL中觸發Servlet 鏈的方法很簡單,只要在URL后面將鏈中的Servlet 用逗號按順序隔開即可。在瀏覽器的地址欄輸入URL 如下:

http://192.168.10.1/servlet/ghq,TableFilter

用第二種方法使用別名方式指定Servlet 鏈,如采用JRUN servlet 引擎,則在JRUN 的Servlet URL Mapping 功能中進行配置。如在"Virtual Path/Extension" 項中輸入 " /test ",在"Servlet invoked" 項中輸入" ghq,TableFilter ",則在用別名觸發Servlet 的URL 如下:
http://192.168.10.1/test
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗