上一篇http://www.blogjava.net/freeman1984/archive/2010/01/13/309387.html主要说了个jax ws cs 结构的用法 在b/s结构中的使用:
环境:myeclipse 8.0,tomcat6.0 jdk 1.5+
1,首先new 一个web project
2,添加必须的jar (bulid path):
首先建立server端:
如果客户端使用是不是用myeclipse自动生成,我们在这建立一个接口:
@WebService
public interface ServerJaxI {
public List<User> getUser(User user);
}
当然@webServer 是必须的
接下来是实现:
@javax.jws.WebService(targetNamespace = "http://server.com/", endpointInterface="com.server.ServerJaxI", serviceName = "ServerJaxService", portName = "ServerJaxPort")
@SOAPBinding(style=Style.RPC)
public class ServerJax implements ServerJaxI{
public List<User> getUser(User user){
System.out.println("get User:"+user.getName());
return UserManager.getUsers();
}
}
其中User:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
UserManager:
public class UserManager {
private static List<User> users;
static{
users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setName("name_"+i);
user.setPwd("pwd_"+i);
users.add(user);
}
}
public static List<User> getUsers() {
// TODO Auto-generated method stub
return users;
}
}
然后我们使用myeclipse的根据bean生成webserver方法来产生配置文件:
点击项目--》new webservice 选择根据javaclass 生成:
然后就会看见 在web-info下多了sun-jaxws.xml
内容:
<?xml version = "1.0"?>
<endpoints version="2.0"
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="ServerJaxPort"
implementation="com.server.ServerJax"
url-pattern="/ServerJaxPort">
</endpoint></endpoints>
web.xml也发成了改变:被添加了相应的支持这些类都在前面添加的jar里面 如果不添加就会出现com.sun.xml.ws.transport.http.servlet.WSServletContextListener不能找到的错误。
<servlet>
<description>JAX-WS endpoint - ServerJaxService</description>
<display-name>ServerJaxService</display-name>
<servlet-name>ServerJaxService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServerJaxService</servlet-name>
<url-pattern>/ServerJaxPort</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener></web-app>
ok。现在我们部署项目启动 通过以下链接访问:htttp://localhost:8080//pro/ServerJaxPort 其中ServerJaxPort 是在sun-jaxws.xml里面定义的url-pattern 这是我们就能看见
我们发布的服务了:
客户端:
当然客户端可以通过myeclipse自动生成:我们采用不自动成的方式:也就是通过接口方式来获取(这也就是前面定义接口的原因),当然采取自动生成的方式话就不用定义接口:
当然采用接口的方式:就需要接口需要的类:
上面我们定义的接口:
@WebService
public interface ServerJaxI {
public List<User> getUser(User user);
}
要调用这个接口就需要User 和这个接口类
1,首先我们new 一个java project 将ServerJaxI 和User代码拷贝过来 包名相同:
然后就是我们的客户端代码
public class Clientj {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/jaxws/ServerJaxPort?wsdl");//wsdl 地址
QName qname = new QName("http://server.com/","ServerJaxService"); //其中第一个参数为:namespaceURI 第二个为servername
Service service = Service.create(url, qname);
ServerJaxI s = service.getPort(ServerJaxI.class);
User user = new User();
user.setName("qiaobing");
System.out.println(s.getUser(user).get(1).getName());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行就可以看见结果了。
示例代码下载:
//----------------------
map讲不能得到支持
因此可以简单的封装下,(或者通过XmlAdapter<ValueType, BoundType>来封装)
例如UserMap.java:
public class UserMap{
private HashMap<String, User> users;
public UserMap(){
users = new HashMap<String, User>();
}
public HashMap<String, User> getUsers() {
return users;
}
public void setUsers(HashMap<String, User> users) {
this.users = users;
}
public void put(String key,User user){
users.put(key, user);
}
public User get(String key){
return users.get(key);
}
}
这样就可以通过UserMap来传递map数据。
服务端:
/Files/freeman1984/jaxws.rar
客户端:
/Files/freeman1984/jaxwsclient.rar