webservice-UML课内实验报告实验三

1.webservice

现将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webservice。

简单来说,webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

2.如何发布一个webservice:以模拟天气查询功能为例

1. 创建基础文件:
webservice-UML课内实验报告实验三
在websrvice模块中,service包中创建一个接口WheatherInterface,一个实现接口类WheatherInterfaceImpl,一个客户端类WheatherServer

(1) WheatherInterface.java

这是WheatherInterface接口,其中定义了一个queryWeather(String cityName)的方法
记住一定要在类上加上@WebService注解
@WebMethod注解声明了这个方法是要发布出去的方法

package server;

import javax.jws.WebMethod;

@javax.jws.WebService
public interface WheatherInterface {
    @WebMethod
    public String queryWeather(String cityName);
}

(2) WeatherInterfaceImpl.java

这个类是接口的实现类,写明了接口函数方法的方法体。

package server;

import javax.jws.WebService;
import java.util.Random;

@WebService
public class WeatherInterfaceImpl implements WeatherInterface {
    @Override
    public String queryWeather(String cityName) {
        String[] weathers = {"晴天☀️", "暴雨⛈️", "多云☁️", "闪电⚡️"};
        Random random = new Random();
        System.out.println("服务端收到请求,获取天气的城市为:"+cityName);
        return weathers[random.nextInt(4)];
    }
}
(3) WeatherServer.java

最后我们在服务器端运行WeatherServer类中的main方法 ”控制台打印出发布WeatherServer成功!“在浏览器中输入我们在发布类中定义的address?wsdl(注意一定要加wsdl),浏览器显示如下,那么我们这个WeatherServer就发布成功了。

package server;

import javax.xml.ws.Endpoint;

public class WeatherServer {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8848/weather", new WeatherInterfaceImpl());
        System.out.println("发布WeatherServer成功!!!");
    }
}

执行截图:
webservice-UML课内实验报告实验三
webservice-UML课内实验报告实验三

3.客户端怎么调用?

首先我们先创建一个client客户端的模块,创建server包
接着打开cmd,在cmd中输入
wsimport -s 我们这个项目的src路径 -keep 我们发布的webservice地址,例如:

wsimport -s /Users/apple/IdeaProjects/JavaSElearning/ws_client/src/sercer -keep http://localhost:8848/temp?wsdl

回车,执行:
webservice-UML课内实验报告实验三
之后查看我们的sercic包,会发现系统自动帮我们生成了许多类。如图:
webservice-UML课内实验报告实验三
在系统生成之后的ws_client中自己写的一个客户端的测试类,内容如下:

(4) main.java
import server.WeatherInterfaceImpl;
import server.WeatherInterfaceImplService;

public class Main {
    public static void main(String[] args) {
        WeatherInterfaceImplService service = new WeatherInterfaceImplService();

   WeatherInterfaceImpl impl = service.getPort(WeatherInterfaceImpl.class);

   String cityName = "北京";

   String weather = impl.queryWeather(cityName);

   System.out.println("客户端:查询到"+cityName+"的天气为"+weather);
    }
}

运行过后控制台输出如下:
webservice-UML课内实验报告实验三webservice-UML课内实验报告实验三

4.UML课内实验报告实验三实验报告

一. 实验目的及实验环境
1.掌握SOA架构概念和方法。
2.能熟练开发服务(服务端、客户端)

二. 实验内容

一、练习Hello服务
1…net开发
a)https://www.cnblogs.com/Brambling/p/6815565.html
b)https://www.cnblogs.com/johnblogs/p/6144818.html
2.java开发
a)https://blog.csdn.net/cm777/article/details/80367626
b)https://www.cnblogs.com/fengwenzhee/p/6915606.html
二、自行开发
如温度转换服务,参考
https://www.w3school.com.cn/webservices/ws_example.asp
或者实现一个贷款计算服务等

三.实验结果
问题一:
1. 创建基础文件:

2. 发布

3. 创建一个client客户端的模块,创建server包
接着打开cmd,在cmd中输入
wsimport -s 我们这个项目的src路径 -keep 我们发布的webservice地址

4. 编写测试类

5. 运行

四.总结
1.实验过程中遇到的问题及解决办法;
(1) 问题一:
因为使用了Mac系统,文件路径不同于Windows,其中还夹入了中文,比如:
webservice-UML课内实验报告实验三

