- 浏览: 404437 次
- 性别:
- 来自: 哈尔滨
最新评论
-
springdata_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (二)——JAX-WS例子 -
springdata-jpa:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (三)——几个概念 -
springmvc-freemarker:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (一) -
yuanfen2014:
[color=red][/color] 学习了
jdom解析xml -
di1984HIT:
我很喜欢你对设计模式的理解。
JAVA设计模式学习笔记5——模版方法模式(Template Method Pattern)
上一篇写了个最简单的小例子,只是为了说明JAVA6开发Web Service很方便,这一篇稍微深入一点,写个稍微有点代表性的小例子。
依然使用 JAX-WS(jdk自带的实现)方式,这次要在服务中使用一个复杂类型Customer,并实现附件传输的功能,这里使用MTOM的附件传输方式。MTOM(SOAP Message Transmission Optimization Mechanism)是SOAP 消息传输优化机制,MTOM可以在SOAP 消息中发送二进制数据。
先来看Customer类:
package com.why.server; import java.util.Date; import javax.activation.DataHandler; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Customer") @XmlAccessorType(XmlAccessType.FIELD) public class Customer { private long id; private String name; private Date birthday; @XmlMimeType("application/octet-stream") private DataHandler imageData; //getter and setter ...... }
MTOM 方式中要传输的附件必须使用javax.activation.DataHandler 类,还要注意必须在类上使用@XmlAccessorType(FIELD)注解,标注JAXB 在进行JAVA 对象与XML 之间进行转换时只关注字段,而不关注属性(getXXX()方法),否则发布Web 服务时会报出现了两个imageData 属性的错误,原因未知,可能是BUG。
然后使用@XmlMimeType 注解标注这是一个附件类型的数据,这里我们标注imageData 是一个二进制文件,当然你也可以使用具体的MIME类型,譬如:image/jpg、image/gif 等,但要考虑到客户端是否支持。
接口类:
package com.why.server; import javax.jws.WebParam; import javax.jws.WebService; import javax.xml.ws.soap.MTOM; /** * * @author why * */ @WebService(name="Hello") @SOAPBinding(style = SOAPBinding.Style.RPC) @MTOM public interface Hello { public void printContext(); public Customer selectCustomerByName(@WebParam(name = "customer")Customer customer); public Customer selectMaxAgeCustomer(Customer c1, Customer c2); }
@MTOM注解用于开启MTOM功能。
@WebService注解中的name属性标注在接口类上,可以指定wsdl中接口名称,也就是生成的客户端代码中接口类的名字。
@SOAPBinding(style = SOAPBinding.Style.RPC)指定SOAP消息样式,有两个枚举值:SOAPBinding.Style.DOCUMENT(默认)和SOAPBinding.Style.RPC,可以对比这两种方式生成的wsdl会有所不同,而且生成的客户端代码也会有所不同。
实现类:
package com.why.server; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.annotation.Resource; import javax.jws.WebService; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; /** * * @author why * */ @WebService(serviceName="HelloService",portName="HelloServicePort",targetNamespace="http://service.why.com/",endpointInterface="com.why.server.Hello") public class HelloImpl implements Hello { @Resource private WebServiceContext context; @Override public void printContext(){ MessageContext ctx = context.getMessageContext(); Set<String> set = ctx.keySet(); for (String key : set) { System.out.println("{" + key + "," + ctx.get(key) +"}"); try { System.out.println("key.scope=" + ctx.getScope(key)); } catch (Exception e) { System.out.println(key + " is not exits"); } } } @Override public Customer selectCustomerByName(Customer customer) { if("why".equals(customer.getName())){ customer.setId(1); try { customer.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1985-10-07")); } catch (ParseException e) { e.printStackTrace(); } customer.setImageData(new DataHandler(new FileDataSource(new File("c:"+ File.separator + "why.jpg")))); }else{ customer.setId(2); customer.setBirthday(new Date()); customer.setImageData(new DataHandler(new FileDataSource(new File("c:"+ File.separator + "origin.jpg")))); } return customer; } @Override public Customer selectMaxAgeCustomer(Customer c1, Customer c2) { try { // 输出接收到的附件 System.out.println("c1.getImageData().getContentType()=" + c1.getImageData().getContentType()); InputStream is = c2.getImageData().getInputStream(); OutputStream os = new FileOutputStream("c:\\temp1.jpg"); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } os.close(); System.out.println("c2.getImageData().getContentType()=" + c2.getImageData().getContentType()); is = c2.getImageData().getInputStream(); os = new FileOutputStream("c:\\temp2.jpg"); bytes = new byte[1024]; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } os.close(); } catch (IOException e) { e.printStackTrace(); } if (c1.getBirthday().getTime() > c2.getBirthday().getTime()){ return c2; } else{ return c1; } } }
@WebService注解的serviceName属性指定wsdl中service节点的name属性值。portName属性指定wsdl中service节点下port节点name属性值。targetNamespace属性指定wsdl根节点definitions的targetNamespace属性值。endpointInterface属性指定要发布的WebService接口的全路径名,当实现类实现了多个接口时,需要通过此属性标注哪个类是WebService的服务端点接口(SEI)。
在这个类中,通过@Resource注解注入了一个WebServiceContext对象,这个对象即是WebService的上下文环境。
发布这个服务:
package com.why.server; import javax.xml.ws.Endpoint; /** * * @author why * */ public class SoapServer { public static void main(String[] args) { Endpoint.publish("http://localhost:8080/helloService",new HelloImpl()); } }
在命令行键入“wsimport -p com.why.client -keep http://localhost:8080/helloService?wsdl”生成客户端代码,拷贝到工程相应文件夹里,这时,就可以调用这个服务了:
package com.why.client; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.namespace.QName; /** * * @author why * */ public class SoapClient { public static void main(String[] args) throws ParseException, MalformedURLException { QName qName = new QName("http://service.why.com/","HelloService"); HelloService helloService = new HelloService(new URL("http://127.0.0.1:8080/helloService?wsdl"),qName); Hello hello = (Hello) helloService.getPort(Hello.class); hello.printContext(); System.out.println("---------------------------------------------------"); Customer customer = new Customer(); customer.setName("why"); DataSource ds = hello.selectCustomerByName(customer).getImageData().getDataSource(); String attachmentMimeType = ds.getContentType(); System.out.println(attachmentMimeType); try { InputStream is = ds.getInputStream(); OutputStream os = new FileOutputStream("c:\\why_temp.jpg"); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } } catch (IOException e) { e.printStackTrace(); } System.out.println("########################################"); Customer c1 = new Customer(); c1.setId(1); c1.setName("why"); GregorianCalendar calendar = (GregorianCalendar)GregorianCalendar.getInstance(); calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("1985-10-07")); try { c1.setBirthday(DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)); } catch (DatatypeConfigurationException e) { e.printStackTrace(); } c1.setImageData(new DataHandler(new FileDataSource("c:\\c1.jpg"))); Customer c2 = new Customer(); c2.setId(2); c2.setName("abc"); calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("1986-10-07")); try { c2.setBirthday(DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar)); } catch (DatatypeConfigurationException e) { e.printStackTrace(); } c2.setImageData(new DataHandler(new FileDataSource("c:\\c2.jpg"))); Customer c = hello.selectMaxAgeCustomer(c1,c2); System.out.println(c.getName()); } }
附件是我的工程,当然运行这个程序,需先在C盘建立几个文件c1.jpg、c2.jpg、origin.jpg和why.jpg。
- WebService02.rar (17.7 KB)
- 下载次数: 814
评论
image/gif or image/jpeg java.awt.Image
text/plain java.lang.String
text/xml or application/xml javax.xml.transform.Source
*/* or application/octet-stream javax.activation.DataHandler
不知道REST能这样用么
return super.getPort(new QName("http://service.why.com/", "HelloServicePort"), Hello.class, features);
}
解释下附带项目里面的这个方法为什么出错?
附件是从我的工程直接导出的,在我机器上没报错啊,不知道你那里报什么错误了?
return super.getPort(new QName("http://service.why.com/", "HelloServicePort"), Hello.class, features);
}
解释下附带项目里面的这个方法为什么出错?
eg:
我想添加一个提供下载图片或是其他文件的方法
public DataHandler download();
问题是:生成的客户端程序就变成了
public byte[] download();
了!
如何让客户端的返回类型也是DataHandler呢?
PS:希望知道楼主的邮箱,好一起交流这方面的问题!
这个问题我也碰见了,有些地方没太搞清楚,所以就没写这样的例子,以下仅供参考,希望对zfanxu能有帮助:
当使用SOAPBinding.Style.DOCUMENT方式时,可以在接口中下载的方法前加入@XmlMimeType("*/*")或@XmlMimeType("application/octet-stream")注解,这样,在生成的客户端代码中返回类型也是DataHandler了。
在http传输过程中媒体内容的类型和JAVA编程对象的对应关系是:
MIME Type Java Type
image/gif or image/jpeg java.awt.Image
text/plain java.lang.String
text/xml or application/xml javax.xml.transform.Source
*/* or application/octet-stream javax.activation.DataHandler
但用RPC方式时,生成的一直都是byte类型,不知道什么原因,如果zfanxu或哪位朋友知道并解决了希望也告诉兄弟一声啊!
eg:
我想添加一个提供下载图片或是其他文件的方法
public DataHandler download();
问题是:生成的客户端程序就变成了
public byte[] download();
了!
如何让客户端的返回类型也是DataHandler呢?
PS:希望知道楼主的邮箱,好一起交流这方面的问题!
请问客户端的代码生成的路径在哪?
发表评论
-
CKFinder2.x 入门 二
2011-07-08 17:28 11284破解 CKFinder是收费的,可是我们都比较 ... -
CKFinder2.x 入门
2011-07-08 16:04 6377CKFinder是一款强大的基于浏览器的ajax文件管 ... -
jxl 操作 Excel
2011-06-09 12:06 9682java 操作 Excel 最常用的就是JXL(jav ... -
CKEditor 3.6 入门二
2011-05-23 18:11 5480配置CKEditor ... -
CKEditor 3.6 入门
2011-05-20 11:28 8261有多种方法可以将CKEditor集成到你的页面中,下面是 ... -
JAVA6开发WebService (五)—— JAXB
2011-01-25 16:55 6937JAXB(Java API for XML Bindi ... -
多线程断点续传
2011-01-12 12:20 3734以前看过一个前辈写的断点续传的文章,记得当时没看懂,就 ... -
JAVA6开发WebService (四)——SAAJ调用WebService
2010-11-13 14:32 8539前面写了个JAX-WS的小例子,看到用JAVA6开发W ... -
JAVA6开发WebService (三)——几个概念
2010-11-11 17:00 18627要了解WebService,光能写 ... -
JAVA6开发WebService (一)
2010-11-10 12:32 36005WebService ... -
InputStream、OutputStream、String的相互转换
2010-11-09 16:37 473931、字符串转inputStream String ... -
dom4j解析xml
2010-08-20 10:52 7275dom4j和jdom都是非常优秀的xml解析工具,但现 ... -
正则表达式
2010-05-17 16:39 1770先看一个用正则表达式校验Email的js方法 func ... -
Struts 1 和 Struts 2 的线程安全
2010-03-23 16:58 5693昨天人问我Struts 2是怎么保证全局变量的线程安全 ... -
oracle 字符串函数
2010-02-22 10:59 25921.LOWER 返回字符串的小写形式;select lower ... -
JAVA 集合类
2010-01-06 16:41 1279Collection├List│├LinkedLi ... -
JAVA 线程学习笔记--同步
2009-12-30 16:37 1522为了确保可以在线程之间以受控方式共享数据,Java 语言提供了 ... -
JAVA 线程学习笔记
2009-12-30 16:26 2889创建线程有两种方法。 ... -
JAVA调用系统命令或可执行程序
2009-09-03 15:33 69636通过 java.lang.Runtime 类可以方便的 ... -
FTP客户端(利用sun.net.ftp.FtpClient实现)
2009-07-30 15:35 25812昨天帮同事弄java上传文件到ftp服务器,用的sun ...
相关推荐
基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...
JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用,JAX-WS方式开发和部署webservice应用
webService部署tomcat需要的jax-ws 的完整jar包
MyEclipse8_0中使用 JAX-WS 部署 WebService 实例 - 外衣 - 博客频道 - CSDN_NET.mht
本人自学JAX-WS笔记和简单例子,文档标题结构如下: JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 ...
自己自学JAX-WS的心得,内含较为详细的讲解了简单的例子。文档目录如下: JAX-WS自学笔记 本人自学JAX-WS笔记和简单例子,文档标题结构如下: JAX-WS使用教程 1、JAX-WS概述 2、创建Web Service 2.1 从java...
jax-ws webservice完整demo,包含所有jax-ws 2.2jar包。
NULL 博文链接:https://liuyunlong1229.iteye.com/blog/1678559
NULL 博文链接:https://hgxs-org.iteye.com/blog/1940916
公司代码实现,简单的webservice服务 发布,实现客户端的调用。
亲测可用,Jax-ws所需要的JAR包,拷贝到tomcat安装路径的lib里,实现了webservice发布到tomcat,赞!
使用JAX-WS(JWS)发布WebService 使用myeclipse开发java的webservice的两种方式 方式一: (此方式只能作为调试,有以下bug:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在...
MyEclipse6_5上基于JAX-WS开发Webservice(中文示例)
使用 Eclipse JavaEE 开发 WebService 时,若选择手动创建原生的JAX-WS服务,需要导入此jar资源(教程详见我的博文https://blog.csdn.net/weixin_50604409/article/details/116399530)。 如果您同时装有 IntelliJ ...
如果基于一个JAX-WS进行WebService开发,有很多教程,但是具体怎么更自动地生成一些文件,实现客户端与服务端的交互,都讲得不大清楚,为了让大家更方便地部署,我将服务端、客户端文件的生成与部署全过程以及测试...
利用myeclipse创建的 jax-ws demo
对webservice入门是很好的例子 使用webservice注解 基于jax ws jdk自带实现 知识点在readme txt中有详细介绍
以jdk1.6以上自带的jax-ws来发布webservice,压缩包里包含服务端和客户端,下载导入即可启动运行测试,有疑问的话欢迎咨询哈
MyEclipse中创建WebService的方法文档