Chinaunix首页 | 论坛 | 博客
  • 博客访问: 805317
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客
[6]

分类:

2008-09-12 09:24:00

部分可选的附加项

    您可能希望向 servlet 代码中添加一些小附加项。它们都不是必需的,但都会给现有的版本增加一些健壮性和文档。

    首先,您可能想允许用户通过 POST 请求访问 VXML。这可能在用户单击表单上的一个按钮时发生,该表单将对 VoiceXMLServlet 作出一个 POST 请求。在 servlet 中处理这一操作非常简单,只要编写一个委托已有 doGet() 方法的 doPost() 即可,如下所示:

  
public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    doGet(req, res);
  }


    另外一个简单的附加项用于允许浏览器切实获知您正在输出一个 VXML 文件的内容。为此,设置 servlet 中的 Content-disposition 响应头,如下:

      
// Let the browser know that XML is coming
      out = res.getOutputStream();
      res.setContentType("text/xml");
      res.setContentLength((int)vxml.length());
      res.addHeader("Content-Disposition",
        "attachment; filename=" + vxml);
			

    现在读取您的响应的浏览器(或其他代码)就可以发现所服务的 VXML 文件了。但务必不要包含完整的文件路径,这会造成隐患!

    有了输出 VXML 文件的 servlet 之后,将其转换成动态输出 VXML 的 servlet(使用代码作为模型或模板)轻而易举。换句话说,您可以超越简单地载入静态的 VXML 文件,开始通过编程创建 VXML。

    当您开始考虑动态 VoiceXML 时,Java 平台就显示出了自己的优势。它提供了轻松输出 XML 的能力,还有与数据库、目录、身份验证和会话的交互。此外,它还能够证实,构建动态 VXML 将消除基于语音的系统的部分刻板性。

    在这一节中,我将逐步为您介绍创建一个输出动态 VXML 的 Java servlet 的步骤。

    您已经了解了如何访问 ServletOutputStream,然后在输出流中插入字节。但如果从源(例如一个静态 VXML 文件)传输到输出流的不仅仅是字节,那么直接处理字节的方式几乎无法管理控制。

    如果您希望自行创建 VXML,最好使用 PrintWriter。利用这个类,您可发出整个字符串,使之对于创建和输出动态内容更为有用。这只需要对代码略加修改,如下所示:

  
public void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    String vxmlDir = getServletContext().getInitParameter("vxml-dir");

    BufferedInputStream bis = null;
    ServletOutputStream out = null;

    try {
      // Load the VXML file
      File vxml = new File(vxmlDir + "/" + VXML_FILENAME);
      FileInputStream fis = new FileInputStream(vxml);
      bis = new BufferedInputStream(fis);

      // Let the browser know that XML is coming
      PrintWriter out = res.getOutputStream();
      res.setContentType("text/xml");
      res.setContentLength((int)vxml.length());

      // Output content using PrintWriter
    } finally {
      if (out != null) out.close();
      if (bis != null) bis.close();
    }
  }


    另外,不要忘记导入 java.io.PrintWriter 类:它不会自动成为对您的 servlet 的代码基可用。

    使用 PrintWriter,您现在可以输出基于字符串的内容了。例如,清单 6 输出与 清单 1 相同的 VXML,但是通过 servlet 输出,并未从静态文件载入 VXML 内容。

 

       [6]    

【责编:Peng】

--------------------next---------------------

阅读(334) | 评论(0) | 转发(0) |
0

上一篇:[3]

下一篇:[7]

给主人留下些什么吧!~~