(十一)web服务与javaweb结合(2)
一、解决问题及解决方法
- 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致。
- 解决方案:将webService绑定到web工程中,使得共用一个端口。
二、案例
2.1 创建一个web工程名:web_webService
2.2 编写两个服务接口
- 注意:
- 本例使用apache CXF3.2.0的框架来架构webService服务
- 在接口定义之前加上@WebService标注,表明这是一个WebService服务,否则在生成服务端时不能找到相应的接口;
- 这里@WebService标注的targetNamespace一定要填写内容,不然在生成WebService服务端的时候会报如下的错误,这个命名空间起始就是包名的倒序。
package www.shyroke.com; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService(targetNamespace="http://service.shyroke.com/") public interface IFirst { @WebResult(name="addResult") public int add(@WebParam(name="x")int x,@WebParam(name="y")int y); }
package www.shyroke.com; import javax.jws.WebResult; import javax.jws.WebService; /** * 锟节讹拷锟斤拷锟接口凤拷锟斤拷 * 锟斤拷锟节伙拷取锟斤拷前系统时锟斤拷 * @author Administrator * */ @WebService(targetNamespace="http://service.shyroke.com/") public interface ISecond { @WebResult(name="getSysTimeResult") public String getSysTime(); }
2.2 编写服务接口实现类
package www.shyroke.com; import javax.jws.WebService; @WebService(endpointInterface="www.shyroke.com.IFirst") public class FirstImpl implements IFirst { @Override public int add(int x, int y) { return x+y; } }
package www.shyroke.com; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.jws.WebService; @WebService(endpointInterface = "com.shyroke.service.ISecond") public class SecondImpl implements ISecond { @Override public String getSysTime() { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); return dateFormat.format(date); } }
2.3 发布服务并把服务绑定到web工程
- 生成webService服务 : File->New->Other->Web Services->WebService,在Service implementation中选择提供服务的实现类。
- 上述发布了第一个服务并绑定到了web工程,第二个服务的发布也按照上面图的操作来做即可。
- 发布完两个服务的项目结构为下图:
-
- 注意: 1. 到现在为止如果开启服务器会报错,因为工具在cxf-beans.xml中生成了如下,而我们在该目录下并没有,所以要把这三行去掉:
<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" />
- 注意: 2. 在cxf-beans.xml中把<jaxws:endpoint>属性里面有serviceName的属性和endpointName和address属性去掉,如下:
<?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:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <jaxws:endpoint xmlns:tns="http://service.shyroke.com/" id="first" implementor="www.shyroke.com.FirstImpl" wsdlLocation="wsdl/firstimpl.wsdl"> <jaxws:features> <bean class="org.apache.cxf.feature.LoggingFeature" /> </jaxws:features> </jaxws:endpoint> <jaxws:endpoint xmlns:tns="http://service.shyroke.com/" id="second" implementor="www.shyroke.com.SecondImpl" wsdlLocation="wsdl/secondimpl.wsdl"> <jaxws:features> <bean class="org.apache.cxf.feature.LoggingFeature" /> </jaxws:features> </jaxws:endpoint> </beans>
- 注意:3. 修改 firstimpl.wsdl和secondimpl.wsdl文件中的端口号,不能和tomcat工程一致(本例中的tomcat端口号为8080)
- firstimpl.wsdl
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="FirstImplService" targetNamespace="http://com.shyroke.www/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.shyroke.www/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://service.shyroke.com/"> <wsdl:import namespace="http://service.shyroke.com/" location="IFirst.wsdl"> </wsdl:import> <wsdl:binding name="FirstImplServiceSoapBinding" type="ns1:IFirst"> <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="add"> <soap12:operation soapAction="" style="document"/> <wsdl:input name="add"> <soap12:body use="literal"/> </wsdl:input> <wsdl:output name="addResponse"> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="FirstImplService"> <wsdl:port name="FirstImplPort" binding="tns:FirstImplServiceSoapBinding"> <soap12:address location="http://localhost:8082/web_webService/services/FirstImplPort"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
- secondimpl.wsdl
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions name="SecondImplService" targetNamespace="http://com.shyroke.www/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.shyroke.www/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://service.shyroke.com/"> <wsdl:import namespace="http://service.shyroke.com/" location="ISecond.wsdl"> </wsdl:import> <wsdl:binding name="SecondImplServiceSoapBinding" type="ns1:ISecond"> <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getSysTime"> <soap12:operation soapAction="" style="document"/> <wsdl:input name="getSysTime"> <soap12:body use="literal"/> </wsdl:input> <wsdl:output name="getSysTimeResponse"> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="SecondImplService"> <wsdl:port name="SecondImplPort" binding="tns:SecondImplServiceSoapBinding"> <soap12:address location="http://localhost:8081/web_webService/services/SecondImplPort"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
-
2.4 启动服务
- 查看web.xml ,可知webservice的端口url-pattern
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>web_webService</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description>Apache CXF Endpoint</description> <display-name>cxf</display-name> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <session-config> <session-timeout>60</session-timeout> </session-config> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/cxf-beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
2.5 生成客户端
-
用工具生成客户端(具体步骤查看前几章)
2.6 测试
package www.chyroke.com.test; import com.shyroke.service.IFirst; import www.shyroke.client.FirstImplService; public class TestkMain { public static void main(String[] args) { FirstImplService firstService=new FirstImplService(); IFirst iFirst=firstService.getFirstImplPort(); System.out.println("result==="+iFirst.add(5, 8)); } }
结果:
- 缺陷:虽然将webservice和web项目绑定在了一起,但是还是不能共同一个端口。