java jws-_java JWS 应用及实践
1. 接口类
package bob.webservice.jwsTest;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IMyService {
@WebResult(name="addResult")
public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);
@WebResult(name="loginUser")
public User login(@WebParam(name="username")String username,@WebParam(name="password")String password);
}
2. 实现类
package bob.webservice.jwsTest;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService(endpointInterface="bob.webservice.jwsTest.IMyService") //这里必须是可以检索到的全路径
public class MyServiceImpl implements IMyService {
public MyServiceImpl() {
// TODO Auto-generated constructor stub
}
@Override
public int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a+b;
}
@Override
public User login(@WebParam(name = "username") String username,
@WebParam(name = "password") String password) {
System.out.println(username + " is logging");
User user = new User();
user.setId("1");
user.setUsername(username);
user.setPassword(password);
return user;
}
}
涉及到的实体类
package bob.webservice.jwsTest;
public class User {
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private String id;
private String username;
private String password;
}
3.生产 及注册 WS服务
package bob.webservice.jwsTest;
import javax.xml.ws.Endpoint;
public class MyServer {
public MyServer() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
String address = "http://localhost:8882/ns";
Endpoint.publish(address, new MyServiceImpl());
System.out.println("JAX-WS WebService 服务已启动 发布成功!!!!");
}
}
4. 本地客户端模拟调用
package bob.webservice.jwsTest;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestClient {
public TestClient() {
// TODO Auto-generated constructor stub
}
//Wsimport -d C:/work/me/default/marsworkspace/javaProject/bobTest/ -keep -verbose http://localhost:8882/ns?wsdl
//
public static void main(String[] args) {
try {
//创建访问wsdl服务地址的url
URL url = new URL("http://localhost:8882/ns?wsdl"); //URL接口知道,但是下面的未必公开
//通过QName指明服务的和具体信息
//反方向
QName sname= new QName("http://jwsTest.webservice.bob/","MyServiceImplService");
//创建服务
Service service = Service.create(url,sname);
//实现接口
IMyService ms =service.getPort(IMyService.class);
System.out.println(ms.add(12, 33));
System.out.println(ms.add(1, 3));
User user = ms.login("bob", "123456");
System.out.println("current userId = "+user.getId()+" name:"+user.getUsername());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样的问题, 这个地址 是对外公开的,但是其他客户端的类包就没有公开,换句话讲,没法用
URL url = new URL("http://localhost:8882/ns?wsdl"); //URL接口知道,但是下面的未必公开
我们可以通过jdk,使用导出命令,将wsdl中的接口描述来生成这个接口以及实现类,然后将生成的接口和实现类应用在我们自己的java程序中就可以了,具体的生成命令是:Wsimport -d C:/work/me/default/marsworkspace/javaProject/bobTest/ -keep -verbose http://localhost:8882/ns?wsdl

可以集成到本地,(User.java IMyService.java)进行访问及调用。
要提醒指出的是,wsimport可以用于非Java的服务器端,如:服务器端也许是C# 编写的web service,通过wsimport则生成Java的客户端实现。
命令参数说明:
-d 生成客户端执行类的class文件的存放目录
-s 生成客户端执行类的源文件的存放目录
-p 定义生成类的包名
