2169
天极IT资讯短信服务 电脑小技巧 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。
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
15b
|