 |  |
|
난이도 : 고급 Martin Brown, Developer and writer, Freelance
2007 년 11 월 13 일 이번 시간에는, VoiceXML (VXML)을 인풋으로 사용하여, 데이터를 온라인 블로그에 저장하는 간단한 블로깅(blogging) 애플리케이션을 개발할 것입니다. 이러한 유형의 음성 블로깅을 사용하여 트위트(tweet) 또는 Twitter 엔트리를 만들 때 큰 효과를 볼 수 있습니다.
머리말
오늘날 점점 더 많은 사람들이 자신을 좀더 드러내는 수단으로 블로깅(blogging)을 사용하고 있다. 그렇다면, VoiceXML을 사용하여 실제로 블로그와 상호 작동하거나, 본인의 음성을 사용하여 소리를 내는 것은 어떠한가? 이 글에서는 그 방법을 설명한다.
- 원격 데이터에서 동적인 VoiceXML을 만든다.
- 콘텐트를 VXML로 전달한다.
- 요청을 블로그에 제출하고 VXML을 통해 보고한다.
- 상태 업데이트를 Twitter에 제출한다.
시리즈 소개
음성과 오디오는 웹에서 점점 더 대중화 되고 있다. 현재 온라인에서 사용할 수 있는 음악이나 웹캐스트(webcast)가 한 예이다. 본 시리즈에서는 음성과 XML을 결합하여 유용한 애플리케이션들을 개발하는 여러 가지 방법을 소개하고자 한다.
-
Part 1
—음성 실행 RSS 리더.
-
Part 2
—음성 실행 달력.
- Part 3—음성 실행 블로그 및 Twitter 애플리케이션.
-
Part 4
—음성 실행 Yahoo 검색 애플리케이션.
블로깅 워크플로우
블로거(blogger)에게 있어서, 자신의 블로그에서 멀리 떨어져 있다는 이유로 무엇인가를 게시를 할 수 없다는 것만큼 안타까운 일도 없다. 하지만, VoiceXML을 사용하면, 그러한 상실감을 느낄 필요가 없다. 사용자가 전화를 통해 블로그를 실행할 수 있도록 하는 VoiceXML 실행 애플리케이션을 구현할 수 있다.
불행히도, 현재 VoiceXML(VXML) 플랫폼은 제한되어 있고, 완벽한 블로그 게시를 주장할 수는 없지만, VoiceXML을 사용하여 일부 표준화된 메시지를 기존 블로그에 게시할 수 있다.
이를 위해서, VXML을 생성하고 인풋을 처리할 자바™ 서블릿을 구현하여 블로그 포스트를 조합하고 포스트를 사용자의 블로그로 보내야 한다. 당분간은, 블로그 선택, 사용자 이름, 패스워드의 문제를 무시할 것이다. 블로깅 인터페이스를 볼 때 명확해 질 것이기 때문이다.
워크플로우의 경우, 블로깅 인터페이스 서블릿은,
- 블로그에서 카테고리 리스트를 가져온다.
- 허용된 구문(phrase)의 리스트와 허용된 카테고리의 리스트를 출력하는 VXML 파일을 만든다.
- VXML은 인풋 메소드를 사용하여 카테고리와 구문 정보를 서블릿에 제출한다.
- 서블릿은 블로그 포스트를 조합하고 이를 게시를 위해 블로그로 보낸다.
- VXML은 "완성된" 메시지를 출력하고, 프로세스는 종료된다.
그림 1은 기본 구조를 표현한 것이다.
그림 1. 음성 블로깅 구조
VXML을 실행하기 전에, 블로그로의 연결을 지원할 블로깅 인터페이스를 살펴보자.
블로깅 인터페이스
블로그에 게시하는 여러 솔루션들이 있지만, 대부분은 MetaWeblog/MovableType 또는Blogger API 인터페이스에 기반한 XML-RPC (XML Remote Procedure Call) 표준을 지원한다. 이 두 가지는 비슷하지만, 전자는 후자의 한계를 해결한 것이기 때문에 보다 실용적이다.
웹 포스트를 만들기 전에, 사용자 블로그로 XML-RPC 호출을 할 환경을 설정해야 한다. 블로그와 통신하기 위해서는, 세 가지 정보가 필요하다.
- 블로그의 XML-RPC URL—WordPress 같은 시스템의 경우, 특수 컴포넌트가 이 프로세스를 핸들한다. 예를 들어, WordPress는 xmlrpc.php 스크립트를 제공한다. http://mcslp.com/xmlrpc.php 같은 완전한 URL이 필요하다.
- 사용자 이름—블로그 사용자의 사용자 이름.
- 패스워드—블로그 사용자의 패스워드.
모든 블로그에는 마지막 한 가지 정보 조각인 블로그 ID가 필요하다. 단 한 개의 블로그(예를 들어, WordPress)만을 호스팅 하는 사이트와 시스템의 경우, 블로그 ID는 언제나 하나이다. 같은 사이트에 다중 블로그들을 호스팅 하는 사이트와 시스템의 경우, 블로그의 고유 블로그 ID가 필요하다. MovableType, b2evolution, 그리고 더 큰 콘텐트 관리 시스템의 일부인 블로그는 후자의 카테고리에 속한다.
분명한 것은, 어떤 정보도 VoiceXML 인터페이스를 통해 쉽게 교환할 수 없다. 더 큰 서비스를 설정한다면, 번호를 사용하는 로그인 서비스를 제공하여 사용자가 계정에 로그인 하고 서비스 프로퍼티를 로딩하도록 할 수 있다.
블로그에 연결하는 문제로 돌아가서, 두 개의 필수 함수들을 변환하는 XML-RPC 연결과 관련한 새로운 래퍼 클래스를 만듦으로써 시스템을 만든다.
- 카테고리 리스트를 얻는다.
- 포스트를 메인 클래스의 메소드로 만든다.
따라서 거대한 메인 클래스 인스턴스는 핵심 매개변수를 설정하는 것과 관련이 있고, 블로그 시스템과 통신하기 위해 사용할 XML-RPC 객체의 인스턴스를 만드는 것과 관련이 있다.
프로세스를 더욱 쉽게 하려면, Apache에서 XML-RPC 라이브러리를 사용해야 한다. Listing 1은 BlogPost 클래스와, 이 클래스의 인스턴스를 만들 메소드이다.
Listing 1. BlogPost 클래스 설정하기
import java.util.*;
import java.io.*;
import java.net.URL;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
public class BlogPost {
String username;
String password;
String blogid;
String blogurl;
XmlRpcClientConfigImpl xmlrpcConfig = new XmlRpcClientConfigImpl();
XmlRpcClient client = new XmlRpcClient();
public BlogPost(String user,
String pass,
String id,
String url) {
username = user;
password = pass;
blogid = id;
blogurl = url;
try {
xmlrpcConfig.setServerURL(new URL(blogurl));
client.setConfig(xmlrpcConfig);
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: " + ex.getMessage());
}
}
|
Listing 1에서, 인풋을 받아들이고, 블로그의 XML-RPC 서비스와 통신할 기본적인 XmlRpcClient 인스턴스를 만들 수 있다.
이제, BlogPost 객체를 만들기 위해, 사용자 이름, 패스워드, URL, 블로그 ID를 제공한다. (Listing 2)
Listing 2. BlogPost 객체 만들기
BlogPost bp = new BlogPost("user",
"pass",
"1",
"http://myblog.com/xmlrpc.php");
|
포스트를 만들기 전에, 현재 블로그 내에 설정된 기존 카테고리에 기반한 카테고리를 설정하는 기능을 갖춘 콜러를 제공해야 한다.
블로그 카테고리 얻기
weblog API 기반의 XML-RPC는 지정된 블로그를 위해 설정된 카테고리 리스트를 리턴하는 한 개의 함수 getCategories를 제공한다. 정보를 얻으려면 호출의 일부로 블로그 ID, 사용자 이름, 패스워드를 제공해야 한다.
리턴 값은 더 복잡하다. 기본 데이터 용어로 이것은, 해시(hash) 어레이인데, 여기에서 해시는 카테고리 ID, 카테고리 이름, (카테고리용)소스 블로그 레퍼런스 URL, (카테고리용) RSS 피드 URL을 포함하여 카테고리에 대한 정보로 구성되어 있다. 따라서, 각 카테고리의 경우 표 1의 정보를 포함하고 있는 해시를 얻게 된다.
표 1. 카테고리 정보를 포함하고 있는 해시
| categoryId | 3 | | htmlUrl | http://www.thewriting.biz/?cat=3 | | rssUrl | http://www.thewriting.biz?feed=rss2&cat=4 | | categoryName | Making Money | | description | Making Money |
대부분 여러분에게는 필요 없는 것들이다. 여러분에게 필요한 정보는 categoryId와 categoryName이다. 블로그 포스트를 만들 때, 카테고리를 설정할 ID가 필요하다. 애플리케이션의 VoiceXML 측에 제공된 카테고리 이름을 사용하여 카테고리를 이름 별로 선택할 수 있는 옵션을 제공해야 한다.
유용한 정보를 만들려면, 요청을 보내고, 정보를 얻고, 카테고리 ID와 이름을 애플리케이션의 VoiceXML 부분 내에서 사용할 수 있는 자바 hashtable로 변환하여 카테고리 리스트를 만들어야 한다. Listing 3은 BlogPost 객체에 대한 GetCategories() 메소드이다.
Listing 3. 블로그에서 가져온 카테고리를 hashtable로 바꾸기
public Hashtable GetCategories() {
Hashtable categories = new Hashtable();
Object[] cats = new Object[] {};
try {
cats = (Object [])
this.client.execute("metaWeblog.getCategories",
new Object[] {this.blogid,
this.username,
this.password});
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: " + ex.getMessage());
}
for(int i = 0; i < cats.length; i++ ) {
HashMap category = (HashMap)cats[i];
categories.put(category.get("categoryId"),
category.get("categoryName"));
}
return categories;
}
|
서블릿에서 결과 해시 테이블을 사용하여 카테고리 리스트를 출력한다.
블로그 포스트 만들기
블로그 포스트를 만들 때, 카테고리를 포스트에 붙이려면 여러 단계를 거친다. 몇 가지 블로그 시스템들을 사용하여 갖춘 하나의 제출로 모든 것을 수행할 수 있지만, 어떤 것은 포스트를 제출하는 그 지점에 블로그 카테고리를 수락할 수 없다. 이와 같은 이유 때문에 다음과 같은 것이 더 나은 솔루션이라 할 수 있다.
- 블로그 포스트를 추가하여 고유 블로그 포스트 ID를 얻지만, 포스트를 마킹하여 이것이 자동으로 공개되는 것이 아니라는 것을 표시한다. (
newPost RPC).
- 블로그 포스트 ID를 사용하여, 블로그 포스트에 원하는 카테고리를 설정한다. (
setCategories RPC 사용).
- 전체 블로그 포스트의 상세를 로딩한다. (
getPost RPC 사용).
- 포스트를 재 공개한다. 이번에는 포스트를 공개 준비가 된 것으로 표시한다. (
editPost RPC 사용)
Listing 4는 원격 서비스에 다양한 XML-RPC 호출을 사용하는 시퀀스를 나타낸다. 카테고리와 마찬가지로, 정보 포맷은 단순한 인자들 보다 복잡하다. hashtable을 구현하여 블로그 포스트 정보를 포함시킨다. 카테고리를 설정하려면, 또 다른 hashtable을 만드는데, 이는 카테고리 정보를 제출할 때 어레이로서 전달된다. (getCategories에서 온 리턴 값은 hashtable의 어레이였다.)
Listing 4. 블로그 포스트 공개하기
public Boolean PostIt(String title,
String description,
Integer category) {
Hashtable post = new Hashtable();
if (title != null) post.put("title", title);
post.put("dateCreated", new Date());
post.put("description", description);
Hashtable categories = new Hashtable();
categories.put("categoryId",category);
String blogpostid = "";
Boolean result = Boolean.FALSE;
try {
blogpostid = (String)
this.client.execute("metaWeblog.newPost",
new Object[] {this.blogid,
this.username,
this.password,
post,
Boolean.FALSE});
result = (Boolean)
this.client.execute("mt.setPostCategories",
new Object[] {blogpostid,
this.username,
this.password,
new Object[] {categories}});
HashMap postdetail = (HashMap)
this.client.execute("metaWeblog.getPost",
new Object[] {blogpostid,
this.username,
this.password, });
result = (Boolean)
this.client.execute("metaWeblog.editPost",
new Object[] {blogpostid,
this.username,
this.password,
postdetail,
Boolean.TRUE });
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("ERROR: " + ex.getMessage());
}
return(result);
}
|
실제 블로그 포스팅 프로세스는 PostIt() 함수로의 단일 호출이다.
bp.PostIt("Title","Content",5);
|
블로그 포스팅 메커니즘과 클래스가 갖추어졌다면, 여러분에게 필요한 VXML을 출력할 래퍼 자바 서블릿을 구현하고, 인풋을 수락하여 블로그 포스트를 만든다.
문법 고려하기
블로그 포스트를 생성하는데 필요한 VXML을 보기 전에, 사용자에게서 인풋을 받아들이는데 사용할 수 있는 몇 가지 규칙을 살펴보자.
테스트 기본 문법 포맷은 괄호와 중괄호 포맷을 사용하여 사용할 문법을 지정한다. 앞서 언급했듯이, 명령 콘텐트를 가질 수 없지만, 블로그 포스트에 사용할 기본적인 구문을 수락할 수 있다.
표 2는 가장 유용한 주요 연산자들이다.
표 2. 주요 연산자
| 연산자 | 예제 | 설명 |
|---|
| Disjunction | [happy sad] | 단어들 중 하나라도 유용한 것으로 수락된다. | | Concatenation | (very happy) | 전체 구문이 유효한 것으로 수락되도록 해야 한다. | | Optional Phrase | (?very happy) | 물음표(?) 뒤에 오는 구문은 선택적이기 때문에, "very happy"와 "happy" 모두 허용된다. | | Positive Closure | (+very happy) | 더하기(+) 다음에 오는 구문은 최소한 한 번 언급되어야 하므로, "very happy"와 "very very happy"가 똑같이 유효하다. | | Kleene Closure | (*very happy) | 별표(*) 다음에 오는 구문은 선택적이지만, 반복될 수 없다. 여기에서, "happy", "very happy", "very very happy'" 모두 유효하다. |
확실히, 이 모든 다양한 옵션들을 결합할 수 있기 때문에, concatenation과 disjunction 연산자를 결합하여 유효한 구문 리스트를 가질 수도 있다.
여러분의 블로깅 애플리케이션의 경우, Listing 5와 같은 문법을 사용한다.
Listing 5. 블로깅 토픽 문법
(eye am [happy {<phrase "I am happy">}
sad {<phrase "I am sad">}
traveling {<phrase "I am traveling">}
(on business){<phrase "I am on business">}
] )
|
먼저, "I" 자리에 있는 "eye"에 주목하라. 대부분의 VoiceXML 시스템들은 단어와 한 글자를 구분하지 못하고, 어떤 것은 두 글자 미만의 단어를 받아들이지 않는다. 따라서, 단어의 사운드를 명확히 사용해야 하고, 여러분이 진정으로 원하는 것을 포착할 명확한 필드 값을 사용해야 한다.
나머지의 경우, 선택할 수 있는 리스트를 제공하면 된다. Listing 5의 문법에서 볼 때, 다음 문장들은 유효 인풋들이다.
- I am happy
- I am sad
- I am traveling
- I am on business
이제는, 인풋을 받아들이기 위해 사용할 VXML 소스를 살펴보자.
주요 VXML 소스
VXML 소스의 핵심은 Listing 6에 나타나 있다.
Listing 6. 주요 VXML 시퀀스
<?xml version="1.0" encoding ="UTF-8"?>
<!DOCTYPE vxml PUBLIC "-//W3C//DTD VOICEXML 2.1//EN"
"http://www.w3.org/TR/voicexml21/vxml.dtd">
<vxml version="2.1" xmlns="http://www/w3/org/2001/vxml"
xml:lang="en-US">
<form id="blogging">
<block>
<prompt>
Welcome to the blogging service.
</prompt>
</block>
<field name="phrase">
<prompt>Please state your current status to be used on your blog.</prompt>
<grammar type="text/gsl">
<![CDATA[
(eye am [happy {<phrase "I am happy">}
sad {<phrase "I am sad">}
traveling {<phrase "I am traveling">}
(on business) {<phrase "I am on business">}
] )
]]>
</grammar>
</field>
<field name="location">
<prompt>Please state your current location</prompt>
<option>Edinburgh</option>
<option>New York</option>
<option>London</option>
<option>Paris</option>
<option>Stockholm</option>
</field>
<filled>
<prompt>
Your blog post will be: <value expr="phrase"/>.
Current location: <value expr="location"/>
</prompt>
<submit name="/VXMLBlogPost/blogpost"
namelist="phrase category location"/>
</filled>
</form>
</vxml>
|
이 파일의 기본 시퀀스는 Listing 7과 비슷하다.
Listing 7. 기본 시퀀스
Service: Welcome to the blogging service.
S: Please state your current status to be used on your blog.
User: I am happy
S: Please state your current location
U: London
S: Your blog post will be: I am happy. Current location: London
|
이것을 동적으로 출력하여 블로그에 설정된 카테고리 리스트인 마지막 필드를 추가해야 한다.
카테고리 내보내기
카테고리 리스트를 만들기 위해, 자바 서블릿에 VXML을 만든 다음, 카테고리를 요청하는 프롬프트를 만드는 블로그를 삽입한다. <option> 태그를 사용하여 사용자에게서 중요한 값을 수락하고, 블로그 포스트를 만들 때 정보 제출 시 사용해야 하는 숫자 카테고리 ID를 할당한다. Listing 8의 코드는 카테고리 리스트를 출력하는 부분이다.
Listing 8. 카테고리 리스트 출력하기
Hashtable cats = this.bp.GetCategories();
Enumeration keys = cats.keys();
while ( keys.hasMoreElements() ) {
String key = (String)keys.nextElement();
String cat = (String)cats.get( key );
out.println("<option value=\"" + key + "\">" + cat + "</option>");
}
|
결과 VXML(관련 필드 정의 포함)은 콘텐트를 출력한다. (Listing 9)
Listing 9. 결과 VXML
<field name="category">
<prompt>Please state the category to be used for this post.</prompt>
<option value="1">Commentary</option>
<option value="2">Holiday Travel</option>
</field>
|
이제 인풋을 수락할 준비가 되었다.
인풋 파싱 및 포스트 만들기
VXML에 있는 submit 태그는 필드 값을 지정된 원격 애플리케이션으로 표준 HTTP 매개변수로서 전달한다. 여러분의 VXML에서, 이 블록은 채워진 섹션 안에 있다. (Listing 10).
Listing 10. submit 태그
<submit name="/VXMLBlogPost/blogpost"
namelist="phrase category location"/>
|
인풋을 수락하고 블로그 포스트를 만들려면, 인풋에 대한 매개변수들을 파싱한 다음 블로그 포스트 콘텐트 상세를 BlogPost 클래스 인스턴스의 PostIt() 메소드에 제출해야 한다. (Listing 11)
Listing 11. 인풋 파싱과 블로그 포스트 만들기
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = null;
out = res.getWriter();
res.setContentType("text/xml");
this.bp.PostIt( req.getParameter("title"),
req.getParameter("title") +
". I am currently located in " +
req.getParameter("location"),
Integer.parseInt(req.getParameter("category")));
printHeader(out);
out.println("<form><block>" +
"<prompt>Blog posted</prompt><disconnect/>" +
"</block></form>");
printFooter(out);
}
|
이제, 원하는 문장, 위치, 카테고리를 말함으로써, 어떤 음성으로도 블로그 포스트를 만들 수 있어야 한다.
이제, Twitter를 음성화 하여 미니 블로그를 만드는 방법을 알아보자.
Twitter
Twitter는 최근 많은 관심을 받고 있는 Web 2.0 서비스이다. (참고자료) 이 서비스로 웹 상에 친구 관련 탭을 유지할 수 있고, 핸드폰이나 인스턴트 메신저에도 유지할 수 있다. 여러분의 친구 역시 여러분과 관련한 탭을 가질 수 있다.
이 서비스의 개념은 짧은 텍스트(140 문자 미만)를 보내서 다른 사람들이 여러분이 어디에 있고, 무엇을 하고 있는지를 알 수 있도록 하는 것이다. 원래 간단한 상태 메시지를 위한 Twitter는 "퀵 블로그(quick blog)"로 변형되었다. 사람들은 자신의 즉각적인 생각들을 친구들에게 보낼 수 있다.
 |