解决:
在属性中进行了调试,它的路径是:
/Users/apple/IdeaProjects/JavaSElearning/ws_client/src
(2) 问题二:
老师所给的资料中,该作者一开始的文件创建在service中,后来在cmd上生成新文件时并没有选到client文件夹中,于是java文件都在service下,运行时导致只能运行一次
解决;
通过查阅资料才发现问题在于没有将客户端和服务器分开,分包之后在运行就可以重复运行了
2.对设计过程的心得体会。
通过这次学习,我知道了Web Service是一个平*立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。老师给出了两种实现方式,分别是:
①.NET: 不同应用程序间共享数据与数据交换
②Java:写一次可以在任何系统运行的通用编程语言,因为java具有跨平台特性
其中,我选用了Java方式。通过进行本次实验,我深刻感受到学习好webservice对我们以后的编程和开发学习是非常的有帮助的,它不仅带给我们了一种新的技术,更是一种新的思路,我将继续学习webservice相关技术,本次的学习使我受益匪浅!

五.附录:模型文件(电子版)

  1. 第一题:
//(1)	 WeatherInterfaceImpl.java
package server;

import javax.jws.WebService;
import java.util.Random;

@WebService
public class WeatherInterfaceImpl implements WeatherInterface {
    @Override
    public String queryWeather(String cityName) {
        String[] weathers = {"晴天☀️", "暴雨⛈️", "多云☁️", "闪电⚡️"};
        Random random = new Random();
        System.out.println("服务端收到请求,获取天气的城市为:"+cityName);
        return weathers[random.nextInt(4)];
    }
}

//(2)	 WeatherServer.java
package server;

import javax.xml.ws.Endpoint;

public class WeatherServer {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8848/weather", new WeatherInterfaceImpl());
        System.out.println("发布Webservice成功!!!");
    }
}

//(3)	 main.java
import server.WeatherInterfaceImpl;
import server.WeatherInterfaceImplService;

public class Main {
    public static void main(String[] args) {
        WeatherInterfaceImplService service = new WeatherInterfaceImplService();

   WeatherInterfaceImpl impl = service.getPort(WeatherInterfaceImpl.class);

   String cityName = "北京";

   String weather = impl.queryWeather(cityName);

   System.out.println("客户端:查询到"+cityName+"的天气为"+weather);
    }
}
  1. 第二题
//(1)	TempServer.java
  package server;

import javax.xml.ws.Endpoint;

public class TempServer {
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8848/temp", new TempInterfaceImpl());
        System.out.println("发布Webservice成功!!!");
    }
}
//(2)	 TempInterfaceImpl.java
 package server;

import javax.jws.WebService;
import java.util.Random;

@WebService
public class TempInterfaceImpl implements TempInterface {
    @Override
    public float queryTemp(String temp) {
        String[] temps = temp.split("#");
        Float temp1 = Float.valueOf(temps[0]);
        float r=-10000;
        if(temps[1].equals("fahrenheitToCelsius")==true){
            r = fahrenheitToCelsius(temp1);
        }
        if(temps[1].equals("ClsiusToFahrenheit")==true){
            r = clsiusToFahrenheit(temp1);
        }
        else{
            System.out.println("转换格式识别失败!");
            return r;
        }
        System.out.println("转换后的结果为:"+r);
        return r;
    }
    public float fahrenheitToCelsius(float f){
        System.out.println("正在转化为摄氏度。。。");
        float celsius = ((((f) - 32) / 9) * 5);
        return celsius;
    }
    public float clsiusToFahrenheit(float c){
        System.out.println("正在转化为华氏度。。。");
        float fahrenheit = ((((c) - 32) / 9) * 5);
        return fahrenheit;
    }

}
//(3)	main
 import server.TempInterfaceImpl;
import server.TempInterfaceImplService;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

   TempInterfaceImplService service = new TempInterfaceImplService();
        TempInterfaceImpl impl = service.getPort(TempInterfaceImpl.class);
        Scanner sc = new Scanner(System.in);
        String temp = sc.next();
        float result = impl.queryTemp(temp);
        System.out.println("客户端:查询到转化后温度为:"+result);
 }
}
上一篇:http模拟webservice请求并获取参数示例


下一篇:解决java web 项目发布webservice接口