JDK1.6新特性,WebService强化

时间:2022-09-23 17:44:26

Web service是一个平*立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

Web services涉及技术:

  • XML XML是在web上传送结构化数据的伟大方式,Web services要以一种可靠的自动的方式操作数据,HTML不会满足要求,而XML可以使web services十分方便的处理数据,它的内容与表示的分离十分理想
  • SOAP 即Simple Object Access Protocol,SOAP使用XML消息调用远程方法,这样web services可以通过HTTP协议的post和get方法与远程机器交互,而且,SOAP更加健壮和灵活易用。
  • WSDL Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。

Mustang 简化了Web services 的开发和发布。XML和Web服务一直都是Mustang的关注重点。Mustang为此引入了JAX-WS(Java Architecture for XML-Web Services) 2.0 以及JAXB(Java Architecture for XML Binding) 2.0。 同时还有Streaming API for XML (STaX), 它提供了一个双向API,这个API可以通过一个事件流来读取或者写入XML,其中包括跳过某个部分,然后直接关注与文档中的另外一个小部分的能力。

JAVA中有三种WebService规范:

  • JAX-WS(Java API For XML-WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB。早期的JAVA Web服务规范JAX-RPC(Java API ForXML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC。
  • JAXM(JAVA API For XML Message),主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是JAVA EE 的可选包,因此你需要单独下载。SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。
  • JAX-RS,是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行,你需要到JCP 上单独下载JAX-RS 规范的接口,其API 位于javax.ws.rs.*包。

目前Java环境中开发WebService主要有三种方法:

  • Axis2,Axis是apache下一个开源的webservice开发组件,出现的算是比较早了,也比较成熟。这里主要介绍Axis+eclipse开发webservice,当然不用eclipse也可以开发和发布webservice,只是用eclipse会比较方便。
  • Apche CXF,CXF开发webservice也是比较方便和简单的,它和spring的集成可以说是非常地好。
  • JDK1.6自带的JAX-WS规范。

下面是一个用JDK1.6自带的JAX-WS规范开发的一个Hello World级别的WebService示范(环境:Eclipse):

1. 创建WebService服务

主程序:

package com.clzhang.sample.thinking;

import java.text.SimpleDateFormat;
import java.util.Date; import javax.jws.WebService;
import javax.xml.ws.Endpoint; /**
* 第1步,创建WebService服务,包含所需要的实体(Entity)等;
* 第2步,利用wsimport命令生成客户端存根;
* 第3步,创建WebService客户端主程序,通过客户端存根调用WebService。
* @author acer
*
*/
@WebService
public class JDK16WSServer1 {
// 简单的一个参数in、一个参数out调用
public String sayHello(String greeting) {
System.out.println("greeting is:" + greeting); return "I got " + greeting;
} // 稍复杂的小计算,返回一个实体
public JDK16WSEntity getEntity(String name, int age, Date birthday) {
JDK16WSEntity entity = new JDK16WSEntity();
entity.setAge(age);
entity.setName(name);
entity.setBirthday(birthday); entity.setDesc("您的姓名:" + name + ",年龄:" + age + "出生于:"
+ new SimpleDateFormat("yyyy-MM-dd").format(birthday)); return entity;
} public static void main(String[] args) {
Endpoint.publish("http://localhost:8888/service", new JDK16WSServer1()); System.out.println("WebService Server started...");
}
}

实体类:

package com.clzhang.sample.thinking;

import java.util.*;
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement
public class JDK16WSEntity {
private int age;
private String name;
private Date birthday;
private String desc; public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
} @Override
public String toString() {
return age + "|" + name + "|" + birthday;
}
}

创建完成之后,请运行主程序:JDK16WSServer1,以启动WebService服务。

2. 利用wsimport命令生成客户端代码存根

打开IE游览器,输入地址:http://localhost:8888/service?wsdl,即可以看到调用接口。

<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://thinking.sample.clzhang.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://thinking.sample.clzhang.com/" name="JDK16WSServer1Service">
<types>
<xsd:schema>
<xsd:import namespace="http://thinking.sample.clzhang.com/" schemaLocation="http://localhost:8888/service?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="sayHello">
<part name="parameters" element="tns:sayHello"></part>
</message>
<message name="sayHelloResponse">
<part name="parameters" element="tns:sayHelloResponse"></part>
</message>
<message name="getEntity">
<part name="parameters" element="tns:getEntity"></part>
</message>
<message name="getEntityResponse">
<part name="parameters" element="tns:getEntityResponse"></part>
</message>
<portType name="JDK16WSServer1">
<operation name="sayHello">
<input wsam:Action="http://thinking.sample.clzhang.com/JDK16WSServer1/sayHelloRequest" message="tns:sayHello"></input>
<output wsam:Action="http://thinking.sample.clzhang.com/JDK16WSServer1/sayHelloResponse" message="tns:sayHelloResponse"></output>
</operation>
<operation name="getEntity">
<input wsam:Action="http://thinking.sample.clzhang.com/JDK16WSServer1/getEntityRequest" message="tns:getEntity"></input>
<output wsam:Action="http://thinking.sample.clzhang.com/JDK16WSServer1/getEntityResponse" message="tns:getEntityResponse"></output>
</operation>
</portType>
<binding name="JDK16WSServer1PortBinding" type="tns:JDK16WSServer1">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="sayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
<operation name="getEntity">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="JDK16WSServer1Service">
<port name="JDK16WSServer1Port" binding="tns:JDK16WSServer1PortBinding">
<soap:address location="http://localhost:8888/service"></soap:address>
</port>
</service>
</definitions>

打开一个DOS窗口,输入(需要将jdk1.6.x/bin目录包括到path环境变量中):

wsimport -s d:\tddownload -d d:\tddownload -p com.clzhang.sample.thinking.client http://localhost:8888/service?wsdl

命令参数说明:
  -d:生成客户端执行类的class文件的存放目录
  -s:生成客户端执行类的源文件的存放目录
  -p:定义生成类的包名

然后拷贝client目录以自己项目的目录。我这里的目录结构如下图所示:

JDK1.6新特性,WebService强化

服务主程序(JDK16WSServer1.java)、实体类(JDK16WSEntity.java)、客户端调用程序(JDK16WSClient1.java)存放于thinking目录下;

客户端代码存根存放于停刊thinking/client目录下。

3. 创建客户端主程序调用

package com.clzhang.sample.thinking;

import java.util.*;
import java.text.SimpleDateFormat;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar; import com.clzhang.sample.thinking.client.JDK16WSServer1;
import com.clzhang.sample.thinking.client.JDK16WSServer1Service;
import com.clzhang.sample.thinking.client.Jdk16WSEntity; public class JDK16WSClient1 { public static void main(String[] args) throws Exception {
JDK16WSServer1Service jwss = new JDK16WSServer1Service();
JDK16WSServer1 jws = jwss.getJDK16WSServer1Port(); String returnGreeting = jws.sayHello("How are you?");
System.out.println(returnGreeting);


// 字符串日期-》日期(java.util.Date)-》GregorianCalendar-》XMLGregorianCalendar
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
GregorianCalendar gCal = new GregorianCalendar();
gCal.setTime(sdf.parse("1980-4-3"));
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCal); Jdk16WSEntity entity = jws.getEntity("张三", 23, xmlCal);
System.out.println(entity.getDesc());


// XMLGregorianCalendar-》GregorianCalendar-》日期(java.util.Date)-》字符串日期
System.out.println(sdf.format(entity.getBirthday().toGregorianCalendar().getTime()));
}
}

