我的项目环境:eclipse 、SSH框架
最近在学习webserivce在java的使用,做了一个小例子。
1、我的项目结构
以上也是我项目中用到的全部包。
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@WebService(targetNamespace = " http://webservice.service")
@SOAPBinding
public interface DemoForWebService {
@WebMethod(operationName = "getUserById", action = " http://sap.com/xi/WebService/soap1.1")
public User getUserById(@WebParam(name = "xtczdm") String xtczdm) throws Exception;
public String updateUserByCmd(User user) throws Exception;
实现类继续上面的接口:DemoForWebServiceImpl
import javax.sql.DataSource;
import service.webservice.DemoForWebService;
* @author 作者 ZBY E-mail: zby@topcase.com.cn
* @version 创建时间:2013-3-13 上午09:57:46
* 类说明
*/
@WebService(endpointInterface = "service.webservice.DemoForWebService",targetNamespace=" http://webservice.service/",portName="HTTP_Port")
private DataSource dataSource;//数据源
private UserService userService;//我用到的对象对应的serivce,主要用于下面对数据库的访问
public User getUserById(String xtczdm) throws Exception {
// TODO Auto-generated method stub
User user = userService.findUserByXtczdm(xtczdm);
return user;
}
// TODO Auto-generated method stub
String result = "True";
String xtczdm = user.getXtczdm();
User u = userService.findUserByXtczdm(xtczdm);
if(u!=null){
u.setXtczkl(user.getXtczkl());
userService.persistUser(u);
result = u.getXtczkl();
}else{
result ="false";
}
return result;
}
return dataSource;
}
this.dataSource = dataSource;
}
return userService;
}
this.userService = userService;
}
}
3、配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<context:annotation-config />
<!-- 为刚建的接口 配置spring配置文件 bean id = 接口名的首字母缩写,这是我们公司规范,呵呵。
请注意的时,这个ID 将是下面配置webserivce endpoint 中implementor 要引用的值。
-->
<bean id="demoForWebService" parent="baseTransactionProxy">
<property name="proxyTargetClass" value="true" />
<property name="target">
<bean class="service.webservice.impl.DemoForWebServiceImpl">
<property name="dataSource" ref="dataSource"/><!-- 对比这两个属性,和实现类中引用的两个对象是一样的。spring配置大家还是根据自己的规范来-->
<property name="userService" ref="UserService"/>
</bean>
</property>
</bean>
<!--
<jaxws:endpoint id="demoForWebSerivceWebSerivce" implementor="service.webservice.impl.DemoForWebSerivceImpl" address="/demoForWebSerivce" />
-->
<jaxws:endpoint id="demoForWebServiceWebService" implementor="#demoForWebService" address="/demoForWebService" />
<!-- implementor = 接口bean 的id
address = url访问时的路径
-->
</beans>
(2)要把(1)生成的文件,加入到applicationContext.xml,这主要是Spring的要求
<import resource="config/beanRef-service-webservice.xml" />
(3)在你的web.xml文件中增加如下内容:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
红色部分在后面的URL中要用到。
4、测试是否配置成功
启动项目后,使用url访问。
这是我的访问URL:http://127.0.0.1:8080/InterfaceControlApp/webservice/demoForWebService?wsdl
解析:
http://IP:端口号/项目访问名/web中配置url-pattern/beanRef-service-webservice.xml配置的address?wsdl
成功后:
5、客户端调用
我主要是通过写main调用
方法一:使用cxf 写客户端调用
在common包下新增clientWS.java
源码:
package common;
import java.beans.PropertyDescriptor;
import java.net.URL;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.corba.wsdl.ObjectFactory;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.service.Service;
import org.apache.cxf.service.model.BindingInfo;
import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.service.model.MessagePartInfo;
import org.apache.cxf.service.model.ServiceInfo;
import dao.code.model.User;
import service.webservice.DemoForWebService;
import service.webservice.impl.DemoForWebServiceImpl;
/**
* @author 作者 E-mail:
* @version 创建时间:2013-3-19 下午01:46:47
* 类说明 http://127.0.0.1:8080/InterfaceControlApp/webservice/demoForWebService?wsdl
*/
public class clientWS {
public static void main(String args[]) throws Exception {
/*
* 方法三*/
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(DemoForWebService.class);
// 设置WebService地址
factory.setAddress("http://127.0.0.1:8080/InterfaceControlApp/webservice/demoForWebService");
DemoForWebService dfw = (DemoForWebService) factory.create();
System.out.println("invoke webservice...");
String xtczdm ="admin";
//根据操作代码得到用户
User user = dfw.getUserById(xtczdm);
if(user != null){
WebLogs.getLogger().info("user is not null!");
//修改用户密码
user.setXtczkl("test");
String result = dfw.updateUserByCmd(user);
WebLogs.getLogger().info("新密码:"+result);
}else{
WebLogs.getLogger().info("NULL !");
}
}
}
运行成功后:
方法二:使用wsdl2java生成客户端
1、需要 一个包:apache-cxf-2.6.1.gz
这个包里有好多jar包,一定要下载下来。
将此包解压,我是放在:E:\CXF\apache-cxf-2.6.1
然后再拷贝到项目里
生成文件路径 :文件存放路径,可以直接写项目路径
wsdl文件:在IE中执行服务端URL显示的XML另存为XML文件。
import javax.xml.ws.Service;
import service.webservice.client.demo.DemoForWebServiceImplService;
import service.webservice.client.demo.User;
/**
* @author 作者 E-mail:
* @version 创建时间:2013-3-20 下午03:39:29
* 类说明
*/
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Service service = Service.create(DemoForWebServiceImplService.SERVICE);
service.addPort(DemoForWebServiceImplService.HTTPPort, javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
// DMSSender dms = service.getPort(DMSSender.class);
DemoForWebService dms = service.getPort(DemoForWebServiceImplService.HTTPPort,DemoForWebService.class);
User user;
try {
user = dms.getUserById("admin");
System.out.println(user.getXtczdm());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
成功后: