时间:2021-07-01 10:21:17 帮助过:3人阅读
代码片2:服务接口实现
package webservice;
import java.io.IOException;
import java.lang.reflect.Array;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import cn.edu.neu.dinner.app.WMMP.factory.MinaClient;
import cn.edu.neu.dinner.app.WMMP.factory.NotifyObject;
import cn.edu.neu.dinner.app.WMMP.factory.TransObject;
/**
* @author 孟政宇 SEI的具体实现 Service endpoint interface
*/
// 使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl
@WebService
public class ServiceDemoImpl implements WebServiceI {
@Override
public String soa(String name) {
System.out.println("测试调用");
return ("你的名字:" + name);
}
@Override
public ArrayList<Userbean> getInfoByID(int id) throws Exception {
// 通过ID查询
System.out.println("调用方法成功yeah!");
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/soa?user=root&password=123456");
java.sql.Statement sql = conn.createStatement();
StringBuffer sb = new StringBuffer();
sb.append("SELECT *");
sb.append(" FROM ");
sb.append(" user ");
sb.append(" WHERE ID =");
java.sql.ResultSet rs = sql
.executeQuery(sb.toString() + "‘" + id + "‘");
ArrayList<Userbean> list = new ArrayList<Userbean>();
Userbean ub = new Userbean();
while (rs.next()) {
ub.setId(rs.getString(1));
ub.setName(rs.getString(2));
ub.setDept(rs.getString(3));
ub.setBirthday(rs.getString(4));
ub.setLocation(rs.getString(5));
ub.setRank(rs.getString(6));
ub.setDateIn(rs.getString(7));
list.add(ub);
}
return list;
}
@Override
public ArrayList<Userbean> getInfoByDD(String Dept, String rank) throws Exception {
// 联合查询
System.out.println("调用方法成功yeah!");
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost:3306/soa?user=root&password=123456");
java.sql.Statement sql = conn.createStatement();
StringBuffer sb = new StringBuffer();
sb.append("SELECT *");
sb.append(" FROM ");
sb.append(" user ");
sb.append(" WHERE dept=");
java.sql.ResultSet rs = sql
.executeQuery(sb.toString() + "‘" + Dept + "‘"+ "and rank=" +"‘"+rank+"‘");
ArrayList<Userbean> list = new ArrayList<Userbean>();
while (rs.next()) {
Userbean ub = new Userbean();
ub.setId(rs.getString(1));
ub.setName(rs.getString(2));
ub.setDept(rs.getString(3));
ub.setBirthday(rs.getString(4));
ub.setLocation(rs.getString(5));
ub.setRank(rs.getString(6));
ub.setDateIn(rs.getString(7));
list.add(ub);
}
return list;
}
@Override
public boolean sayHello(String name) {
System.out.println("WebService sayHello " + name);
return true;
}
代码片3:自定义复杂类型(必须实现序列化)
package webservice;
import java.io.*;
public class Userbean implements Serializable{
private String id;
private String name;
private String dept;
private String birthday;
private String location;
private String rank;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
public String getDateIn() {
return dateIn;
}
public void setDateIn(String dateIn) {
this.dateIn = dateIn;
}
private String dateIn;
}
代码片4:服务发布类
package webservice;
import javax.xml.ws.BindingType;
import javax.xml.ws.Endpoint;
/**
* @author 孟政宇
*
* 发布Web Service
*/
@BindingType("http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/")
public class WebServicePublish {
public static void main(String[] args) {
//定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx
String address = "http://127.0.0.1:8989/hdfs/webservice";
//使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用
/**
*参数1:服务的发布地址
*参数2:服务的实现者
*/
Endpoint.publish(address , new ServiceDemoImpl());
System.out.println("发布webservice成功!");
}
}
实现思路:
为了验证服务端是否发布成功,我们可以采用三种方式来验证。
一.采用jdk自带工具wsimport来生成客户端,并编写客户端程序测试。
二.使用诸如MyEclipse(Eclipse for Jave EE也可以)创建一个Web Service Client的项目
三.本地编程实现,这里我采用编程实现。即编写client类,由于服务已经发布,故可以通过指定服务的URI和服务类对象,创建service对象调用getPort方法访问服务端口,并调用远端服务。
实现代码:
//服务器起来后,调用服务
//在客户端需要将wsimport导出的文件夹和Userbean考到客户端目录,且不能
//更改文件名
package webservice;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Scanner;
public class client {
public static void main(String[] args) throws Exception_Exception, MalformedURLException {
URL url = new URL("http://127.0.0.1:8989/hdfs/webservice?wsdl");
// 第一个参数是服务的URI
// 第二个参数是在WSDL发布的服务名
QName qname = new QName("http://webservice/","ServiceDemoImplService");
// 创建服务
Service service = Service.create(url, qname);
ServiceDemoImpl sd = service.getPort(ServiceDemoImpl.class);
System.out.println("**********************web服务1测试**********************");
System.out.println("根据ID查询信息,请输入ID编号:");
Scanner scanner=new Scanner(System.in);
String ID=scanner.nextLine();
ArrayList<Userbean> list = new ArrayList<Userbean>();
list = (ArrayList<Userbean>)sd.getInfoByID(ID);
System.out.println("查询结果:");
for(int i=0 ; i< list.size() ; i++){
System.out.print("员工号:" + list.get(i).getId() + " ");
System.out.print("员工名称:" + list.get(i).getName() + " ");
System.out.print("所在部门:" + list.get(i).getDept() + " ");
System.out.println("出生日期:" + list.get(i).getBirthday() + " ");
System.out.print("职位:" + list.get(i).getLocation() + " ");
System.out.print("职称:" + list.get(i).getRank() + " ");
System.out.println("入职日期:" + list.get(i).getDateIn() + " ");
}
System.out.println("**********************web服务1测试**********************");
// System.out.println("**********************web服务2测试**********************");
// System.out.println("根据部门、职称查询信息,请输入参数:");
// Scanner scanner=new Scanner(System.in);
// String dept=scanner.nextLine();
// String rank=scanner.nextLine();
// ArrayList<Userbean> list = new ArrayList<Userbean>();
// list = (ArrayList<Userbean>)sd.getInfoByDD(dept,rank);
//
// System.out.println("查询结果:");
// for(int i=0 ; i< list.size() ; i++){
// System.out.print("员工号:" + list.get(i).getId() + " ");
// System.out.print("员工名称:" + list.get(i).getName() + " ");
// System.out.print("所在部门:" + list.get(i).getDept() + " ");
// System.out.println("出生日期:" + list.get(i).getBirthday() + " ");
// System.out.print("职位:" + list.get(i).getLocation() + " ");
// System.out.print("职称:" + list.get(i).getRank() + " ");
// System.out.println("入职日期:" + list.get(i).getDateIn() + " ");
// }
// System.out.println("**********************web服务2测试**********************");
//
// }
}}
结果展示:
Web服务1测试:客户端通过输入员工的ID编号,传递参数到服务端,服务端调用服务getInfoByID并返回一个ArrayList类型的参数,客户端获取参数解析并显示,如图所示。
Web服务2测试:客户端通过输入员工的部门和职称两个参数,服务端调用服务getInfoByDD,并返回一个ArrayList类型的参数,客户端获取参数解析并显示,如图所示。
问题:服务器向客户端传递的list为object无法解析为自定义的Userbean
解决方法:采用序列化的方式,在自定义的Javabean类实现Serializable即可
基于Jax-WS和Mysql数据库的WEB服务开发
标签: