📄 jax.htm
字号:
<TD vAlign=top width=299>
<P align=left>由wscomplie工具生成,由应用程序开发者运行</P></TD></TR>
<TR>
<TD vAlign=top width=299>
<P align=left>约束</P></TD>
<TD vAlign=top width=299>
<P align=left>由wsdeploy工具生成,由应用程序开发者运行</P></TD></TR>
<TR>
<TD vAlign=top width=299>
<P align=left>JAX-RPC运行系统</P></TD>
<TD vAlign=top width=299>
<P align=left>包含在Java
WSDP中</P></TD></TR></TBODY></TABLE></DIV>
<DIV align=left></DIV>
<P> </P>
<P> </P>
<P> </P>
<P><B>HelloWorld</B><B>文件</B></P>
<P>为了使用JAX-RPC生成服务,应用程序开发人员必须提供一些文件。对于HelloWorld的例子,这些文件在<I><JWSDP_HOME></I>/docs/tutorial/examples/jaxrpc/hello目录中:</P>
<UL>
<LI><A
href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/jaxrpc/hello/HelloIF.java">HelloIF.java</A>-服务定义接口
<LI><A
href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/jaxrpc/hello/HelloImpl.java">HelloImpl.java</A>-服务定义实现类,它实现了HelloIF接口
<LI><A
href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/jaxrpc/hello/HelloClient.java">HelloClient.java-</A>远程客户,与服务联系,然后调用sayHello方法
<LI>config.xml-由wscompile工具读取的配置文件
<LI>jaxrpc-ri.xml-由wsdeploy工具读取的配置文件
<LI>web.xml- web组件(servlet)的部署描述信息,由它分派服务 </LI></UL>
<P><B><A name=an></A>安装</B></P>
<P>首先必须设置环境变量PATH,包含这些目录:</P>
<BLOCKQUOTE>
<P><I><JWSDP_HOME></I>/bin<BR><I><JWSDP_HOME></I>/jwsdp-shared/bin<BR><I><JWSDP_HOME></I>/jaxrpc-1.0.3/bin<BR><I><JWSDP_HOME></I>/jakarta-ant-1.5.1/bin</P></BLOCKQUOTE>
<P>接着,如果还没有这样做,按照“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.1.htm">开始Tomcat</A>”一章中介绍的:</P>
<UL>
<LI><A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.1.htm#wp73059">生成编译属性文件</A>
<LI><A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.2.htm#wp72306">启动Tomcat</A>
</LI></UL>
<P><B>编译部署服务</B></P>
<P>开发一个JAX-RPC Web服务的基本步骤如下:</P>
<P>1、 编码服务定义接口和实现类</P>
<P>2、 编译第一步中的服务定义代码</P>
<P>3、 将代码打包成一个WAR文件</P>
<P>4、 生成约束和WSDL文件</P>
<P>5、 部署服务。</P>
<P>接下来的章节将更详细地描述每个步骤。</P>
<P><B>编码服务定义接口和实现类</B></P>
<P>服务定义接口声明了服务中远程客户可以调用的方法。接口必须遵循几个规则:</P>
<UL>
<LI>它继承了java.rmi.Remote接口
<LI>它必须没有像public final static这样的连续声明
<LI>方法必须抛出java.rmi.RemoteException或它的一个子类。(方法也可以抛出服务指定的异常。)
<LI>方法的参数和返回类型必须是支持的JAX-RPC类型。参见“<FONT color=#ff0000><A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#leixing">JAX-RPC支持的类型</A></FONT>”部分。
</LI></UL>
<P>在该例中,服务定义接口是HelloIF.java:</P>
<BLOCKQUOTE>
<P>package hello;</P>
<P>import java.rmi.Remote;<BR>import
java.rmi.RemoteException;</P>
<P>public interface HelloIF extends Remote{<BR>
public String sayHello(String s) throws
RemoteException;<BR>}</P></BLOCKQUOTE>
<P>除接口外,还需要编写实现该接口的类。在这个例子中,实现类称为HelloImpl:</P>
<BLOCKQUOTE>
<P>package hello;</P>
<P>public class HelloImpl implemnets HelloIF{</P>
<P> public String message=”Hello”;</P>
<P> public String sayHello(String
s){<BR> return
message+s;<BR> }<BR>}</P></BLOCKQUOTE>
<P><B>编译服务定义代码</B></P>
<P>要编译HelloIF.java和HelloImpl.java,进入目录<I><JWSD_HOME></I>/docs/tutorial/examples/jaxrpc/hello,然后键入如下命令:</P>
<BLOCKQUOTE>
<P>ant compile-server</P></BLOCKQUOTE>
<P>该命令将产生的class文件放置在build/shared子目录中。</P>
<P><B><A name=da></A>打包WAR文件</B></P>
<P>要生成包含服务代码的WAR文件,输入这些命令:</P>
<BLOCKQUOTE>
<P>ant setup-we-inf<BR>ant package</P></BLOCKQUOTE>
<P>setup-wen-inf命令的目的是将class和XML文件复制到build/WEB-INF子目录中。而package的目的是运行jar命令,将文件包在名为dist/hello-portable.war的WAR文件中。这个WAR文件还不能部署,因为它不包含约束类。下一部分将会学习如何生成可部署的WAR文件。Hello-portable.war包含如下文件:</P>
<BLOCKQUOTE>
<P>WEB-INF/classes/hello/HelloIF.class<BR>WEB-INF/classes/hello/HelloImpl.class<BR>WEB-INF/jaxrpc-ri.xml<BR>WEB-INF/web.xml</P></BLOCKQUOTE>
<P>其中class文件是由前面部分显示的compile-server目标生成的。web.xml文件是实现服务的Web应用程序的部署描述信息。和web.xml文件不同,jaxrpc-ri.xml文件不是规范的一部分,它是实现特有的。这个例子的jaxrpc-ri.xml文件的内容如下:</P>
<BLOCKQUOTE>
<P><?xml version="1.0"
encoding="UTF-8"?><BR><webServices<BR>
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"<BR>
version="1.0"<BR>
targetNamespaceBase="http://com.test/wsdl"<BR>
typeNamespaceBase="http://com.test/types"<BR>
urlPatternBase="/ws"><BR>
<endpoint<BR>
name="MyHello"<BR>
displayName="HelloWorld
Service"<BR>
description="A simple web service"
<BR>
interface="hello.HelloIF"
<BR>
implementation="hello.HelloImpl"/> </P>
<P>
<endpointMapping<BR>
endpointName="MyHello"<BR>
urlPattern="/hello"/><BR></webServices></P></BLOCKQUOTE>
<P>在WSDL文件中使用了一些webServices属性,例如targetNamespaceBase,这些将在下一节中生成。(WSDL文件可以很复杂,在指南中不作讨论。参见“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#geng">更多信息</A>”。)注意,urlPattern的值(/hello)是服务的URL的一部分,这将在“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#yang">验证部署</A>”部分描述。</P>
<P>关于jaxrpc-ri.xml文件的更多信息,请参见“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#jaxrpcri">jaxrpc-ri.xml文件</A>”部分。如果你是高级用户,可能希望检验XML模式文件:<JWSDP_HOME>/docs/tutorial/examples/jaxrpc/common/jax-rpc-ri-dd.xsd。</P>
<P><B>生成约束和WSDL文件</B></P>
<P>要生成约束和WSDL文件,输入下列命令:</P>
<BLOCKQUOTE>
<P>ant process-war</P></BLOCKQUOTE>
<P>该命令按下列方式运行wsdeploy工具:</P>
<BLOCKQUOTE>
<P>wsdeploy –tmpdir build/wsdeploy-generated<BR>-o
dist/hello-deployable.war
dist/hello-portable.war</P></BLOCKQUOTE>
<P>该命令运行wsdeploy工具,它执行这些任务:</P>
<UL>
<LI>读取dist/hello-portable.war文件作为输入
<LI>从hello-portable.war文件中包含的jaxrpc-ri.xml文件里获得信息
<LI>为服务生成约束类
<LI>生成名为MyHello.wsdl的WSDL文件
<LI>将约束类、Hello.wsdl文件,以及hello-portable.war文件的内容打包形成一个名为dist/hello-jaxrpc.war的可部署的WAR文件。
</LI></UL>
<P>-tmpdir选项指定wsdeploy将生成的文件存储在哪个目录,生成的文件包括WSDL文件、约束类以及中间源代码文件。如果指定了-keep选项,这些文件不会被删除。</P>
<P>有几种方式可以访问由wsdeploy生成的WSDL文件:</P>
<UL>
<LI>运行带有-keep选项的wsdeploy,然后在由-tmpdir选项指定的目录中查找WSDL文件
<LI>拆开WAR文件(jar –x),由wsdeploy输出,然后到WEB-INF目录中查找WSDL文件
<LI>按下面部分描述的来部署和验证服务。“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#yang">验证部署</A>”中显示的URL对应的HTML页面中有一个到WSDL文件的链接。
</LI></UL>
<P>注意wsdeploy工具并不部署服务;而是生成一个可以被部署的WAR文件。在下一部分,将会部署wsdeploy生成的hello-jaxrpc.war文件所包含的服务。关于wsdeploy的更多信息,参见“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#wsdeploy">wsdeploy工具</A>”部分。</P>
<P> </P>
<P> </P></TD></TR></TBODY></TABLE>
<DIV class=Code>
<DIV class=Code>
<DIV class=Code>
<DIV class=Code>
<DIV class=navbar align=center>
<TABLE dir=ltr cellSpacing=0 cellPadding=0 width="100%"
summary="Navigation bar, includes the book title, part number, and navigation buttons"
border=0>
<COLGROUP span=3 width="100%">
<COL id=1 width="45%">
<COL id=2 width="25%">
<COL id=3 width="30%"></COLGROUP>
<TBODY>
<TR bgColor=#cccccc>
<TD class=navbartitle align=left abbr=ChapTitle>
<P align=left><FONT
face=Arial> </FONT>用JAX-RPC构建Web服务</P></TD>
<TD class=navbartitle align=right abbr=PartNum>
<P align=left><FONT face=Arial>816-7869-10</FONT></P></TD>
<TD vAlign=top align=right abbr=NavButtons><A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/index.htm"><IMG
height=26 alt="Table of Contents" src="jax.files/toc01.htm"
width=30 border=0> </A><A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/10/10.2.htm"><IMG
height=26 alt="Previous Chapter" src="" width=30 border=0></A>
<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm"><IMG
height=26 alt="Next Chapter" src="" width=30 border=0></A>
</TD></TR></TBODY></TABLE></DIV>
<DIV align=left></DIV></DIV></DIV></DIV></DIV></DIV></DIV></TD>
<TD vAlign=top width="21%" rowSpan=2>
<SCRIPT language=JavaScript>
<!--
function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->
</SCRIPT>
<SCRIPT language=JavaScript type=text/JavaScript>
<!--
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}
//-->
</SCRIPT>
<TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#bfbf3f>
<TD vAlign=top colSpan=2 height=2>
<DIV align=center>
<P align=left><A
onmouseover="MM_swapImage('Image25211','','http://gceclub.sun.com.cn/NASApp/sme/docroot/ecommunity/pics/ar_lg_red_r_pad1.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://gceclub.sun.com.cn/NASApp/sme/controller/techtopcatquery?cat_id=03"><FONT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -