目录
webservice是一种web服务
1.解决企业内部异构系统的整合问题
A-interface,B-interface
推出一种统一的方法
传统webservice,标准,XML,SOAP=HTTP协议+XML数据格式(SOAP 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息)
现在推荐的webservice http,JSON
WSDL说明书,通过UDDI进行注册。
2.解决一些公共资源的复用问题
服务端
(1)建立包,之后是接口IWeatherService
package com.qf.webservice;
/**
* 定义一个查询天气的服务
*
*
*/
public interface IWeatherService {
public String query(String cityName);
}
(2)实现方法
package com.qf.webservice;
import javax.jws.WebService;
@WebService
public class WeatherServiceImpl implements IWeatherService {
public String query(String cityName) {
System.out.println("查询"+cityName);
return "大晴天";
}
}
(3)主函数发布
package com.qf.webservice.main;
import javax.xml.ws.Endpoint;
import com.qf.webservice.WeatherServiceImpl;
/*
* 采用JDK的方式发布
*
* */
public class Main {
public static void main(String[] args)
{
Endpoint.publish("http://localhost:8090/weatherService",new WeatherServiceImpl());
System.out.printf("发布成功");
}
}
http://localhost:8090/weatherService?wsdl
客户端
wsimport生成客户端代码
Q1:wsimport不是内部命令
♦打开我的电脑–属性–高级–环境变量
♦新建系统变量JAVA_HOME 和CLASSPATH
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.7.0_79
♦选择”系统变量”中变量名为”Path”的环境变量,双击该变量,把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。
变量名:Path
变量值:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
这是java的环境配置,配置完成后直接启动eclipse,它会自动完成java环境的配置
JAVA_HOME要配置在系统变量,不要配置在用户变量,配置在用户变量会导致javac 和wsimport出现错误。
-------------------------------------------------------------------------------
wsimport -s . http://localhost:8090/weatherService?wsdl 基于说明书生成,解析说明书,生成代码
package com.qf.webservice.client;
import com.qf.webservice.WeatherServiceImpl;
import com.qf.webservice.WeatherServiceImplService;
public class Client {
public static void main(String[] args)
{
//1.创建服务视图(视图是从service标签的name属性获取)
WeatherServiceImplService weatherServiceImplService =new WeatherServiceImplService();
//2.获取服务实现类(实现类从portType的属型获取
WeatherServiceImpl port =weatherServiceImplService.getPort(WeatherServiceImpl.class);
//3.调用方法(从portType的operation标签获取
String reuslt=port.query("Kevin");
//删除结果;
System.out.printf(reuslt);
}
}
第二种方法
package com.qf.webservice.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.qf.webservice.WeatherServiceImpl;
public class Client {
public static void main(String[] args) throws MalformedURLException
{ URL url;
url = new URL("http://localhost:8090/weatherService?wsdl");
QName qName=new QName("http://webservice.qf.com/","WeatherServiceImplService");
Service service=Service.create(url,qName);
WeatherServiceImpl port =service.getPort(WeatherServiceImpl.class);
String reuslt=port.query("爱学习的小鹏友");
//删除结果;
System.out.printf(reuslt);
String reuslt2=port.other();
System.out.printf(reuslt2);
}
}
-----------------------------------------
服务端有更改后的内容
Q2问题,重新发布提示端口占用
这是因为该端口号(8090)被占用,此时可以通过如下方式解决。首先查看指定端口号被占用情况,在命令提示符下执行:
netstat -aon|findstr "8090"
显示如下结果:
协议 本地地址 外部地址 状态 PID
TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 5152
查看PID对应的进程,执行如下命令:
tasklist|findstr "5152"
显示如下结果:
javaw.exe 5152 Console 0 17,960 K
结束该进程即可,命令如下:
taskkill /f /t /im javaw.exe
或者直接到任务管理器结束进程
--------------------------------------------------
调用网络资源
http://www.webxml.com.cn/zh_cn/web_services.aspx
Q3调用失败
不是java生成的,需要拿到本地改
<s:any minOccurs="2" maxOccurs="2" />
------------------------------------------------------------------------------------------------------
获取数据格式:
用TCP/IP 监听
url = new URL("http://localhost:8090/weatherService?wsdl");
package com.qf.webservice;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
/*
* 通过观察的数据格式自己发送
* */
public class Client {
public static void main(String[] args) throws IOException {
// URL
URL url = new URL("http://localhost:8090/weatherService?wsdl");
// 创建一个链接对象
// 用于向服务器发送请求信息+获取服务器的响应信息
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
//
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
// 打开
connection.setDoOutput(true);
connection.setDoInput(true);
// 发送请求的信息,拼接格式
String info = bulidXML("深圳");
connection.getOutputStream().write(info.getBytes());
//
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = connection.getInputStream();
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
scanner.close();
} else {
System.out.println(responseCode);
}
}
private static String bulidXML(String cityName) {
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("<?xml version=\"1.0\" ?>");
sBuilder.append("<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">");
sBuilder.append("<S:Body>");
sBuilder.append("<ns2:query xmlns:ns2=\"http://webservice.qf.com/\">");
sBuilder.append("<arg0>");
sBuilder.append(cityName);
sBuilder.append("</arg0>");
sBuilder.append("</ns2:query>");
sBuilder.append("</S:Body>");
sBuilder.append("</S:Envelope>");
return sBuilder.toString();
}
}
注解的应用@webservise @WebResult @WebParam @WebMethod