webservice如今开发运用已经很容易了,这都得益于巨头们的努力.众多框架:cxf……
这个示例也是用的cxf,这是我的第一个webservice 例子,jar包这里没有上传,可以到官网下载。
HelloService.java代码:
package org.iteye.bbjava.ws.service;
import javax.jws.WebService;
@WebService
public interface HelloService {
String sayHi(String text);
}
HelloServcieImpl.java代码:
package org.iteye.bbjava.ws.service.impl;
import javax.jws.WebService;
import org.iteye.bbjava.ws.service.HelloService;
@WebService(endpointInterface = "org.iteye.bbjava.ws.service.HelloService")
public class HelloServiceImpl implements HelloService {
public String sayHi(String text) {
System.out.println("sayHi called");
return "Hello " + text;
}
}
applicationContext.xml:
<?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.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-servlet.xml" />
<jaxws:endpoint id="helloService" implementor="#hello"
address="/HelloServiceImpl" />
<bean id="hello" class="org.iteye.bbjava.ws.service.impl.HelloServiceImpl" />
</beans>
web.xml:
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>ws-spring</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>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>/*</url-pattern>
</servlet-mapping>
</web-app>
配置的说明:
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
上面的url-pattern的作用比较重要,因为CXFServlet会“过虑”关相请求。我们就以上面的代码为例,在浏览器中输入
http://localhost:8080/ 会进入webservice相关页面,也就是说在正常的main.jsp它进不去了。
那如何解决呢?
请看:web.xml:
引用
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/service/ *</url-pattern>
HelloServiceImpl.java:
@WebService(endpointInterface = "org.iteye.bbjava.ws.service.HelloService",targetNamespace = "http://localhost:8080/service")
到此服务端的内容就结束了。
下面是
客户端了,
package org.iteye.bbjava.ws;
import org.iteye.bbjava.ws.service.HelloService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ClientTest {
private ClientTest() {
}
public static void main(String args[]) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "applicationContext.xml" });
HelloService client = (HelloService) context.getBean("helloService");
String response = client.sayHi("zhang");
System.out.println("Response: " + response);
}
}
客户端的:
applicationContext.xml:
<?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.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">
<bean id="helloService" class="org.iteye.bbjava.ws.service.HelloService"
factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"
value="org.iteye.bbjava.ws.service.HelloService" />
<property name="address" value="http://localhost:8080/ws-spring/HelloServiceImpl" />
</bean>
</beans>
配置的说明:
引用
在client.xml:
<property name="address" value="http://localhost:8080/ws-spring/HelloServiceImpl" />
改为
<property name="address" value="http://localhost:8080/ws-spring/service/HelloServiceImpl" />
服务端的applicationContext.xml 细则说明:
引用
客户端的applicationContext.xml细则说明:
引用
<bean id="helloService" class="org.iteye.bbjava.ws.service.HelloService"
factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"
value="org.iteye.bbjava.ws.service.HelloService" />
<property name="address" value="http://localhost:8080/ws-spring/HelloServiceImpl" />
</bean>
上面两行。
两个bean共同组成了一个webserive的接口客户端的核心,其中
<property name="address" value="http://localhost:8080/ws-spring/HelloServiceImpl" />
指出了,服务端的地址。(文字不好组织)