?? jax.htm
字號(hào):
<TD vAlign=top width=299>
<P align=left>由wscomplie工具生成,由應(yīng)用程序開發(fā)者運(yùn)行</P></TD></TR>
<TR>
<TD vAlign=top width=299>
<P align=left>約束</P></TD>
<TD vAlign=top width=299>
<P align=left>由wsdeploy工具生成,由應(yīng)用程序開發(fā)者運(yùn)行</P></TD></TR>
<TR>
<TD vAlign=top width=299>
<P align=left>JAX-RPC運(yùn)行系統(tǒng)</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生成服務(wù),應(yīng)用程序開發(fā)人員必須提供一些文件。對(duì)于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>-服務(wù)定義接口
<LI><A
href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/jaxrpc/hello/HelloImpl.java">HelloImpl.java</A>-服務(wù)定義實(shí)現(xiàn)類,它實(shí)現(xiàn)了HelloIF接口
<LI><A
href="http://java.sun.com/webservices/docs/1.1/tutorial/examples/jaxrpc/hello/HelloClient.java">HelloClient.java-</A>遠(yuǎn)程客戶,與服務(wù)聯(lián)系,然后調(diào)用sayHello方法
<LI>config.xml-由wscompile工具讀取的配置文件
<LI>jaxrpc-ri.xml-由wsdeploy工具讀取的配置文件
<LI>web.xml- web組件(servlet)的部署描述信息,由它分派服務(wù) </LI></UL>
<P><B><A name=an></A>安裝</B></P>
<P>首先必須設(shè)置環(huán)境變量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">啟動(dòng)Tomcat</A>
</LI></UL>
<P><B>編譯部署服務(wù)</B></P>
<P>開發(fā)一個(gè)JAX-RPC Web服務(wù)的基本步驟如下:</P>
<P>1、 編碼服務(wù)定義接口和實(shí)現(xiàn)類</P>
<P>2、 編譯第一步中的服務(wù)定義代碼</P>
<P>3、 將代碼打包成一個(gè)WAR文件</P>
<P>4、 生成約束和WSDL文件</P>
<P>5、 部署服務(wù)。</P>
<P>接下來的章節(jié)將更詳細(xì)地描述每個(gè)步驟。</P>
<P><B>編碼服務(wù)定義接口和實(shí)現(xiàn)類</B></P>
<P>服務(wù)定義接口聲明了服務(wù)中遠(yuǎn)程客戶可以調(diào)用的方法。接口必須遵循幾個(gè)規(guī)則:</P>
<UL>
<LI>它繼承了java.rmi.Remote接口
<LI>它必須沒有像public final static這樣的連續(xù)聲明
<LI>方法必須拋出java.rmi.RemoteException或它的一個(gè)子類。(方法也可以拋出服務(wù)指定的異常。)
<LI>方法的參數(shù)和返回類型必須是支持的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>在該例中,服務(wù)定義接口是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>除接口外,還需要編寫實(shí)現(xiàn)該接口的類。在這個(gè)例子中,實(shí)現(xiàn)類稱為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>編譯服務(wù)定義代碼</B></P>
<P>要編譯HelloIF.java和HelloImpl.java,進(jìn)入目錄<I><JWSD_HOME></I>/docs/tutorial/examples/jaxrpc/hello,然后鍵入如下命令:</P>
<BLOCKQUOTE>
<P>ant compile-server</P></BLOCKQUOTE>
<P>該命令將產(chǎn)生的class文件放置在build/shared子目錄中。</P>
<P><B><A name=da></A>打包WAR文件</B></P>
<P>要生成包含服務(wù)代碼的WAR文件,輸入這些命令:</P>
<BLOCKQUOTE>
<P>ant setup-we-inf<BR>ant package</P></BLOCKQUOTE>
<P>setup-wen-inf命令的目的是將class和XML文件復(fù)制到build/WEB-INF子目錄中。而package的目的是運(yùn)行jar命令,將文件包在名為dist/hello-portable.war的WAR文件中。這個(gè)WAR文件還不能部署,因?yàn)樗话s束類。下一部分將會(huì)學(xué)習(xí)如何生成可部署的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目標(biāo)生成的。web.xml文件是實(shí)現(xiàn)服務(wù)的Web應(yīng)用程序的部署描述信息。和web.xml文件不同,jaxrpc-ri.xml文件不是規(guī)范的一部分,它是實(shí)現(xiàn)特有的。這個(gè)例子的jaxrpc-ri.xml文件的內(nèi)容如下:</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,這些將在下一節(jié)中生成。(WSDL文件可以很復(fù)雜,在指南中不作討論。參見“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#geng">更多信息</A>”。)注意,urlPattern的值(/hello)是服務(wù)的URL的一部分,這將在“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#yang">驗(yàn)證部署</A>”部分描述。</P>
<P>關(guān)于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>”部分。如果你是高級(jí)用戶,可能希望檢驗(yàn)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>該命令按下列方式運(yùn)行wsdeploy工具:</P>
<BLOCKQUOTE>
<P>wsdeploy –tmpdir build/wsdeploy-generated<BR>-o
dist/hello-deployable.war
dist/hello-portable.war</P></BLOCKQUOTE>
<P>該命令運(yùn)行wsdeploy工具,它執(zhí)行這些任務(wù):</P>
<UL>
<LI>讀取dist/hello-portable.war文件作為輸入
<LI>從hello-portable.war文件中包含的jaxrpc-ri.xml文件里獲得信息
<LI>為服務(wù)生成約束類
<LI>生成名為MyHello.wsdl的WSDL文件
<LI>將約束類、Hello.wsdl文件,以及hello-portable.war文件的內(nèi)容打包形成一個(gè)名為dist/hello-jaxrpc.war的可部署的WAR文件。
</LI></UL>
<P>-tmpdir選項(xiàng)指定wsdeploy將生成的文件存儲(chǔ)在哪個(gè)目錄,生成的文件包括WSDL文件、約束類以及中間源代碼文件。如果指定了-keep選項(xiàng),這些文件不會(huì)被刪除。</P>
<P>有幾種方式可以訪問由wsdeploy生成的WSDL文件:</P>
<UL>
<LI>運(yùn)行帶有-keep選項(xiàng)的wsdeploy,然后在由-tmpdir選項(xiàng)指定的目錄中查找WSDL文件
<LI>拆開WAR文件(jar –x),由wsdeploy輸出,然后到WEB-INF目錄中查找WSDL文件
<LI>按下面部分描述的來部署和驗(yàn)證服務(wù)。“<A
href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jax-rpc.11/11.2.htm#yang">驗(yàn)證部署</A>”中顯示的URL對(duì)應(yīng)的HTML頁面中有一個(gè)到WSDL文件的鏈接。
</LI></UL>
<P>注意wsdeploy工具并不部署服務(wù);而是生成一個(gè)可以被部署的WAR文件。在下一部分,將會(huì)部署wsdeploy生成的hello-jaxrpc.war文件所包含的服務(wù)。關(guān)于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構(gòu)建Web服務(wù)</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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -