WebService学习


WebService学习

注:(不会maven的可以先去学习maven配置和简单的命令)

Webservice介绍
apacheCXF
简单测试

1.pox文件引用:

<!--项目依赖--> 
<dependencies>
    <!--jaxws规范包-->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.0shiyong.1</version>
    </dependency>
    <!--jetty包-->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.0.1</version>
    </dependency>
    <!--日志包-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.12</version>
    </dependency>
</dependencies>
<!--插件的添加-->
<build>
<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
                <showWarnings>true</showWarnings>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>
</build>

2.编写服务器端(使用@WebService注解进行标注其是一个服务)

编写简单的服务接口

@WebService
public interface HelloService {
    /*
    * 使用注解@WebService
    * 对外发布服务接口
    * */
    public String sayHello(String name);
}

接口的实现类编写:

public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return name+",Welcome to xingxinghome!";
    }
}

3.在测试模块下测试服务端


public class Service {
    public static void main(String[] args) {
        //发布服务工厂
        JaxWsServerFactoryBean factor = new JaxWsServerFactoryBean();
        //设置服务地址
        factor.setAddress("http://localhost:8000/ws/hello");
        //设置服务类
        factor.setServiceBean(new HelloServiceImpl());
        //发布服务
        factor.create();
        System.out.println("服务发布成功:8000");

    }
}

4.访问设置的地址显示如下:

<soap:Envelope>
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>
No binding operation info while invoking unknown method with params unknown.
</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>

在其访问地址加上?wsdl就会显示出wsdl展示

http://localhost:8000/ws/hello?wsdl

显示结果如下:

image-20200325092919279

3.客户端的编写

客户端需要知道服务端是什么样子的接口,在客户端够构建与服务端一样的接口,不需要实现

@WebService
public interface HelloService {
    public String sayHello(String name);
}

测试连接服务端:(测试时,服务端需要启动)

public class Client {
    public static void main(String[] args) {
        //服务接口访问的地址

        //创建cxf代理工厂
        JaxWsProxyFactoryBean factory =  new JaxWsProxyFactoryBean();
        //设置远程服务器端的地址
        factory.setAddress("http://localhost:8000/ws/hello");
        //设置接口类型
        factory.setServiceClass(HelloService.class);
        //对接口生成代理对象$Proxy34jdk代理,$CGLIB123使用cglib代理
        HelloService helloService = factory.create(HelloService.class);
        System.out.println(helloService.getClass());
        //远程访问服务端方法
        String content = helloService.sayHello("jet");
        System.out.println(content);
    }
}

4.控制台使用日志拦截器来进行soap请求的拦截

在发布服务的时候添加代码:首先在main路径下的resource文件夹中添加log4j的配置文件

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE
log4j.rootCategory=INFO, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]&-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.Threshold=INFO
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
 public static void main(String[] args) {
        //发布服务工厂
        JaxWsServerFactoryBean factor = new JaxWsServerFactoryBean();
        //设置服务地址
        factor.setAddress("http://localhost:8000/ws/hello");
        //设置服务类
        factor.setServiceBean(new HelloServiceImpl());

        //添加日志输入,输出连接器,观察soap请求,soap响应内容
        factor.getInInterceptors().add(new LoggingInInterceptor());
        factor.getOutInterceptors().add(new LoggingOutInterceptor());

        //发布服务
        factor.create();
        System.out.println("服务发布成功:8000");

    }

控制台有信息:其中有服务的名称,服务的参数,soap封装格式

Payload: <soap:Envelope xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope/">soap:Body<ns2:sayHello xmlns:ns2=”http://service.itxing.com/">jet


文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
 上一篇
Oracle学习 Oracle学习
it星
关系型数据库之Oracle Oracle数据库是一个数据管理系统(RDBMS),提供开放的,全面的,近乎完整的信息管理,一个Oracle数据库由多个实例组成,实例操作数据库,任意时刻一个实例只能与一个数据库关联,一个数据库上只有一个实例对其
2020-04-15
下一篇 
java源码 java源码
java源码笔记 注:源码学习是一个长久的过程,目前有的程序还模糊,相信自己以后会明白的1.ArrayList ArrayList是由长度可变的数组组成的,允许null值,与Vector相类似,该类的方法不同步 size、empty、ge
  目录