仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 406|回复: 8
打印 上一主题 下一主题

[学习教程] JAVA编程:如何在J2EE组件中援用和查找Web服务

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net就不一样了,保持微软的一向风格,源代码不公开j2ee|web|web服务本文将会商怎样在J2EE组件中援用Web服务、而且经由过程JNDI来查找Web服务。在内容构造上,起首把一个EJB2.1无形态会话Bean公布成Web服务,然后开辟基于JSP的Web服务客户端,最初侧重先容怎样在JSP的部署时援用Web服务,而且会商怎样经由过程JNDI来查找和挪用Web服务。浏览本文前您必要以下的常识和工具:J2EE1.4SDK,而且会开端利用;把握基础的JAX-RPCWeb服务开辟妙技;懂得JNDI的基础常识,可以利用它举行复杂编程;一样平常的Java编程常识。Web服务客户端我们晓得,JAX-RPCWeb服务客户端有以下几个范例:基于Stub;
基于静态代办署理;
基于静态挪用接口(DII)。
实践上,下面三种客户端都是利用Service接口来作为它们的创立工场,Service接口中界说了诸如以下的办法:例程1Service接口中的某些办法
CallcreateCall();
CallcreateCall(QNameportName,
StringoperationName);
RemotegetPort(QNameportName,
ClassserviceEndpointInterface);
RemotegetPort(ClassserviceEndpointInterface);
能够看出,经由过程Service接口,可以创立Call对象和Remote对象,而Call大概Remote对象恰是挪用Web服务所必要的。经由过程利用Service接口,我们能够在Web服务客户端经由过程以下的体例来完成挪用:例程2在客户端挪用Web服务
//创立一个ServiceFactory对象。
ServiceFactoryserviceFactory
=ServiceFactory.newInstance();
//经由过程ServiceFactory
对象创立一个挪用Web服务的Service对象。
Serviceservice=
serviceFactory.createService
(taxWsdlUrl,
newQName(nameSpaceUri,
serviceName));//取得服务端点实例。
TaxServicemyProxy=
(TaxService)service.getPort
(newQName(nameSpaceUri,
portName),
TaxService.class);
//挪用Web服务。
doubleresult=myProxy.calculateTax(5000);
能够看出,在创立Service实例时,必要利用指定的WSDL文件地位、由服务名和称号空间URI构成的无效称号空间,如许使得创立这个实例时变得庞大。JAX-RPC标准保举利用JNDI来查找服务接口。经由过程JNDI,使得挪用Web服务时就像挪用EJB一样复杂。只需经由过程两步就能够取得Web服务接口:初始化一个称号空间高低文;在这个高低文中查找Web服务。好比能够依照以下的体例来举行:例程3经由过程JNDI挪用Web服务1
InitialContextic=newInitialContext();
Serviceabf=(Service)ic.lookup("java:comp/env/service/AddressBookService");
Web服务援用的名字(AddressBookService)在部署时指定,java:comp/env是JNDI的高低文,service是Web服务的subcontext。以是Web服务的JNDI名字一样平常由以下几个部分构成:
Web服务JNDI=客户端情况高低文+
service(subcontext)+服务援用名字
我们看到,例程3中查找到的是Service接口,实在在开辟中,我们能够接纳另外一种服务援用情势:间接查找Web服务接口,如例程4所示。例程4经由过程JNDI挪用Web服务2
Contextic=newInitialContext();
HelloServiceInterfaceservice=
(HelloServiceInterface)ic.lookup
("java:comp/env/service/HelloService");
在前面的例子能够看到,利用这个体例在挪用时又简化了一步。上面我们经由过程一个实例来演示怎样在J2EEWeb服务的客户端援用Web服务,然后经由过程JNDI来查找Web服务。开辟、部署一个Web服务我们开辟一个供应团体所得税盘算的Web服务,接纳EJB作为服务端点。起首界说一个接口,如例程5所示。例程5界说服务接口
packagecom.hellking.
study.webservice.tax;importjava.rmi.Remote;
importjava.rmi.RemoteException;/**
*团体所得税Web服务。
*/
publicinterfaceTaxService
extendsRemote
{
publicdoublecalculateTax
(doublesalary)throws
java.rmi.RemoteException;
}
它供应的服务办法是盘算团体所得税。例程6EJB部分代码
doublebase=1200;
//团体所得税基数,
2003年10起北京为1200元。//营业逻辑代码,
完成服务端点接口中界说的办法。
publicdoublecalculateTax(doublesalary)
{
returngetTax(salary-base);}
//上面是详细的盘算办法。公式合适于如今的团体所得税轨制。
privatedoublegetTax(doubletax_salary)
{
doubletax=0.0d;
if(0>tax_salary)tax=0;
elseif(0<tax_salary&&tax_salary<=500)
tax=tax_salary*0.05-0;
elseif(500<tax_salary&&tax_salary<=2000)
tax=tax_salary*0.10-25;
elseif(2000<tax_salary&&tax_salary<=5000)
tax=tax_salary*0.15-125;
elseif(5000<tax_salary&&tax_salary<=20000)
tax=tax_salary*0.20-375;
elseif(20000<tax_salary&&tax_salary<=40000)
tax=tax_salary*0.25-1375;
elseif(40000<tax_salary&&tax_salary<=60000)
tax=tax_salary*0.30-3375;
elseif(60000<tax_salary&&tax_salary<=80000)
tax=tax_salary*0.35-6375;
elseif(80000<tax_salary&&tax_salary<=100000)
tax=tax_salary*0.40-10375;
elseif(100000<tax_salary)
tax=tax_salary*0.45-15375;returntax;
}
上面编写一个设置文件,经由过程设置文件来天生WSDL到JAX-RPC之间的映照形貌符。设置文件以下:例程7config.xml
<?xmlversion="1.0"
encoding="UTF-8"?>
<configuration
xmlns="http://java.sun.com
/xml/ns/jax-rpc/ri/config">
<service
name="MyTaxService"
targetNamespace="urn:Tax"
typeNamespace="urn:Tax"
packageName="com.hellking.
study.webservice.tax">
<interfacename="com.hellking.
study.webservice.tax.TaxService"/>
</service>
</configuration>
注重这里Web服务的名字是MyTaxService,称号空间是"urn:Tax",服务接口是"com.hellking.study.webservice.tax.TaxService",这些参数将在前面的编程中利用。经由过程以下命令来天生一个mapping.xml映照文件:
wscompile-define-d.-nd.
-classpath.-mappingmapping.xml
config.xml

