,您 不能使用SOAP服务创建一个持久的结构,因为Web服务和访问它的信息仅在Web服务方法期间是可用的。这 是使用Web服务的限制之一,也是相应的解决方案(如 Web服务资源框架 (WSRF))存在的原因,因为它们 可以提供持久性。
幸运的是,对于这个特定的Web服务,您不需要持久性,但是您需要可靠地重新 创建问卷调查集合,以便在客户端访问问题1 时,他们可以获得问题1 的问题文本,而在他们访问问题2 时,问题2 的文本和选项是相同的。
您无法实现持久性,但是您可以创建一个方法,而该方法将 一致地创建问卷调查问题集合,以便不同 Web服务方法的调用每次都可以访问正确的信息。这正是 initialize() 方法的目的,它可以在调用时使用问卷调查信息来填充类全局的集合。
您可以在清 单 11 中看到导言部分。
清单 11. 导言部分
/**
* SQWSSOAPImpl.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
*/
package SQWS;
import java.io.*;
import java.util.*;
import java.sql.*;
public class SQWSSOAPImpl implements SQWS.SQWS_PortType {
Collection<SQWS.SurveyQuestion> survey = new ArrayList<SQWS.SurveyQuestion>();
private void initialize() {
this.survey.add(new SurveyQuestionText("Name",
"Enter your full name"));
this.survey.add(new SurveyQuestionRadio("Favourite colour",
"Enter your favourite colour",
new String[] {"Red", "Blue", "Green"}));
}
...
}
现在,您需要 开始为那些反映 SOAP 方法的方法定义相应的代码,从而实现 Web服务。
initializeSurvey 方法
initializeSurvey 方法为InitializeSurvey SOAP 方法实现了相应的代码,并且它是一个比较复 杂的方法,因为您需要连接到 DB2 数据库并执行在survey_response 表中创建一新行的SQL。正如您从本 系列文章前面的部分中所了解的,这个表中定义了一个自增列,在插入一行内容的时候可以生成一个唯一 的编号。
因此,这个方法与Web 接口版本中问卷调查回答代码的第一部分是相同的,其中打开了 到 DB2 数据库的连接,插入一行,然后获得所生成的唯一的ID。清单 12 中显示了initializeSurvey 方 法。
清单 12. initializeSurvey 方法
public int initializeSurvey() throws java.rmi.RemoteException {
ResultSet rs;
Statement s;
Integer responseid = -1;
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn =
DriverManager.getConnection("jdbc:db2://localhost:50000/SURVEY",
"survey","surveypw");
} catch (Exception ex) {
System.out.println("SQLException: " + ex.getMessage());
}
try {
s = conn.createStatement();
s.executeUpdate(
"INSERT INTO survey_response (responseid) "
+ "values (0)",
Statement.RETURN_GENERATED_KEYS);
rs = s.getGeneratedKeys();
if (rs.next()) {
responseid = rs.getInt(1);
} else {
System.out.println("Can''t get auto increment d
|