Java笔记··By/蜜汁炒酸奶

WebService入门初使用(一)创建WebService服务

前言

本文所用WebService基于maven-ssm-cxf,此处暂时仅使用做记录,后期看心情适当整理相关知识点。

服务端

加入maven依赖

首先pom.xml添加cxf的相关依赖,此处贴出的仅是cxf的相关依赖。

<properties>
    <cxf.version>3.1.8</cxf.version>
</properties>
1
2
3
<!--cxf-->
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxws</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core -->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-core</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>${cxf.version}</version>
    </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

web.xml配置

接着我们需要配置一个CXF的servlet:

<!--定义一个cxf的servlet-->
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/webservice/*</url-pattern>
  </servlet-mapping>
1
2
3
4
5
6
7
8
9

整合Spring配置

接下来是最重要的一部,用Spring整合CXF: 在这之前新建一个CXF的包(至于如何命名,就看你心情了),如下图: WebService入门初使用 这里有两个主要类

  • IHelloService接口。
  • 实现IHelloService接口的HelloServiceImpl类。 代码如下:

IHelloService.java

其中就只定义了一个简单的say()方法。

package cn.wind.WebServiceE.webServices;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

/**
 * Created by wind on 2016/11/15.
 */
@WebService(targetNamespace = "webServices.WebServiceE.wind.cn")
public interface IHelloSevice {
    @WebResult(name="Resultstr")
    public  String say(@WebParam(name="str" )String str,@WebParam(name="AA" )int a);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

HelloServiceImpl.java

这里就是对say()方法的简单实现。

package cn.wind.WebServiceE.webServices.impl;

import cn.wind.WebServiceE.webServices.IHelloSevice;
import org.springframework.stereotype.Component;


import javax.jws.WebService;

/**
 * Created by wind on 2016/11/15.
 */
@Component("HelloWord")
@WebService(targetNamespace = "webServices.WebServiceE.wind.cn")
public class HelloserServiceImpl  implements IHelloSevice{
    @Override
    public String say(String str,int a ) {
        System.out.print("This is "+str);
        return "Hello "+str;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

接下来就是整合Spring了,由于需要使用到CXF的标签,所以我们需要添加额外的命名路径如下: 为了方便扩展,单独写了一个cxf配置文档,通过将如下代码放入spring.xml(Spring配置文档)中即可,具体路径需根据自己的实际情况做相应更改。

<import resource="classpath:conf/spring-cxf.xml"/>
1

spring-cxf.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"
       xmlns:context="http://www.springframework.org/schema/context"
       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
        http://www.springframework.org/schema/context
	    http://www.springframework.org/schema/context/spring-context-3.0.xsd
       ">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    <!-- 自动扫描webService -->
    <context:component-scan base-package="cn.wind.WebServiceE.webServices" />
    <!-- 定义webservice的发布接口  -->
    <jaxws:endpoint
            implementor="#HelloWord"
            address="/HelloWorld"></jaxws:endpoint>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#helloWorld指的是我们在HelloWorldImpl类中所自定义的名字,/HelloWorld则是我们需要访问的地址。

附:此处所用文档目录如图:

WebService入门初使用 之后我们运行项目输入该地址:http://localhost:8080/webservice/HelloWorld?wsdl如果出现如下界面: WebService入门初使用 最初由于没有在接口和实现类的@WebService后面添加 targetNamespace属性,导致红框部分的具体的参数没有被wsdl描述,只是放了一句 soap:body use=“literal”/ ,让人摸不着头脑。之后添加后,但是该属性使用正向命名(即:cn.wind.WebServiceE.webServices)时,后期客户端导出使用时相应java文件头部信息为

package webServices.WebServiceE.wind.cn
1

故之后,服务器端反向设置(即 :@WebService(targetNamespace = “webServices.WebServiceE.wind.cn”)),后期客服端导出时将变为正向的

package cn.wind.WebServiceE.webServices
1

注:后来看资料,说targetNamespace“是服务端的包结构,不要暴露出去!”,故很多教程中这个属性都是用的网址,本文此处为了与后面的客户端部分简单统一,偷了点懒,暂时暴露就暴露吧。

参考资料

SSM(四)WebService入门详解

使用 CXF 构建WebService中的问题分享

预览
Loading comments...
0 条评论

暂无数据

example
预览