@Spancymath
2019-10-18T23:04:27.000000Z
字数 4963
阅读 868
java
什么是WebService?
基于web的服务,使用Web(HTTP)方式,接收和响应外部系统的某种请求,从而实现远程调用。
//1、添加注解
@WebService
public class OneService {
//2、至少包含一个可以对外公开的服务
public String sayHello(String name){
System.err.println("invoke "+name);
return "Hello "+name;
}
public static void main(String[] args) {
//3、第一个参数称为Binding即绑定地址,
//第二个参数是实现者,即谁提供服务
Endpoint.publish("http://localhost:9999/one", new OneService());
}
}
//4.在IE地址栏输入以下地址访问说明文件:
http://localhost:9999/one?wsdl
3.通过wsimport生成本地代码
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://192.168.0.100/one?wsdl
4.总结
WebService和Web服务器的区别:WebService是Web服务器的应用,Web服务器是WebService运行所必须的容器。
WebService其内部是通过Socket实现的。
WebService的特点:
通过ajax调用 (js+XML)
var xhr = new XMLHttpRequest();
function sedAjax() {
var url = "http://localhost:8081/hello";
var nameText = document.getElementById("name").value;
var request = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soap:Body><ns2:sayHi xmlns:ns2=\"http://server/\">" +
"<arg0>" + nameText + "</arg0></ns2:sayHi></soap:Body></soap:Envelope>";
$.ajax({
url: url,
type: "post",
contentType: "application/soap+xml;charset=utf-8",
data: request,
success: function (data) {
alert($(data).find("return").text());
}
})
}
SOAP请求过程分析
使用ServerFactoryBean发布应用
使用CXF发布一个服务,与JDK6发布一个服务完全不同
public class CxfServer1 implements ICxfServer1 {
public String sayHi(String name) {
return "Hello " + name;
}
public static void main(String[] args) {
//声明实例,使用ServerFactoryBean发布服务
//使用CXF发布一个服务,与JDK6发布一个服务完全不同
//* 即使是不使用@WebService注解,一样可以发布成功
//* 即使此类没有对外公布的方法一样可以发布成功
ServerFactoryBean bean = new ServerFactoryBean();
//绑定到发布地址的端口
bean.setAddress("http://localhost:8080/cxf");
//设置服务接口,如果没有接口,则为本类
bean.setServiceClass(ICxfServer1.class);
//设置接口实现类,即服务类
bean.setServiceBean(new CxfServer1());
//发布服务
bean.create();
System.err.println("启动成功");
}
}
使用JaxWsServerFactoryBean(建议使用此类)发布应用
public class HelloImpl implements IHello {
@Override
public String sayHi(String name) {
System.out.println("syaHi called");
return "Hello2 " + name;
}
public static void main(String[] args) {
//使用jaxWs对其进行发布
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//设置访问地址
bean.setAddress("http://localhost:8081/hello");
//注册服务接口
bean.setServiceClass(IHello.class);
//注册服务实现类
bean.setServiceBean(new HelloImpl());
//添加消息拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
bean.getOutInterceptors().add(new LoggingOutInterceptor());
//启动
bean.create();
System.out.println("服务启动完成...");
}
由于cxf的web项目已经集成了Spring所以,cxf的服务类都是在spring的配置文件中完成的。以下是步骤:
第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<!--<init-param>
<param-name>config-location</param-name>
<param-value>classpath:cxf-servlet.xml</param-value>
</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。
<?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"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap
http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 引入CXF Bean定义如下,早期的版本中使用 -->
<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" />
<!-- 简单发布,没有接口 -->
<jaxws:endpoint id="helloService" address="/hello" implementor="com.zhang.server1.HelloImpl">
<!--客户端请求的消息拦截器-->
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:inInterceptors>
<!--服务端响应的消息拦截器-->
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:outInterceptors>
</jaxws:endpoint>