于是,我们的示例invoke方法就会是下面这个样子。
public Source invoke(Source source) {
try {
MessageContext mc = wsContext.getMessageContext();
// check for a PATH_INFO request
String path = (String)mc.get(MessageContext.PATH_INFO);
if (path != null && path.contains("/num1") &&
path.contains("/num2")) {
return createResultSource(path);
}
throw new HTTPException(404);
} catch(Exception e) {
e.printStackTrace();
throw new HTTPException(500);
}
}
你会发现,如果MessageContext.PATH_INFO没有找到,该示例会抛出HTTPException(404)异常。我们的示例终端并不抛出该异常,而是能为方法参数检查请求字符串。例如MessageContext.PATH_INFO,请求字符串可以用下面的代码从 MessageContext中获得。
String query = (String)mc.get(MessageContext.QUERY_STRING);
于是,我们可以把请求字符串传递到createResultSource(String str)方法中来解析参数,如果要为我们的示例部署一个servlet容器也可以使用标准ServletRequest对象来抽取请求字符串。而如果我们想部署一个基于Java SE的终端,我们就必须使用MessageContext.QUERY_STRING。
下面的代码获取了num1和num2的值,相加后调用createResultSource(int sum)方法来创建Source对象,它将从invoke方法中被返回。
ServletRequest req = (ServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
int num1 = Integer.parseInt(req.getParameter("num1"));
int num2 = Integer.parseInt(req.getParameter("num2"));
return createResultSource(num1+num2);
至此,我们的AddNumbers类应该如下所示:
public class AddNumbersImpl implements Provider {
@Resource
protected WebServiceContext wsContext;
public Source invoke(Source source) {
try {
MessageContext mc = wsContext.getMessageContext();
// check for a PATH_INFO request
String path = (String)mc.get(MessageContext.PATH_INFO);
if (path != null && path.contains("/num1") &&
path.contains("/num2")) {
return createResultSource(path);
}
String query = (String)mc.get(MessageContext.QUERY_STRING);
System.out.println("Query String = "+query);
ServletRequest req = (ServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
int num1 = Integer.parseInt(req.getParameter("num1"));
int num2 = Integer.parseInt(req.getParameter("num2"));
return createResultSource(num1+num2);
} catch(Exception e) {
e.printStackTrace();
throw new HTTPException(500);
}
}
private Source createResultSource(String str) {
StringTokenizer st = new StringTokenizer(str, "=&/");
String token = st.nextToken();
int number1 = Integer.parseInt(st.nextToken());
st.nextToken();
int number2 = Integer.parseInt(st.nextToken());
int sum = number1+number2;
return createResultSource(sum);
}
private Source createResultSource(int sum) {
String body =
"<ns:addNumbersResponse xmlns:ns=\"http://duke.org\"><ns:return>"
+sum
+"</ns:return></ns:addNumbersResponse>";
Source source = new StreamSource(
new ByteArrayInputStream(body.getBytes()));
return source;
}
}