注意,程序中用到了XMLGregorianCalendar、GregorianCalendar、java.util.Date、字符串日期的互相转换。运行客户端主程序。
客户端输出:

I got How are you?
您的姓名:张三,年龄:23出生于:--
--

服务端输出:

WebService Server started...
greeting is:How are you?

4. 如何把WebService发布到tomcat服务器?

把WebService发布到tomcat服务器并没有好的方法。折中的方法是,通过一个自启动Servlet,在Servlet初始化阶段,注册WebService服务。

4.1 创建Servlet

package com.clzhang.sample.thinking;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.xml.ws.Endpoint; public class JDK16WSServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig); Endpoint.publish("http://localhost:8888/service", new JDK16WSServer1()); System.out.println("WebService Server started...");
} public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
servletResponse.getWriter().println("<a href=\"http://localhost:8888/service?wsdl\">WSDL</a>");
}
}

4.2 修改web.xml

    <servlet>
<servlet-name>WSServlet</servlet-name>
<servlet-class>com.clzhang.sample.thinking.JDK16WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>WSServlet</servlet-name>
<url-pattern>/servlet/WSServlet</url-pattern>
</servlet-mapping>

4.3 启动Tomcat

打开IE访问:http://localhost:8888/service?wsdl,即可以访问WSDL。客户端程序也可以运行。

