从Servlet到EJB,从J2EE到JAVA EE5,作为JAVA开发人员,需要不断折腾。
最近下载了GlassFish2,折腾了折腾ejb3和web service,现在小结一下。主要总结一下几点:
1,GlassFish2 很好使
2,Jaxb,Web services 和 SOA
3,利用JAXB将XML SCHEMA编译为Java源文件
4,把POJO或EJB搞成(呵呵)Web Service
5,测试程序
6,ClassLoader 与打包部署 .ear
7,两本Java EE 5 书籍读后感
看起来内容很广,小结要简明扼要。
1,GlassFish2 很好使
一句话:GlassFish的管理网页(admin console)使得部署简单方便。这是JBOSS没法儿比的。
2,Jaxb,Xml Schema,Web Service & SOA - 基本概念
本人很讨厌Web Service,但随着SOA(Service Oriented Architecture)的兴起,Web Service是Java开发人员
无法避免的领域。SOA为系统集成提供了较好的架构,而Web Service借助于xml的数据跨平台特性,成为目今较流行
的实现SOA的一种手段。Web Service又有两种流派:一是基于SOAP的;一是REST的。行业内较流行的是基于SOAP的
Web Services,本文也着重小结于SOAP Web Services。
SOAP Web Services 包括几块:HTTP, SOAP, WSDL,XML。HTTP是通讯协议, SOAP是数据的打包协议(from
developer's point of view), WSDL是Web Service的定义语言,而XML则是数据的载体。
看起来好复杂,其实JAX-WS(or: Java Web Service)很大程度上将大部分任务简化为几个annotation的问题,如
WSDL及其他组件的生成等,都交由服务器来完成。在下面的3中将看到,Java EE 5允许我们将POJO或无状态的EJB搞
成Web Service。
SOAP Web Services意味着service客户必须向服务器提交SOAP消息(SOAP Message),service也将返回SOAP消息。
真正的数据则以XML的格式,按SOAP的打包和编码(Encoding)方式来传送。编程语言如果是Java,则由JAXB负责xml
与Java Object之间的转换:从xml到 Java Object叫作Unmarshalling,从Java Object到xml叫作Marshalling;而
这种转换叫做Data Binding。
在Data Binding中,讲Xml与Java Object联系在一起的中间关键部分是Xml Schema,她定义了一个Xml文件的内容。
虽然一般由业务分析人员(BA: Business Analyst)来定义service payloadrequest/response),但实际上,Web
Service的设计与实现是从定义service的Schema开始的。这些Schema实际上是项目业务逻辑的抽象描述。因此,掌握
基本的Xml Schema概念,例如Scheam Name Space, built-in types, Complex type, Eelement Occurrences,
Schema inclusion and extension,Schema validation 等等,是正确有效地实现SOA Web Service所必需的。这
是很多开发人员所忽略的。
复杂的Xml Schema类似一种OOP编程语言,你可以定义一些基本的Schema,如Client,Account等等,而service请求及
响应(Request/Response)的Schema则可以引用或延伸这些基本的Schema。这是Xml Schema的方便与潜力,同时也是
其麻烦与难点。
3,利用JAXB将XML SCHEMA编译为Java源文件
有些人做过Web Service,但未必用过JAXB,因为他们采用的方法是手工解析返回的结果。对于简单的Web Service来
说,这样做是可以的,但对于复杂的SOA Services,这种做法就不现实了。
另一个使用JAXB的原因是,Web Service 的请求与相应参数,不只是简单的基本类型(如int,String etc),而是包
含较多数据的用户自定义类型。真正的SOA service的请求与响应多属于后一种情况。
因此,比较可行的办法就是利用JAXB技术进行Data Binding,以实现Xml与Java Object之间的自动转换。其流程大体
如此:一,定义service request/response 的Schema;然后利用JAXB提供的编码器 xjc(有现成的 ant task)对
Schema进行编码,生成Java源代码,Data Binding的准备就完成了。二,上述生成的源代码,是整个项目源代码的一
部分。Web Service的实现将运用这些源代码。三,使用service时,请求及相应的内容,将符合Schema的要求。
一个简单的例子:假设我们定义Person.xsd及GetPerson.xsd,后者引用前者。GetPerson.xsd定义了一个service的
请求及相应内容:请求提供一个Person的数据,service 将返回有新年龄数据的Person。
Schema Person.xsd:
{code}
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sc="http://www.t50.com/portable"
targetNamespace="http://www.t50.com/portable">
<xs:element name="person" type="sc:Person"/>
<xs:complexType name="Person">
<xs:sequence>
<xs:element name="firstName" type="xs:string" />
<xs:element name="lastName" type="xs:string" />
<xs:element name="age" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:schema>
{code}
Schema GetPerson.xsd:
{code}
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sc="http://www.t50.com/portable"
targetNamespace="http://www.t50.com/portable">
<!-- include schema Person.xs -->
<xs:include schemaLocation="Person.xsd" />
<xs:element name="getPersonRequest" type="sc:GetPersonRequest" />
<xs:element name="getPersonResponse" type="sc:GetPersonResponse" />
<xs:complexType name="GetPersonRequest">
<xs:annotation>
<xs:documentation>Service request type</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="person" type="sc:Person" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="GetPersonResponse">
<xs:annotation>
<xs:documentation>Service response type</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="person" type="sc:Person" />
</xs:sequence>
</xs:complexType>
</xs:schema>
{code}
Ant target to comiple schema to Java source:
{code}
<target name="generate.portables.src" depends="" description="generate portable Java sources from t50 schema...">
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask" classpathref="t50.classpath" />
<echo message="compile xsd schema to generate t50 portable sources..." />
<delete dir="${portable.src}" />
<mkdir dir="${portable.src}" />
<xjc extension="true" destdir="${portable.src}" >
<schema dir="${t50.schema.dir}" includes="**/*.xsd" />
<arg value="-nv" />
</xjc>
</target>
{code}
Generated Java Sources from schema Person.xsd and GetPerson.xsd
1. Person.java
{code}
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-3354
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2008.06.26 at 04:07:56 PM NZST
//
package com.t50.portable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for Person complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="Person">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="age" type="{http://www.w3.org/2001/XMLSchema}int"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Person", propOrder = {
"firstName",
"lastName",
"age"
})
public class Person {
@XmlElement(required = true)
protected String firstName;
@XmlElement(required = true)
protected String lastName;
protected int age;
/**
* Gets the value of the firstName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getFirstName() {
return firstName;
}
/**
* Sets the value of the firstName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setFirstName(String value) {
this.firstName = value;
}
/**
* Gets the value of the lastName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLastName() {
return lastName;
}
/**
* Sets the value of the lastName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLastName(String value) {
this.lastName = value;
}
/**
* Gets the value of the age property.
*
*/
public int getAge() {
return age;
}
/**
* Sets the value of the age property.
*
*/
public void setAge(int value) {
this.age = value;
}
}
{code}
2. GetPersonRequest.java
{code}
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-3354
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2008.06.26 at 04:07:56 PM NZST
//
package com.t50.portable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* Service request type
*
* <p>Java class for GetPersonRequest complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="GetPersonRequest">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="person" type="{http://www.t50.com/portable}Person"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "GetPersonRequest", propOrder = {
"person"
})
@XmlRootElement(name="getPersonRequest")
public class GetPersonRequest {
@XmlElement(required = true)
protected Person person;
/**
* Gets the value of the person property.
*
* @return
* possible object is
* {@link Person }
*
*/
public Person getPerson() {
return person;
}
/**
* Sets the value of the person property.
*
* @param value
* allowed object is
* {@link Person }
*
*/
public void setPerson(Person value) {
this.person = value;
}
}
{code}
3. GetPersonResponse.java
{code}
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-3354
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2008.06.26 at 04:07:56 PM NZST
//
分享到:
相关推荐
2. **JAX-WS**(Java API for XML Web Services)是Java平台上的SOAP(Simple Object Access Protocol)Web服务标准,主要用于创建面向服务的架构(SOA)。JAX-WS提供了处理XML消息、WSDL(Web服务描述语言)和UDDI...
Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。它简化了创建和使用Web服务的过程,使得开发者能够通过SOAP消息与远程服务进行交互。JAX-WS允许开发者将服务接口直接映射到...
JAX-WS(Java API for XML Web Services)是Java平台标准版(Java SE)和企业版(Java EE)的一部分,它为创建、部署和消费基于SOAP(Simple Object Access Protocol)的Web服务提供了全面的支持。JAX-WS允许开发者...
1. **创建JAX-WS服务**:首先,你需要编写一个实现JAX-WS规范的Java类,通常是一个实现了特定接口的Servlet。然后,利用工具如JAXB(Java Architecture for XML Binding)或手工方式生成服务的WSDL文件。 2. **打包...
5. **数据绑定:**JAX-WS使用JAXB(Java Architecture for XML Binding)进行数据绑定,将XML数据自动转换为Java对象和反之亦然。这使得处理XML消息变得更简单,减少了手动解析XML的必要。 6. **异常处理:**JAX-WS...
Java实验_JAX-WS主要涉及的是Java平台上的Web服务开发技术,JAX-WS(Java API for XML Web Services)是Java SE和Java EE环境中用于创建和消费SOAP Web服务的标准库。这个实验旨在帮助你深入理解JAX-WS的工作原理...
Java API for XML Web Services (JAX-WS) 是Java平台上的一个标准接口,用于创建和消费Web服务。它是Sun Microsystems在2004年推出的一个重要框架,旨在简化Web服务的开发,使得Java开发者能够更方便地实现基于SOAP...
JAX-WS(Java API for XML Web Services)是Java平台上用于创建Web服务的标准API,版本2.1是其一个重要里程碑。本指南将深入探讨JAX-WS 2.1的核心概念、功能以及如何在实际开发中应用它。以下是对JAX-WS 2.1的详细...
标题中的“一个包含jax-ws和jax-rs的例子(含服务端和客户端)”是指这是一个示例项目,它演示了如何使用Java API for XML Web Services (JAX-WS)和Java API for RESTful Web Services (JAX-RS)来创建和消费Web服务。...
Java API for XML Web Services(JAX-WS)是Java平台上的一个标准,用于创建Web服务和客户端。它提供了一种简单、类型安全的方式来构建和消费基于SOAP的消息传递应用程序,是Java世界中实现Web服务的核心框架之一。...
【标题】"metro-jax-ws-jaxws221x.zip" 提供的是一个关于JAX-WS(Java API for XML Web Services)的开发示例,其中包含了JAX-WS 2.2.1版本的相关组件和库文件。这个压缩包是针对Java开发者设计的,用于帮助他们理解...
【标题】:Web服务之Java API for XML Web Services (JAX-WS) 【内容详解】 JAX-WS,全称为Java API for XML Web Services,是Java平台上的一个标准,用于构建和部署基于SOAP(Simple Object Access Protocol)的...
基于jax-ws 实现的web service client和server端的demo程序。 注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,...
JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...
JAX-WS提供了一种简单的方式来创建SOAP(Simple Object Access Protocol)Web服务,它集成了Java SE和Java EE平台,使得开发者可以方便地实现服务接口和服务实现,然后通过工具自动生成WSDL(Web Service ...
JAX-WS是Java平台标准版(Java SE)和企业版(Java EE)的一部分,用于构建基于SOAP(Simple Object Access Protocol)的Web服务和客户端。这个压缩包可能包含了JAX-WS实现的核心库和其他相关组件。 **描述中的文件...
The Java API for XML Web Services (JAX-WS) is a Java programming language API for creating web services, particularly SOAP services.... It's a part of the Java SE and Java EE platforms.
JAX-WS(Java API for XML Web Services)2.0,由JSR 224定义,是Java EE 5平台的关键组成部分,它是JAX-RPC 1.1的升级版。JAX-WS的主要目标是简化基于XML的Web服务的开发任务,它提供了对SOAP 1.1和1.2,以及XML等...
Java API for XML Web Services(JAX-WS)是Java平台上的一个标准,用于构建和部署Web服务。它简化了Web服务的开发,使得Java开发者能够更方便地创建、调用和部署SOAP(Simple Object Access Protocol)服务。在这个...
JAX-WS(Java API for XML Web Services)是Java EE 5及更高版本中提供的标准API,用于简化Web服务的开发。 在【MyEclipse中创建WebService的方法文档】中,主要步骤如下: 1. **新建Web Service Project**:首先...