Java 在由标记分隔的一行中返回多个值的Web服务
我需要构建一个从数据库返回多行的web服务,每行应该包含几个由标记分隔的字段。我使用Netbeans创建了这个ws,它在glassfish服务器上运行。我只返回了包含字符串的标记行,字符串由连接的值字段组成。你能就如何修改我的报税表给我一些建议吗 现在,我的web服务返回如下所示:Java 在由标记分隔的一行中返回多个值的Web服务,java,xml,web-services,netbeans,tags,Java,Xml,Web Services,Netbeans,Tags,我需要构建一个从数据库返回多行的web服务,每行应该包含几个由标记分隔的字段。我使用Netbeans创建了这个ws,它在glassfish服务器上运行。我只返回了包含字符串的标记行,字符串由连接的值字段组成。你能就如何修改我的报税表给我一些建议吗 现在,我的web服务返回如下所示: <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/en
<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:extractCSResponse xmlns:ns2="http://ws/">
<ROW xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"><Firstname>Mark</Firstname><Lastname>Thomas</Lastname><ID>1112546</ID></ROW>
<ROW xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"><Firstname>Mike</Firstname><Lastname>Jackson</Lastname><ID>1112547</ID></ROW>
</ns2:extractCSResponse>
</S:Body>
</S:Envelope>
我的报税表需要如下所示:
<S:Body>
<ns2:extractCSResponse xmlns:ns2="http://ws/">
<ROWS>
<ROW>
<Firstname>Mark</Firstname>
<Lastname>Thomas</Lastname>
<IDname>1112546</IDname>
</ROW>
<ROW>
<Firstname>Mike</Firstname>
<Lastname>Jackson</Lastname>
<IDname>1112547</IDname>
</ROW>
</ROWS>
</ns2:extractCSResponse>
</S:Body>
Java代码如下:
@WebService(serviceName = "GetCS2")
@Stateless()
public class GetCS2 {
/**
* This is a sample web service operation
*/
@WebMethod(operationName = "extractCS")
@WebResult(name = "ROW")
public List extractCS()
{
List l = new ArrayList();
//username and password for database connection
String userName = "username";
String password = "password";
//db connection
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver://172.19.125.222:1433"+";databaseName=Test";
Connection con = DriverManager.getConnection(url, userName, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from list");
//loop through selection
while(rs.next())
{
l.add("<Firstname>" + rs.getString("fn") + "</Firstname>" + "<Lastname>" + rs.getString("ln") + "</Lastname>" + "<IDname>" + rs.getDate("ID") + "</ID>");
}
//close connections
stmt.close();
rs.close();
con.close();
} catch(SQLException e)
{
System.out.println("SQL Exception: " + e.toString());
}
catch(ClassNotFoundException cE)
{
System.out.println("Class Not Found Exception: " + cE.toString());
}
return l;
}
}
编辑以显示基本示例,以防有一天链接不再包含此信息
我通常试图通过连接字符串来避免构建xml。这很容易出错,可能包含无效的xml数据,如果名称包含该数据会怎么样&或者我用一个简单的示例编辑了我的答案。希望对你有帮助谢谢!我以我想要的方式成功地返回了XML。基本上,我必须创建一个新的Person类,并且必须使用诸如:XmlElement、XmlAttribute和XmlSeeAllimport javax.xml.bind.annotation.*。我忘了提到我还返回了一个列表,就像你说的那样。谢谢
@XmlRootElement(name = "Person")
public class Person{
private String firstName;
private String lastName;
private String idName;
....
}
@XmlRootElement(name = "PersonWrapper")
public class PersonWrapper{
private List<Person> persons;
@XmlElementWrapper(name = "PersonList")
@XmlElement(name = "Person")
public List getPersons(){
return persons;
}
....
}
List<Person> personList=new ArrayList<Person>();
while(rs.next())
{
personList.add(new Person(rs.getString("fn"),rs.getString("lastName"),...));
}
PersonWrapper pw=new PersonWrapper();
pw.setPersons(personList);
JAXBContext context = JAXBContext.newInstance(PersonWrapper.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//write to system.out or any other OutputStream (ByteArrayOutputStream)
m.marshal(pw, System.out);
//OR write to xml file
m.marshal(pw, new File("person.xml"));