r out = null;
try {
// Let the browser know that XML is coming
out = res.getWriter();
res.setContentType("text/xml");
// Output VXML
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<vxml version=\"2.1\">");
out.println(" <form><block><prompt>");
// Output a greeting based on the time of day
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
if (hour < 6) {
out.println("You're up early. Good morning.");
} else if (hour < 12) {
out.println("Good morning. How's your day so far?");
} else if (hour < 18) {
out.println("Half the day is done... good afternoon!");
} else{
out.println("Hope you are enjoying your evening.");
}
out.println(" </prompt></block></form>");
out.println("</vxml>");
} finally {
if (out != null) out.close();
if (bis != null) bis.close();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doGet(req, res);
}
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
呼叫者和 VXML 生成者之间的差异
清单 7 也展示了 Voice XML 与动态生成的 VXML 的另外一项特性:呼叫者可能并非 VXML 本身。例如,假设有一名居住在新西兰的用户呼叫 清单 7 所示的应用程序。若当时新西兰时间是 10:00 PM,但输出 VXML 的服务器位于科罗拉多州的丹佛,两者之间问候的消息可能非常古怪,例如 “您起得真早,早上好!” 这完全不恰当,情况还有可能更糟:如果您已为每周的特定日子添加好了问候语,那么实际上总会出现匹配错误。
根本问题源于 VXML 和 Java 是在特定服务器所在的位置和时区运行的,但可为世界各地的呼叫者所用。如果您的 servlet 未考虑到这方面的问题,就会令一些呼叫者倍感困惑。您有以下几种选择:
- 忽略差异,寄希望于呼叫者了解您的服务器并非在他们所在的时区运行代码。
- 明确声明日期和时间对应于服务器所在位置。例如,下午问候语可以是 “本地现在是下午。祝您愉快”。
- 编写代码询问时区或与 GMT 的时差,然后根据这一信息提供问候语。
遗憾的是,这些选择中没有任何一种富于吸引力。第一种选择的所作所为正如所说明的那样:基本忽略呼叫者。不言而喻,忽略呼叫者绝非 赢得和维持业务关系的正确方法。第二种想法 —— 给出本地时间并明确说明这是本地时间 —— 也没有太大的帮助,因为这种方法依然倾向于忽略呼叫者,只是在此过程中考虑得略微周全一些。
最后一种选择乍看上去似乎很有吸引力,可以很容易地编写出 VXML,允许用户提供一个与 GMT 的时差值,然后根据该信息应答。但呼叫者倾向于尽可能迅速地获得信息,应答提示越多,惹恼呼叫者的风险就越大,他们可能会不满地挂断电话。因此,除非您提供的以日期或时间为基础的服务,否则要求呼叫者指明时区就是浪费资源。甚至可能更糟的是,很多呼叫者并不知道自己所在地与 GMT 的时差,因此您要面临提供时区、时区缩写、夏令时……那将是一个冗长烦琐的列表。
为什么要自寻烦恼?
那么我们为什么要介绍这种基于日期的 VXML 生成呢?很大程度上是因为它正展示了这些问题!您需要密切关注您的听众,尽力只提供那些与他们有关的信息,而不是与您的服务器或您所在地有关的信息。
对于基于日期的处理,您要学习的课程就是:或许应该采用一种更好的最终选择来应对呼叫者,除非绝对必要,否则应完全避免采用基于日期或时间的事务。如果您预计到将有来自其他时区的呼叫者,那么提供与时间相关的功能就是自找麻烦。这一原则同样适用于任何随州、国家或陆地标线的不同可能发生变化的数据。
最后,有很多时候使用 servlet 输出 VXML 并非良策。如果您只是要从一个静态文件中提取 VXML,使用 servlet 带来的好处极为有限(可能只有一点灵活性而已),但要添加代码、编译、调试、一个 servlet 引擎和其他许许多多的东西,从而使语音应用程序的复杂性大为增加。在这些简单的情况下,应继续使用静态 VXML 文件。
一些有趣的想法
致此,您已看到,有时 servlet 生成的 VXML 并无 意义。在结束本文之前,考虑以下几种情况,在这些时候使用 Java 这样的语言是绝佳 的电话应用程序解决方案。此处未提供完整的示例,以后的文章中将予以介绍。
从一个数据库中载入 VXML
最显而易见的与 VoiceXML 相关的 Java 应用程序就是:使用数据库提供动态 VXML 输出。这或许也是大部分读者在选择阅读本文时希望了解的内容(但这篇文章中没有核心示例,因此您可能未学到足够多的知识)。无论如何,JDBC 都能使您轻松连接数据库,然后利用 SQL 查询的结果填充 VXML。
&nb 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
|