关于JDK1.6新特性暂时到这儿,更多信息参考:更多信息,参考:http://www.oracle.com/technetwork/java/javase/features-141434.html

JDK1.6新特性,WebService强化的更多相关文章

  1. jdk1&period;6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  2. JDK1&period;7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  3. JDK1&period;8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  4. JDK1&period;5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  5. JDK1&period;7新特性&lpar;2&rpar;&colon;异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  6. jdk1&period;8新特性应用之Iterable

    我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

  7. jdk1&period;8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

  8. jdk1&period;8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

  9. JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1&period;5新特性)

    5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...

随机推荐

  1. CA 证书

    1.ubuntu curl 命令报错(CA) kamil@vm-ubuntu:~$ curl https://szxyzs.vanke.com/DataCenter/datacenter/api cu ...

  2. CDN——到底用还是不用?

    最近在学bootstrap,在知乎上搜索bootstrap看到有人问bootstrap基础包体积较大,对性能影响会不会很大,看到两种方法来减少对性能的影响: 有选择地部分加载,bootstrap带有L ...

  3. 一个jquery的图片下拉列表 ddSlick

    [ddSlick]http://designwithpc.com/Plugins/ddSlick How to use with JSON data Include the plugin javasc ...

  4. UGUI Toggle控件

    今天我们来看看Toogle控件, 它由Toogle + 背景 + 打勾图片 + 标签组成的. 它主要用于单选和多选 属性讲解: Is On: 代表是否选中. Toogle Transition: 在状 ...

  5. 计算机与ARM板通过路由器相连

    首先,使用两根网线分别将计算机和ARM板与路由器的LAN口连接. 要想使计算机和ARM板通信,必须使二者在同一网段. 在计算机的终端输入:ifconfig 获取计算机的ip地址,查看eth0,我的ip ...

  6. 自定义Edit控件控制输入范围

    //自定义Edit,实现十六进制输入控制,使用OnChar()函数实现 //MyEdit.h #pragma once class CMyEdit : public CEdit { DECLARE_D ...

  7. Express 简介

    Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...

  8. 《Python自然语言处理》第二章-习题解答-练习6

    问题描述:在比较词表的讨论中,创建一个对象叫做translate,通过它你可以使用德语和意大利语词汇查找对应的英语词汇.这种方法可能会出现什么问题,你能提出一个办法来避免这个问题吗? 虽然这是一道初级 ...

  9. javaweb分页查询实现

    Javaweb分页技术实现 分页技术就是通过SQL语句(如下)来获取数据,具体实现看下面代码 //分页查询语句 select * from 表名 where limit page , count; 和 ...

  10. 牛客小白月赛12J(序列自动机)

    题目链接:https://ac.nowcoder.com/acm/contest/392/J 题目大意:给一个字符串s,然后在给出n个其他的字符串,判断每个字符串是否为s的子序列. 例: 输入: no ...