[关闭]
@Spancymath 2019-10-18T23:04:27.000000Z 字数 4963 阅读 832

WebService

java


什么是WebService?

基于web的服务,使用Web(HTTP)方式,接收和响应外部系统的某种请求,从而实现远程调用。

名词解释

  1. XML: Extensible Markup Language - 扩展性标记语言
    用于传输格式化数据
  2. WSDL: WebService Description Language - Web服务描述语言
    通过XML形式说明服务在什么地方
    通过XML形式说明服务提供什么样的方法
  3. SOAP: Simple Object Access Protocol - 简单对象访问协议
    SOAP = 在HTTP的基础上+XML数据
    组成:Envelope(必须)+ Headers(可选)+ Body(必须)

在Java项目中发布WS服务

  1. 在类上添加@WebService注解
  2. 通过EndPoint发布一个WebService
    a.给类添加@WebService注解后,类中的所有非静态、非final方法都将会对外公布
    b.如果不希望某个方法不对外公开,可以在方法上添加@WebService(Exclude=true)
  1. //1、添加注解
  2. @WebService
  3. public class OneService {
  4. //2、至少包含一个可以对外公开的服务
  5. public String sayHello(String name){
  6. System.err.println("invoke "+name);
  7. return "Hello "+name;
  8. }
  9. public static void main(String[] args) {
  10. //3、第一个参数称为Binding即绑定地址,
  11. //第二个参数是实现者,即谁提供服务
  12. Endpoint.publish("http://localhost:9999/one", new OneService());
  13. }
  14. }
  15. //4.在IE地址栏输入以下地址访问说明文件:
  16. 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的特点:

客户端调用WebService

  1. 通过wsimport生成客户端代码
  2. 通过客户端编程的方式调用
  3. 通过ajax调用 (js+XML)

    1. var xhr = new XMLHttpRequest();
    2. function sedAjax() {
    3. var url = "http://localhost:8081/hello";
    4. var nameText = document.getElementById("name").value;
    5. var request = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
    6. "<soap:Body><ns2:sayHi xmlns:ns2=\"http://server/\">" +
    7. "<arg0>" + nameText + "</arg0></ns2:sayHi></soap:Body></soap:Envelope>";
    8. $.ajax({
    9. url: url,
    10. type: "post",
    11. contentType: "application/soap+xml;charset=utf-8",
    12. data: request,
    13. success: function (data) {
    14. alert($(data).find("return").text());
    15. }
    16. })
    17. }
  4. 通过URLConnection调用

SOAP请求过程分析

CXF

  1. 使用ServerFactoryBean发布应用
    使用CXF发布一个服务,与JDK6发布一个服务完全不同

    • 即使是不使用@WebService注解,一样可以发布成功
    • 即使此类没有对外公布的方法一样可以发布成功
    1. public class CxfServer1 implements ICxfServer1 {
    2. public String sayHi(String name) {
    3. return "Hello " + name;
    4. }
    5. public static void main(String[] args) {
    6. //声明实例,使用ServerFactoryBean发布服务
    7. //使用CXF发布一个服务,与JDK6发布一个服务完全不同
    8. //* 即使是不使用@WebService注解,一样可以发布成功
    9. //* 即使此类没有对外公布的方法一样可以发布成功
    10. ServerFactoryBean bean = new ServerFactoryBean();
    11. //绑定到发布地址的端口
    12. bean.setAddress("http://localhost:8080/cxf");
    13. //设置服务接口,如果没有接口,则为本类
    14. bean.setServiceClass(ICxfServer1.class);
    15. //设置接口实现类,即服务类
    16. bean.setServiceBean(new CxfServer1());
    17. //发布服务
    18. bean.create();
    19. System.err.println("启动成功");
    20. }
    21. }
  2. 使用JaxWsServerFactoryBean(建议使用此类)发布应用

    • JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
    • 但在CXF的API文档中没有提供此类API,请通过查看源代码的方式获取此类的帮助。
    • 此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不
      出错,但也不会对外暴露任何方法。
      使用此类生成的wsdl文件更加规范。
    1. public class HelloImpl implements IHello {
    2. @Override
    3. public String sayHi(String name) {
    4. System.out.println("syaHi called");
    5. return "Hello2 " + name;
    6. }
    7. public static void main(String[] args) {
    8. //使用jaxWs对其进行发布
    9. JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
    10. //设置访问地址
    11. bean.setAddress("http://localhost:8081/hello");
    12. //注册服务接口
    13. bean.setServiceClass(IHello.class);
    14. //注册服务实现类
    15. bean.setServiceBean(new HelloImpl());
    16. //添加消息拦截器
    17. bean.getInInterceptors().add(new LoggingInInterceptor());
    18. bean.getOutInterceptors().add(new LoggingOutInterceptor());
    19. //启动
    20. bean.create();
    21. System.out.println("服务启动完成...");
    22. }

WebService-CXF-Spring 基于web的cxf

  1. 由于cxf的web项目已经集成了Spring所以,cxf的服务类都是在spring的配置文件中完成的。以下是步骤:

    • 第一步:建立一个web项目。
    • 第二步:准备所有jar包。将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。
    • 第三步:在web.xml中配置cxf的核心servlet,CXFServlet。

      1. <servlet>
      2. <servlet-name>cxf</servlet-name>
      3. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
      4. <!--<init-param>
      5. <param-name>config-location</param-name>
      6. <param-value>classpath:cxf-servlet.xml</param-value>
      7. </init-param>-->
      8. <load-on-startup>1</load-on-startup>
      9. </servlet>
      10. <servlet-mapping>
      11. <servlet-name>cxf</servlet-name>
      12. <url-pattern>/ws/*</url-pattern>
      13. </servlet-mapping>
    • 第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。

      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <beans xmlns="http://www.springframework.org/schema/beans"
      3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4. xmlns:jaxws="http://cxf.apache.org/jaxws"
      5. xmlns:soap="http://cxf.apache.org/bindings/soap"
      6. xsi:schemaLocation="http://www.springframework.org/schema/beans
      7. http://www.springframework.org/schema/beans/spring-beans.xsd
      8. http://cxf.apache.org/bindings/soap
      9. http://cxf.apache.org/schemas/configuration/soap.xsd
      10. http://cxf.apache.org/jaxws
      11. http://cxf.apache.org/schemas/jaxws.xsd">
      12. <!-- 引入CXF Bean定义如下,早期的版本中使用 -->
      13. <import resource="classpath:META-INF/cxf/cxf.xml" />
      14. <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
      15. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
      16. <!-- 简单发布,没有接口 -->
      17. <jaxws:endpoint id="helloService" address="/hello" implementor="com.zhang.server1.HelloImpl">
      18. <!--客户端请求的消息拦截器-->
      19. <jaxws:inInterceptors>
      20. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
      21. </jaxws:inInterceptors>
      22. <!--服务端响应的消息拦截器-->
      23. <jaxws:outInterceptors>
      24. <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
      25. </jaxws:outInterceptors>
      26. </jaxws:endpoint>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注