JAX-WS jdk创建
1.服务端发布
使用jdk自带的注解的方式创建webservice,仅通过最简单的几个注解就可以实现,本实例展示图片的传输以及文本,图片以及文件的传输使用DataHandle类,示例jdk 1.8
package webservice;
import javax.activation.DataHandler;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import java.io.*;
/**
* webservice demo
*/
@WebService
public class WebserviceForFile {
/**
* 文件上传
*
* @WebResult一定要加上,开始没加一直报错
*
* @param dataHandler 文件数据
* @param fileName 文件名称 image.jpg
*/
@WebMethod
public @WebResult void uploadFile(@WebParam(name="dataHandle") DataHandler dataHandler, @WebParam(name="fileName") String fileName){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
/*标准的文件输入输出*/
InputStream inputStream = dataHandler.getInputStream();
bis = new BufferedInputStream(inputStream);
File file = new File("F:\\Temp\\" + fileName);
bos = new BufferedOutputStream(new FileOutputStream(file));
byte[] bytes = new byte[1024];
int len = 0;
while((len = bis.read(bytes)) > 0){
bos.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bis != null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 发布
* @param args
*/
public static void main(String[] args) {
Endpoint.publish("http://ip:8888/uploadFile", new WebserviceForFile());
}
}
2.客户端调用
在jdk安装目录的bin目录下打开命令行窗口(可以打开bin目录,然后在地址栏输入cmd回车,就会在当前目录下打开命令行窗口)
wsimport -keep -d E:\workspace\meetingForDebug\src http://ip:8888/uploadFile?wsdl
按回车键dos窗口会输出生成的日志,找到存放生成代码的位置,将其拷贝到项目中.在生成的代码中有两个*Service.java的类,其中一个是接口一个是实现类,在实现类中可以看到有@WebServiceClient注解,该类中找到有@WebEndpoint标记的方法,选择其中一个空参数的方法。所以使用时就用该类对象获取该方法然后就可以调用需要的接口了
package cn.com.xu.Test.ClassExtends;
import webservice.WebserviceForFileService;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class Demo {
public static void main(String[] args) {
try {
//将图片转化为字节数组
byte[] bytes = Files.readAllBytes(new File("F:\\Temp\\shuimu.jpg").toPath());
WebserviceForFileService service = new WebserviceForFileService();
//@WebServiceClient标记的类, @WebEndpoint标记的方法
service.getWebserviceForFilePort().uploadFile(bytes, "copyShuimu.jpg");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("success");
}
}
3.注意事项
a.示例中通过main方法发布webservice,实际项目中可以在Servlet的初始化方法中发布
b.使用该种方式发布的端口要和原来的tomcat端口不一样,否则会被占用,且每次发版都要重启tomcat
c.实际使用中测试的地址和生产的地址是不一样的,在没有更新服务端代码的前提下,发布到生产环境,只需要更改上文中的WebserviceForFileService类中的两个出地址即可。
缺点:不能动态更新服务端代码,地址更换较其他方式不方便
ps:还有发布的时候一直没有找到好的方法,后续有将补充
4.客户端使用字符串声明
即服务端不在声明DataHandle类型的数据,使用字符串,下面示例展示使用BASE64Encoder、BASE64Decoder处理
package webservice;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
public class FileToBytes {
/**
* 客户端处理,通过BASE64Encoder将图片转化为字符串
* @param filePath
* @return
*/
public String clientHandle(String filePath) {
String imageData = "";
BufferedInputStream bis = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
BASE64Encoder encoder = new BASE64Encoder();
try {
bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
byte[] bytes = new byte[1024];
int len = 0;
while((len = bis.read(bytes)) > 0){
bos.write(bytes, 0, len);
}
byte[] byteArray = bos.toByteArray();
imageData = encoder.encode(bytes);
} catch (IOException e){
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return imageData;
}
/**
* 服务端处理,通过BASE64Decoder将String转化为图片
* @param imageData 保存的文件路径
* @param filePath 文件数据
*/
public void serviceHandle(String imageData, String filePath){
BufferedOutputStream bos = null;
try {
BASE64Decoder decoder = new BASE64Decoder();
byte[] buffer = decoder.decodeBuffer(imageData);
bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
bos.write(buffer);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bos != null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
eclipse创建
使用Axis2创建
前言:本示例中使用的Axis2版本为1.4.1,eclipse版本Indigo Service Release 2,其他版本情况可能不同,下面会提到。
2.1.下载Axis2插件Axis2_Codegen_Wizard_1.4.0:https://download.youkuaiyun.com/download/wangruowen007/9972749
2.2下载Axis2所需jarhttps://download.youkuaiyun.com/download/xlb744868186/8301851
2.3将Axis2_Codegen_Wizard_1.4.0解压并放在eclipse安装文件plugins文件夹下,值得一提的是官网Apache Axis2 – Releases目前的版本为1.7.9生成客户端下载axis2-eclipse-service-plugin-1.7.9.zip,生成服务端使用axis2-eclipse-codegen-plugin-1.7.9.zip,如果放在高版本eclipse中,需要放在dropins文件夹下面,放在plugins下不会生效。关闭eclipse重启
2.4获取wsdl文件:将完整的webservice接口地址放在浏览器中访问,显示一个xml页面,右键另存为格式为wsdl的文件备用。
2.5新建空的java项目 Java Project,注意必须为java项目,非Dynamic Web Project
2.6右键新建项目,new - others,输入Axis2,选择Axis2 Code Generator - 选择Generate Java source code from a WSDL file,点击next - 选择前面保存的wsdl文件,next - 弹出options页面默认设置next - 弹出Output页面,选择Browse and select a project on current eclipse workspace,选择刚刚的java项目finish - 提示成功 - 刷新项目可以看到生成的代码了
2.7至少需要的jar
3.SoapUI创建