转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> JAVA开发 >> 正文
Java Servlet 编程及应用之六         ★★★★

Java Servlet 编程及应用之六

作者:闵涛 文章来源:闵涛的学习笔记 点击数:685 更新时间:2009/4/22 23:28:16
2169 天极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
15b


[网页制作]JavaScript的三种消息框:警告框、确认框、提示框  [网页制作]JavaScript运算符介绍
[网页制作]JavaScript比较和逻辑运算符介绍  [网页制作]script中的language=javascript和type=text/javas…
[JAVA开发]Java连接各种数据库的实例  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[系统软件]Regular Expression 正则表达式-2 (Java)  [C语言系列]sqlserver在JAVA中的应用
[网页制作]Dreamweaver MX实例:构建Java插入模块  [网页制作]使用Dreamweaver轻松构建Java插入模块
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台