Twitter의 한계 Twitter는 블로그와 같은 카테고리를 제공하지 않기 때문에, 위치 정보를 추가해야 한다. |
|
그렇다면, 이것이 음성 블로깅과 어떤 관련이 있는가? 모든 것이 다 연관되어 있다. 실시간 복사(transcription)은 옵션이 아니기 때문에, 사전 정의된 짧은 문장에서 선택해야 한다. Twitter에게는 딱 알맞다. 자주 사용하는 문장이 있다면, 이것을 사용할 수 있는지를 확인하거나, 사용자가 나중에 새로운 문장을 입력할 수 있는 웹 인터페이스를 제공할 수 있다.
전체 프로세스는 일반적인 블로깅 프로세스와 같지만, Twitter는 XML-RPC를 사용하지 않는다. 대신, 메시지를 제출하거나, HTTP POST 요청의 바디처럼 "tweet" 해야 한다. (Listing 12).
Listing 12. HTTP POST를 사용하여 Twitter에 게시하기
import java.net.*;
import java.io.*;
public class BlogPost {
public BlogPost(String user,
String pass, String status) {
try{
Authenticator.setDefault(new PostAuthenticator(user, pass));
URL url = new URL ("http://twitter.com/statuses/update.xml");
URLConnection conn = url.openConnection();
conn.setDoInput (true);
conn.setDoOutput (true);
conn.setUseCaches (false);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
DataOutputStream printout = new DataOutputStream (conn.getOutputStream ());
String requestBody = "status=" + URLEncoder.encode (status);
printout.writeBytes (requestBody);
printout.flush ();
printout.close ();
DataInputStream input = new DataInputStream (conn.getInputStream ());
String str;
while (null != ((str = input.readLine()))){
System.out.println (str);
}
input.close ();
} catch (Exception e){
e.printStackTrace();
}
}
public static void main (String args[]){
BlogPost bp = new BlogPost("myusername", "mypassword",
"Playing with voice blogging to the Twitter API!");
}
}
|
Authenticator를 보게 될 것이다. Listing 12에서, Twitter로 HTTP 연결을 하고, 연결을 통해 작성할 시스템에 말할 수 있다.
이것을 POST 요청으로 만드는 것은 매개변수(status)를 URL에 추가하는 것 보다는 실제 요청의 바디로서 보내진다는 사실이다.
요청을 update.xml 또는 update.json에 보내는지에 따라서, 알맞은 포맷으로 된 응답을 얻을 수 있고, 필요할 경우 이를 검사할 수 있지만, 블로깅에는 꼭 그럴 필요는 없다.
물론, 다른 사람이 여러분의 Twitter를 업데이트 하기를 원치 않는다면, 인증을 제공해야 한다. 클래스에서 보았던 Authenticator가 바로 그것이다.
Authenticator 클래스는 추상 클래스이기 때문에, 이를 하위 클래스로 나누어서 getPasswordAuthentication() 메소드를 구현하여 사용자 이름과 패스워드를 저장해야 한다. (Listing 13).
Listing 13. 서버 인증하기
import java.net.Authenticator;
import java.net.PasswordAuthentication;
public class PostAuthenticator extends Authenticator {
private String user;
private String pass;
public PostAuthenticator (String user, String pass){
this.user = user;
this.pass = pass;
}
protected PasswordAuthentication getPasswordAuthentication(){
char[] passwd = new String(this.pass).toCharArray();
PasswordAuthentication auth = new PasswordAuthentication(this.user, passwd);
return auth;
}
} |
객체를 리턴하면 대게는 Authenticator 클래스용 디폴트로서 이를 설정할 수 있는데, 자바 서블릿은 이것이 URLConnection의 인증 요구에 직면할 때 체크한다.
최종 결과는 여러분 마음대로 "tweet" 할 수 있다.
요약
이 글에서, VoiceXML을 사용하는 블로깅 솔루션을 구현하여 블로그 포스트를 만드는 인풋 메소드를 제공하는 방법을 배웠다. 안타깝게도, 복사 또는 딕테이션(dictation)이 광범위하게 지원되지 않기 때문에 무료 폼 인풋 대신에, 상세한 문법 스팩을 통해 간단한 구문을 사용했다. 이것은 Twitter에도 잘 작동한다. 현재 위치를 기술하는 기능을 추가하기도 했다.
자바 서블릿으로 작성된 애플리케이션은 쿼리 정보를 만들고 포스트 제출 전에 인풋을 파싱한다.
본 시리즈 Part 4에서는 VoiceXML을 인풋으로 취하고 기본 웹 검색과 Yahoo 로컬 검색에 Yahoo Search API를 쿼리하는 애플리케이션을 개발할 것이다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| Part 3 샘플 코드 | x-voicexml3-blog.zip | 5KB | HTTP |
|---|
참고자료 교육
-
자바 웹 개발자 프레임웍에서 VoiceXML 페이지 생성하기, Part 1: 자바 서블릿과 JSP를 사용하여 VoiceXML 생성하기 (Brett McLaughlin, developerWorks, 2006년 1월)
-
자바 웹 개발자 프레임웍에서 VoiceXML 페이지 생성하기, Part 2: 자바 기반 VoiceXML 애플리케이션 확대하기 (Brett McLaughlin, developerWorks, 2006년 1월)
-
VoiceXML 2.1 스펙
-
IBM XML 인증
-
XML 기술 라이브러리(영문): developerWorks XML 존에서 광범위한 기술 자료, 팁, 튜토리얼, 표준, IBM Redbook을 접할 수 있다.
-
developerWorks 기술 이벤트와 웹캐스트
-
technology
bookstore
제품 및 기술 얻기
토론
필자소개  | 
|  | Martin Brown은 8년 경력의 전문 작가이다. 다양한 주제로 많은 책과 기술 자료을 쓰고 있다. Perl, Python, Java, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows, Solaris, Linux, BeOS, Mac OS/X 같은 개발 플랫폼과 웹 프로그래밍, 시스템 관리와 통합 분야를 다루고 있다. Martin은 ServerWatch.com, LinuxToday.com, IBM developerWorks에 정기적으로 기고하고 있으며, Computerworld, The Apple Blog, Subject Matter Expert (SME) for Microsoft에 블로그를 운영하고 있다. (http://www.mcslp.com) |
기사에 대한 평가
|  |