发客户端这个例子供应了两种分歧援用Web服务的办法,如例程8所示。例程8在客户端经由过程JNDI查找Web服务packagecom.hellking.study.webservice.tax;importjavax.naming.*;
importjavax.xml.rpc.Service;
importjavax.xml.namespace.QName;/**
*Web服务客户演示:经由过程JNDI来查找Web服务。
*/
publicclassTaxBean
{
/**
*第一种查找服务的办法,
间接取得MyTaxService接口。
*/
publicdoublegetTax1(doublesal)
{
doubleret=0;
try
{
Contextctx=newInitialContext();
MyTaxServicetaxService
=(MyTaxService)ctx.lookup
("java:comp/env/service/tax");
//经由过程MyTaxService取得TaxService服务端点接口。
TaxService
tax=taxService.getTaxServicePort();
ret=tax.calculateTax(sal);
}
catch(Exceptione)
{
System.out.println(e);
}
returnret;
}
/**
*另外一种查找服务的办法,
取得的是Service接口,
然后再经由过程这个接口来取得详细的服务。
*/
publicdoublegetTax2(doublesal)
{
doubleret=0;
try
{
Contextctx=newInitialContext();
Serviceservice=
(Service)ctx.lookup
("java:comp/env/service/tax2");
QNameportQName=newQName
("urn:Tax","TaxService");
//利用这类体例取得服务端点接口时,
必要指命名称空间。
TaxServicetax=(TaxService)
service.getPort(portQName,
com.hellking.study.
webservice.tax.TaxService.class);
ret=tax.calculateTax(sal);
}
catch(Exceptione)
{e.printStackTrace();
System.out.println(e);
}
returnret;
}
}
能够看出,第一种办法查找的就是MyTaxService接口,而第二种办法查找的是Service接口。详细利用那种体例,是和部署形貌相干的,在前面将先容部署的不同。最初开辟一个JSP来作为测试客户端,这个JSP经由过程JavaBean挪用Web服务,如例程9所示。例程9测试的JSP
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pageimport="com.hellking.study.webservice.tax.*,javax.naming.*"%>
<jsp:useBeanid="tax"class="com.hellking.study.webservice.tax.TaxBean"/>
<%
doublesalary=0;
try{
salary=Double.parseDouble
((String)request.getParameter
("salary"));
}
catch(Exceptione){}
%>
<html>
<head>
<title>经由过程JNDI挪用Web服务。</title>
</head>
<body>
<divalign="center">
<h1>Web服务----合适北京区域,
2003年</h1>
<%
out.println("团体所得税是:<br>");
out.println(tax.getTax1(salary));
out.println("<br>另外一种办法挪用Web服务,
团体所得税是:<br>");
out.println(tax.getTax2(salary));
%>
<hr>
<formaction="/tax/tax">
<tableborder=1>
<trbgcolor=654321>
<td>输出人为</td>
<td><inputtype=textname=salary></td>
</tr>
<tr><tdcolspan=2><input
type=submitvalue=检察></td>
</tr>
</table>
</form>
</div>
<hr>
</body>
</html>
最初来看详细的部署形貌符。在客户真个形貌中援用Web服务翻开J2EESDK部署工具(实行%J2EESDK_HOME%AppServerindeploytool.bat大概$J2EESDK/AppServer/bin/deploytool.sh),新建一个Web使用,把下面的测试JSP增加出去。在部署时,Web使用将包括如所示的文件。

<br>
Web使用中包括的文件
点击这个Web使用,在右侧再点击【WebservicesRefs】选项卡,再点击【Add】按钮。如今能够增添Web服务援用了。增添一个称号为service/tax的Web服务援用,如所示。

<br>
增添Web服务援用
注重下面的Service接口是com.hellking.study.webservice.tax.MyTaxService。然后点击【ContainerManagedPorts】,如所示。

<br>
增添容器办理端点
到此,一种援用Web服务的体例就完成了。上面看服务接口间接是Service的情形,再增添一个Web服务援用,如所示。

<br>
增添另外一种服务援用
注重下面ServiceInterface是javax.xml.rpc.Service,而且指定了称号空间(urn:Tax)和LocalPart(MyTaxService)。一样,依照所示办法增添一个容器办理端点,端点接口称号和端口组件称号和分歧。经由了下面的部署,实践上在web.xml中天生了以下的部署形貌符。例程10天生的部署形貌符
<service-ref>
<service-ref-name>
service/tax</service-ref-name>
<service-interface>com.hellking.
study.webservice.tax.
MyTaxService</service-interface>
<wsdl-file>WEB-INF/wsdl
/MyTaxService.wsdl</wsdl-file>
<jaxrpc-mapping-file>mapping.xml
</jaxrpc-mapping-file>
<port-component-ref>
<service-endpoint-interface>
com.hellking.study.
webservice.tax.TaxService
</service-endpoint-interface>
<port-component-link>
TaxServicePort</port-component-link>
</port-component-ref>
</service-ref>
<service-ref>
<service-ref-name>
service/tax2</service-ref-name>
<service-interface>
javax.xml.rpc.Service</service-interface>
<wsdl-file>WEB-INF/wsdl
MyTaxService.wsdl</wsdl-file>
<jaxrpc-mapping-file>mapping.xml
</jaxrpc-mapping-file>
<service-qname
xmlns:service-qname_ns__=
"urn:Tax">service-qname_ns__:MyTaxService
</service-qname>
<port-component-ref>
<service-endpoint-interface>
com.hellking.study.webservice.tax.TaxService
</service-endpoint-interface>
<port-component-link>
TaxServicePort</port-component-link>
</port-component-ref>
</service-ref>
上面注释一下这个形貌付。对Web服务的援用经由过程元从来指定;就是在客户端编程中要利用的援用名字;就是服务接口,有两种,分离是javax.xml.rpc.Service和com.hellking.study.webservice.tax.MyTaxService;是服务的无效称号空间,假如间接利用com.hellking.study.webservice.tax.MyTaxService作为服务接口,就不必要指定元素;就是对服务端点的援用,它援用的是webservices.xml中界说元素。用来链接到webservices.xml中指定的,而且二者的名字是分歧的。挪用测试部署完成后,在扫瞄器里输出:http://127.0.0.1:8080/tax/tax将呈现如所示的界面。

<br>
挪用Web服务
总结经由过程下面的先容,信任读者对Web服务的援用已有了周全的熟悉。我们能够看到,经由过程利用JNDI,在J2EE组件中挪用Web服务就像面向对象编程一样,乃至能够不睬解WSDL、XML之类的观点就可以挪用Web服务。
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。
简单生活 该用户已被删除
沙发
发表于 2015-1-19 22:05:57 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
若天明 该用户已被删除
板凳
发表于 2015-1-24 15:40:36 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
蒙在股里 该用户已被删除
地板
发表于 2015-2-1 23:11:19 | 只看该作者
是一种使用者不需花费很多时间学习的语言
小女巫 该用户已被删除
5#
发表于 2015-2-5 03:46:28 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
再见西城 该用户已被删除
6#
发表于 2015-2-11 03:02:55 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
兰色精灵 该用户已被删除
7#
发表于 2015-3-10 22:57:41 | 只看该作者
是一种为 Internet发展的计算机语言
小魔女 该用户已被删除
8#
发表于 2015-3-17 12:10:41 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
飘灵儿 该用户已被删除
9#
发表于 2015-3-24 09:46:42 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 19:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表