设为首页 收藏本站
查看: 990|回复: 0

[经验分享] WebLogic 9新特性:Web Services(组图)

[复制链接]

尚未签到

发表于 2017-2-17 10:52:04 | 显示全部楼层 |阅读模式
  本文讨论WebLogic Server 9(下简称WLS9)中的新特性:Java Web Service (JWS)。WLS9的WebServices子系统实现了J2EE 1.4中的Web Services的新标准: Enterprise Web Services 1.1specification (JSR-921)。该规范定义了标准的J2EE Web Service打包格式,部署模块以及运行时服务。
  
  JSR-921是J2EE 1.3中Web Services规范JSR-109的1.1维护版本。在Web Services1.1中描述了J2EE WebService的业务逻辑有两种实现方式:一种是使用Web容器中的JavaBean,另一种是使用EJB容器中的无状态SessionBean。与旧的Web Services开发方式不同,BEA建议使用JWS这种基于注释的WebServices编程方式以简化开发。这种编程方式的开发过程大概是这样,利用JDK5的新特性元数据注释(JSR-175),在编写上述的JavaBean或EJB的Bean类时在业务逻辑代码中添加一些特殊注释,然后用ANT的一些扩展任务可以生成一些相关JAVA类代码(主要是EJB的存根、桩)和配置文件,最后自动编译这些类代码并自动打包。所以可以说JWS方式是WebServices新标准的核心。JWS文件实际就是普通的.JAVA文件(扩展名依旧是.JAVA),通过添加注释来制定WS的特性。这些注释在JSR181中有完整的说明。如果Web Service用Java Bean类实现,自动打包后会包含web.xml,weblogic.xml,webservices.xml,weblogic-webservices.xml,JAX-RPC数据类型映射文件和WSDL等,并被打包成标准Web应用的WAR。如果用EJB实现,则会包含ejb-jar.xml和weblogic-ejb.jar.xml等,并被自动打包成标准EJB的JAR。下图描述了JWS文件生成可部署的J2EE模块的详细过程。后面我们会用两个例子详细说明如何开发、部署基于JavaBean和基于EJB的Web Services。 DSC0000.gif   
  JSR181与JSR175介绍
  
  我们先来看一段典型的使用JSR175特征的代码。
  
  package webservices.jsr181.pojo;
  
  import javax.jws.WebMethod;
  import javax.jws.WebService;
  
  @WebService(name="StringChangerPort", targetNamespace="http://wwtt.bea.com")
  
  public class StringChanger {
  @WebMethod()
  public String toUpper(String upperReqString)
  {
  ……
  这个类的源代码和普通的JAVA代码没太多区别,但和普通JAVA代码不同的是这里面还包含了很多以@开头的代码,或者称为注释,也就是在Java5中的新语法,JSR-175。JSR-175规范只是定义这种语法规则,而用这种语法来如何将这个类生成一个WebService接口,则需要由JSR-181规范来决定。所以这些JSR-175的注释才真正决定了这个Web Service的行为和外观。
  
  也许你会觉得这种语法比较奇怪,有些像普通java方法的语法,只是前面多了一个@。实际在JSR175规范的早期,该语法并不是像现在这样的。如果按早期写法,@WebService()会该写为:
网管u家u.bitscn@com
  
  
  /**
  * @WebService(......)
  */  后来出于简化,成了现在的样子。如果使用Weblogic Platform7.x或8.x产品,会在许多其专有的代码文件中看到这种格式的注释。由于撰写本文时Weblogic Platform9还没有发布。发布后是否那些专有代码会使用基于JSR-175的语法还不得而知,但可以确定的是在Weblgic Server9中这种语法已经被全面支持了,无论在Web Service中,还是在EJB中。
  
  事实上JSR181是BEA提出的用于加速Web Services开发的一种基于注释驱动的编程模式,并被批准纳入到J2EE1.5标准。JSR181提供了一种简单的WebService开发编程模型和标准的编译及部署方式。只需要编写JSR-175风格的注释就可以制定WSDL,消息产生属性,安全认证方式,以及特定的消息头。
  
  练习的预备工作
  
  准备必要软件。
  
  进行练习前需要预先安装WLS9正式版,可以到BEA官方网站上免费下载。本练习可在能安装WLS9的任何操作系统上完成,为了方便起见,文中仅以在Windows XP上开发为例。此外本文中代码的开发环境为Eclipse3.1及对应的Lomboz,当然如您所愿任何其他支持ANT的开发环境都是可以的。
中国网管联盟bitsCN.com
  
  配置Weblogic Server。
  
  准备好上述软件后,首先用配置创建一个新的WLS Domain。记得用户名和密码要都设为weblogic,端口为7001。创建好后启动该Domain,并用浏览器启动相应的Console,用帐户weblogic/weblogic登录进入。
  
  配置Eclipse。
  
  如果希望Eclipse的配置尽量吻合本文的环境,可参考我的另一篇文章:“使用Eclipse加速WeblogicServer开发”的第一步到第二步。配置好后在Eclipse的File->New Project中选取JavaProject,在Project Name中将我们这个练习的名字设为JSR-181 Web Services或任何你喜欢的名字,JDKCompliance中选择“Use a project specific compliance5.0”,其余保持默认。一个符合我们需要的Project就建好了。
  
  修改脚本文件。
  
  本练习所有的构建过程都由ANT来完成,因此我们需要添加一些ANT的脚本配置文件。属性文件,宏定义文件可以完全参照《使用Eclipse加速Weblogic Server开发》,因此只需要吧那里面的那三个文件拿过来用就可以了。
  
  需要修改的是build.xml文件,这里定义的属性主要是为后面两个例子设置一些路径。
网管u家u.bitscn@com
  
  <?xml version="1.0"?>
  <project name="WLS v9 JSR-181 Web Services" basedir=".">
  
  <property file="wls-build-tools/weblogicServer.properties" />
  <import file="wls-build-tools/weblogicServer.macrodef" />
  <taskdef file="wls-build-tools/weblogicTasks.properties" classpathref="jwsbuild.class.path" />
  
  <property name="apps.src.dir" location="." />
  <property name="apps.dest.dir" location="${temp.dir}" />
  <property name="clients.src.dir" location="." />
  <property name="clients.dest.dir" location="${temp.dir}" />
  <property name="clients.package.name" value="client.test"/>
  <property name="clients.package.path" value="client/test"/>
  
  <property name="jbApp.context.name" value="jb" />
网管论坛bbs_bitsCN_com
  
  <property name="jbApp.package.name" value="webservices.jsr181.pojo"/>
  <property name="jbApp.src.dir" location="${apps.src.dir}/webservices/jsr181/pojo"/>
  <property name="jbApp.jwsSource.file" value="StringChanger.java" />
  <property name="jbApp.dest.dir" location="${apps.dest.dir}/${jbApp.context.name}" />
  <property name="jbApp.service.name" value="StringChangerService" />
  <property name="jbApp.wsdl.url"value="http://${domain.address}:${domain.port}/${jbApp.context.name}/${jbApp.service.name}?WSDL" />
  <property name="jbApp.deploy.name" value="WLS v9 JSR-181 Javabean Web Service" />
  
  <property name="ejbApp.context.name" value="ejb" />
  <property name="ejbApp.package.name" value="webservices.jsr181.ejb"/>
网管论坛bbs_bitsCN_com
  
  <property name="ejbApp.src.dir" location="${apps.src.dir}/webservices/jsr181/ejb"/>
  <property name="ejbApp.jwsSource.file" value="PurchaseOrder.java" />
  <property name="ejbApp.dest.dir" location="${apps.dest.dir}/${ejbApp.context.name}" />
  <property name="ejbApp.service.name" value="PurchaseOrderService" />
  <property name="ejbApp.wsdl.url"value="http://${domain.address}:${domain.port}/${ejbApp.context.name}/${ejbApp.service.name}?WSDL" />
  <propertyname="ejbApp.wsdl.local"value="jar:file:${apps.dest.dir}/${ejbApp.context.name}/PurchaseOrder.jar!/META-INF/${ejbApp.service.name}.wsdl" />
  <property name="ejbApp.deploy.name" value="WLS v9 JSR-181 EJB Web Service" />
  
  <path id="jwsbuild.class.path">
  <fileset dir="${weblogic.home}/server/lib">
网管u家u.bitscn@com
  
  <include name="weblogic.jar" />
  <include name="xbean.jar" />
  </fileset>
  <fileset dir="${jdk5.home}/lib">
  <include name="tools.jar" />
  </fileset>
  </path>
  
  <path id="javabuild.class.path">
  <pathelement path="${clients.dest.dir}" />
  <fileset dir="${weblogic.home}/server/lib">
  <include name="webserviceclient.jar" />
  </fileset>
  </path>
  
  <!--后面的练习中我们将根据需要在此添加一些target。-->
  
  </project>
  
  如何快速查看例子的结果,而跳过开发环节。
  
  做好1到4步骤就可以按照后面几节所述完成练习。但如果想快速看一下练习结果,将本文附件solution包括所有源代码。解压到您磁盘任何位置,用Eclipse创建好一空的名为JSR-181 Web Services的Project后,用solution解出的JSR-181 WebServices文件夹替换这个Project的文件夹。最后在Eclipse的PackageExplorer中刷新一下,就浏览已经开发配置好EclipseProject代码了。修改项目的wls-build-tools路径下weblogicServer.properties中的WLS和JDK环境变量,然后就可以执行ANT脚本中的任务来编译,部署,测试等步骤。
网管联盟bitsCN_com
  
  
  开发基于JavaBean的Web Services
  
  基于JavaBean的Web Servics是最简单的一种方式。我们只需要在普通的JavaBean码中添加一些符合JSR181的注释,在build.xml中调用WLS提供的扩展ANT Task,就可以完成一个完整的Web Services。
  
  创建一个Java Bean。
  
  在Project的根目录下创建一个类名为StringChanger,包名为webservices.jsr181.pojo,写入如下内容:
  
  package webservices.jsr181.pojo;
  
  import javax.jws.WebMethod;
  import javax.jws.WebService;
  import javax.jws.soap.SOAPBinding;
  import weblogic.jws.WLHttpTransport;
  
  @WebService(name="StringChangerPort", targetNamespace="http://bea.com")
  @SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.ENCODED)
  @WLHttpTransport(contextPath="jb", serviceUri="StringChangerService")
  
  public class StringChanger {
  @WebMethod()
  public String toUpper(String upperReqString)
中国网管论坛bbs.bitsCN.com
  
  {
  String upper = upperReqString.toUpperCase();
  System.out.println("toUpper Request: " + upperReqString);
  System.out.println("toUpper Reply: " + upper);
  return(upper);
  }
  
  @WebMethod(operationName="toLower")
  public String toLowerCase(String lowerReqString)
  {
  String lower = lowerReqString.toLowerCase();
  System.out.println("toLowerCase Request: " + lowerReqString);
  System.out.println("toLowerCase Reply: " + lower);
  return(lower);
  }
  }
  
  这个类是用于实现我们这个Web Services模块的业务逻辑,以及描述这个WebService接口。该类中包含两个public的业务方法:toUpper(String):String和toLowerCase(String):String。其中的逻辑也很简单:前者将传入的字符串全变成大写,后者则全变成小写。并且两个方法都将在终端上将操作过程打印出来。除了这两法方法,其余都是用于描述Web Service接口的JSR-181注释。
  
  先看一些类级别的注释。@WebService()表示这个类可以生成WebService。name用于映射到WSDL文件的<wsdl:portType>元素,可以在生成的WSDL中找到<wsdl:portType>的值为StringChangerPort。targetNamespace用于指定WSDL文件中元素的命名空间,能在生成的WSDL中找到对应的targetNamespace="http://bea.com"。@SOAPBinding()表示这个服务可以映射到一个SOAP消息中。Style用于指定SOAP消息请求和回应的编码方式为RPC。use用于指定SOAP消息请求和回应是明文还是密文,此处表示为密文。@WLHttpTransport是一个Weblogic专用的注释,用于指生成的配置文件中的上下文路径和这个WebService的URI。contextPath用于指定上下文路径为jb,也就是说可以用 http://localhost:7001/jb/这个URL来调用这个Web Services应用。serviceUri表示客户端访问这个Web Service的URI为http://localhost:7001/jb/StringChangerService。
网管联盟bitsCN@com
  
  
  再看一些方法级别的注释。方法级注释为@WebMethod()。operationName为操作的名字,用于映射到WSDL文件的<wsdl:operation>元素。默认值为对应的方法名。因此在这个JavaBean生成的WebService中toUpper方法对应的操作名为toUpper,toLowerCase方法对应的操作名为toLower。
  
  编写build.xml Target。
  
  <target name="build.jb" depends="clean.jb">
  <jwsc srcdir="${jbApp.src.dir}" destdir="${jbApp.dest.dir}" listfiles="true" classpathref="jwsbuild.class.path">
  <jws file="${jbApp.jwsSource.file}" />
  </jwsc>
  </target>
  <target name="deploy.jb" depends="check.jb" if="jb.exists">
  <wls.deploy deploy.dir="${jbApp.dest.dir}" deploy.name="${jbApp.deploy.name}" />
  </target>
  
  build.jb 这个Target主要用于建立一个可部署的Web Services模块。jwsc这个任务是用于分析JWS文件中的注释,生成对应JAVA文件配置文件,编译代码,最后在destdir指定的位置生成这个Web Services的WAR包。 网管bitscn_com
  
  deploy.jb这个Target主要用于把Web Service模块部署到WLS Domain中。wls.deploy是一个在weblogicServer.macrodef中定义的Task,调用WLS的ANT扩展任务wldeploy。
  
  编译Web Services。
  
  现在我们在ANT View中执行任务build.ws.pojo,可以看到在Console窗口显示出对应的操作过程。
  
  Buildfile: C:\project\eclipse31\workspace\JSR-181 Web Services\build.xml
  clean.jb:
  [delete] Deleting directory C:\temp\jb
  [mkdir] Created dir: C:\temp\jb
  build.jb:
  [jwsc] 1 JWS files will be processed.
  [jwsc] Processing JWS: C:\project\eclipse31\workspace\JSR-181 Web Services\webservices\jsr181\pojo\StringChanger.java
  [jwsc] JWS: C:\project\eclipse31\workspace\JSR-181 Web Services\webservices\jsr181\pojo\StringChanger.java Validated.
  [jwsc] Compiling 2 source files to c:\temp\_ukbwfm
  [jwsc] C:\TEMP\_ukbwfm\StringChangerPortType.java
  [jwsc] C:\project\eclipse31\workspace\JSR-181 Web Services\webservices\jsr181\pojo\StringChanger.java
网管论坛bbs_bitsCN_com
  
  [jwsc] Building war: C:\temp\jb\StringChanger.war
  [jwsc] Created JWS deployment file: C:\temp\jb\StringChanger.war
  [AntUtil.deleteDir] Deleting directory c:\temp\_ukbwfm
  BUILD SUCCESSFUL
  Total time: 22 seconds
  
  打开目录C:\TEMP\jb,我们能看到生成了两个文件夹和一个WAR文件。在文件夹META-INF下的application.xml中的<web-uri>元素的值来自JWS中的注释@WLHttpTransport。打开生成的WAR文件我们能看WEB-INF路径下已经生成了一些对应的配置文件。查看其中的WSDL文件名为StringChangerService.wsdl,这也是来自JWS中的注释@WLHttpTransport。在WSDL文件中能看到targetNamespace为http://wwtt.bea.com,这是来自JWS中的注释@WebService。同样我们能在该文件中看到service元素中port为StringChangerPort,也是来自@WebService。在这个文件中包括了两个operation元素,name分别为toLower和toUpper,对应到JWS中两个注释@WebMethod。同时我们能看到对应的style为rpc,use为encoded。这些都符合我们在JWS的@SOAPBinding注释中的设置。同时我们能看到该WAR的WEB-INF\classes\webservices\jsr181\pojo目录中包含两个class文件:StringChanger.class内是StringChanger.java描述的业务逻辑,StringChangerPortType是为这个类生成的接口。StringChangerPortType会在后面生成WebServices代码时被自动调用。
网管网www.bitscn.com
  
  
  public interface StringChangerPortType extends Remote{
  public abstract String toLowerCase(String s)
  throws RemoteException;
  public abstract String toUpper(String s)
  throws RemoteException;
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-343380-1-1.html 上篇帖子: 一次严重的WebLogic频繁宕机故障处理 下篇帖子: WebLogic平台的Web SSO(SAML)解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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