Java Servlet 编程及应用之六
2008-01-05 08:13:58 来源:WEB开发网核心提示: Servlet 链提供了Servlet 应用的一种非凡功能,与UNIX 和DOS 命令中的管道类似,Java Servlet 编程及应用之六,可以将多个Servlet 以特定顺序链接起来,在Servlet 链中,这样链中的前一个servlet 只要简单地将数据用逗号分隔,数据就可以一行一行地直接输出了,一个Servl
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 的源代码如下:
更多精彩
赞助商链接