简介:JAVA EE为webService提供了两种不同的编程模式,EJB容器模式及web容器模式
一、EJB容器模式:在EJB项目的session bean类中实现
1.例子
@Stateless
@Remote(HelloWorld.class)
@WebService
public class HelloWorldImpl implements HelloWorld {
@Override
@WebMethod
public String sayHello(String name) {
// TODO Auto-generated method stub
return name;
}
public String login(String name,String password){
return name;
}
}
打开:http://localhost:8080/jbossws然后单击View a list of deployed service就可以看到部署的WSDL
这样就简单的部署一个webService了
2.WSDL组成元素
类型Types:定义了web服务所使用的数据类型集合。
消息message:通讯数据结构的抽象类型定义。
操作Operation:对服务中所支持的操作的抽象描述。
端口类型PortType:对于某个端口类型所支持操作的抽象集合。
绑定Binding:包含了如何将端口类型转换变成为具体的数据表示细节。
端口Port:通过为绑定指定一个地址来定义一个服务访问端点。
服务Service:描述的是一个具体的被部署的WEB服务提供的所有访问入口。
3.JAX-WS注释控制生成WSDL内容
注释的例子如下:
@Stateless
@Remote(HelloWorld.class)
@WebService(targetNamespace="http://ws.foshanshop.com",name="HelloWorld",serviceName="HelloWorldService")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=Use.LITERAL,parameterStyle=ParameterStyle.WRAPPED)
public class HelloWorldImpl implements HelloWorld {
@Override
@WebMethod(operationName="SayHello",action="")
@WebResult(name="result")
public String sayHello(@WebParam(name="name")String name) {
// TODO Auto-generated method stub
return name;
}
@WebMethod
public String login(String name,String password){
return name;
}
}
上述的注释说明如下:
3.1@javax.jws.WebService注释
定义:
@Target({TYPE}@Retention(value=RetentionPolicy.RUNTIME)
public @interface WebService{
String name() default "";
String targetNamespace() default "";
String serviceName() default "";
String wsdlLocation() default "";
String portName() default "";
String endpointInterface() default "";
}
name()属性:指定接口的名字
targetNamespace()属性:指定命名空间
wsdlLocation()属性:定义了webservice的WSDL文件URL地址
portName()属性:指定了你所使用的WSDL端口
endpontInterface()属性:通过指定端口接口的方式来实现一个web Service
3.2@javax.jws.soap.SOAPBinding注释
use()属性:指定SOAP的编码使用方式。Use.LITERAL
style()属性:指定WSDL SOAP绑定的方式,有DOCUMENT和RPC两个值。默认值时DOCUMENT:style=SOAPBinding.Style.DOCUMENT
parameterStyle()属性:指定参数的样式。默认值为WRAPPED。
3.3@javax.jws.WebMethod注释
@WebMethod注释的办法作为Web Service办法对外暴露。
operationName()属性:用来定义被标注的办法所实现的WSDL operation。如果没有指定该属性,则默认会使用java的办法名称
action()属性:用来设置与该operation相对应的提示
3.4@javax.jws.WebParam注释
@WebParam注释控制办法参数在WSDL中的内容
name()属性:当web service采用的是RPC/Literal样式,则name()属性被设为wsdl:param的名称
3.5@javax.jws.WebResult注释
该注释控制返回值在WSDL中的内容。
name():返回办法名称 默认是WSDL的操作名称跟Response。
3.6@javax.jws.Oneway注释
该注释用来声明,相应的Web Service操作将返回一个空消息
二、WEB容器模式
开发步骤如下:
建立一个POJO端点--在web.xml中--------将这个POJO端点配置成一个Servlet-----------将这个POJO端点打包成一个应用
例子:
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class WebServiceTest {
@WebMethod
public String SayHello(String name){
return name+"说:你好!世界!";
}
}
web.xml中
<servlet>
<servlet-name>HelloService</servlet-name>
<servlet-class>com.havy.webServlet.WebServiceTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloService</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
这样就部署成功一个webService了
三、Web Service的客户端调用
1.在J2SE或者其他的web中调用WEB SERVICE
1.1在应用程序的类路径下放入JAX-WS的jar文件,对于web应用来说,应放入WEB-INF/lib目录。当有某些应用使用JAX-WS
版本高于2.0时,就要升级JDK的版本,如下:把jaxws-api.jar和jaxb-api.jar两个文件copy到JDK6/jre/lib/endorsed目录下
1.2利用WebService客户端工具生成辅助类
1.3借助辅助类调用webService
使用wsimport工具的ant任务类生成代码:build.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="toolsforJava" default="toolsforjavagen" basedir="..">
<property name="app.dir" value="${basedir}/toolsforJava" />
<property name="src.dir" value="${app.dir}/src" />
<path id="build.classpath" description="设置类路径">
<fileset dir="${basedir}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="toolsforjavagen" description="生成webservice客户端辅助代码,执行后请刷新项目">
<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/>
<wsimport wsdl="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl"
sourcedestdir="${src.dir}" package="com.longsun.ws.client" keep="true"
verbose="true" destdir="${app.dir}/bin"/>
</target>
</project>
注意:该文件放在工程目录的根目录下,然后运行后,刷新项目,即可发现生成的辅助类。
ant文件说明:
<taskdef>节点说明com.sun.tools.ws.ant.WsImport任务标签,标签名为wsimport
wsdl属性为Web服务的位置
package属性为生成代码使用的包名
sourcedestdir属性为生成代码存放的目录
keep属性为指定是否生成文件
verbose属性指定是否显示执行细节
生成辅助类后,就可以调用该webService了
如:
package com.longsun.webService;
import com.longsun.ws.client.HelloWorld;
import com.longsun.ws.client.HelloWorldService;
public class TestHelloWorld {
public static void main(String[] args){
try{
HelloWorldService service=new HelloWorldService();
HelloWorld helloWold=service.getHelloWorldPort();
String result=helloWold.sayHello("havy");
System.out.println(result);
result=helloWold.login("kang", "123456");
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}
}
}
2.在EJB中调用webService
在EJB容器中一般通过注入注释来使用webService,开发步骤如下:
利用工具生成辅助类-------使用注释注入服务类或服务端口
2.1为了使webService的版本和jboss相同,即使用JBOSS带的wsconsume工具生成辅助类
build.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="toolsforEJB" default="toolsforejbgen" basedir=".">
<property environment="env"></property>
<property name="src.dir" value="${basedir}/ejbModule"></property>
<property name="jboss.home" value="${env.JBOSS_HOME}"></property>
<property name="jboss.server.config" value="default"></property>
<property name="build.dir" value="${basedir}/build"></property>
<property name="build.classes.dir" value="${build.dir}/classes"></property>
<path id="build.classpath">
<fileset dir="${jboss.home}/client">
<include name="*.jar"/>
</fileset>
<pathelement location="${build.classes.dir}"/>
</path>
<target name="toolsforejbgen" description="生成webservice客户端辅助类代码,执行后请刷新项目">
<taskdef name="wsimport" classname="org.jboss.wsf.spi.tools.ant.WSConsumeTask" classpathref="build.classpath">
</taskdef>
<wsimport wsdl="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl"
sourcedestdir="${src.dir}" package="com.longsun.ws.client" keep="true"
verbose="true" destdir="${basedir}/bin"/>
</target>
</project>
现在在session Bean中调用Web Service的代码如下:
@Stateless
@Remote(WSClient.class)
public class WSClientImpl implements WSClient{
@WebServiceRef(wsdlLocation="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl")
private HelloWorldService service;
public String invokeWs(String name){
HelloWorld hello=service.getHelloWorldPort();
return hello.sayHello(name);
}
}
@WebServiceRef注释来直接引用服务类或服务的端口接点,其定义如下:
package javax.xml.ws;
@Target({TYPE,METHOD,FIELD})@Retention(RUNTIME)
public @interface WebServiceRef{
String name() default "";
String wsdlLocation() default "";
Class type default Object.class;
Class value default Object.class;
String mappedName() default "";
};
name()属性:定义了webService绑定到JNDI ENC的名称
wsdlLocation()属性:指定了WSDL文件的位置
mappedName()属性:指定通过厂商专用的WebSercie全局JNDI引用服务
Type()和value()属性:用来指定是否要将服务类或服务端口注入到某个数据成员或成员属性中。为了注入一个
服务的端口接口,value()必须设置为服务类,如:
@WebServiceRef(HelloWorldService.class)
private HelloWorld hellWorld;
一、EJB容器模式:在EJB项目的session bean类中实现
1.例子
@Stateless
@Remote(HelloWorld.class)
@WebService
public class HelloWorldImpl implements HelloWorld {
@Override
@WebMethod
public String sayHello(String name) {
// TODO Auto-generated method stub
return name;
}
public String login(String name,String password){
return name;
}
}
打开:http://localhost:8080/jbossws然后单击View a list of deployed service就可以看到部署的WSDL
这样就简单的部署一个webService了
2.WSDL组成元素
类型Types:定义了web服务所使用的数据类型集合。
消息message:通讯数据结构的抽象类型定义。
操作Operation:对服务中所支持的操作的抽象描述。
端口类型PortType:对于某个端口类型所支持操作的抽象集合。
绑定Binding:包含了如何将端口类型转换变成为具体的数据表示细节。
端口Port:通过为绑定指定一个地址来定义一个服务访问端点。
服务Service:描述的是一个具体的被部署的WEB服务提供的所有访问入口。
3.JAX-WS注释控制生成WSDL内容
注释的例子如下:
@Stateless
@Remote(HelloWorld.class)
@WebService(targetNamespace="http://ws.foshanshop.com",name="HelloWorld",serviceName="HelloWorldService")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=Use.LITERAL,parameterStyle=ParameterStyle.WRAPPED)
public class HelloWorldImpl implements HelloWorld {
@Override
@WebMethod(operationName="SayHello",action="")
@WebResult(name="result")
public String sayHello(@WebParam(name="name")String name) {
// TODO Auto-generated method stub
return name;
}
@WebMethod
public String login(String name,String password){
return name;
}
}
上述的注释说明如下:
3.1@javax.jws.WebService注释
定义:
@Target({TYPE}@Retention(value=RetentionPolicy.RUNTIME)
public @interface WebService{
String name() default "";
String targetNamespace() default "";
String serviceName() default "";
String wsdlLocation() default "";
String portName() default "";
String endpointInterface() default "";
}
name()属性:指定接口的名字
targetNamespace()属性:指定命名空间
wsdlLocation()属性:定义了webservice的WSDL文件URL地址
portName()属性:指定了你所使用的WSDL端口
endpontInterface()属性:通过指定端口接口的方式来实现一个web Service
3.2@javax.jws.soap.SOAPBinding注释
use()属性:指定SOAP的编码使用方式。Use.LITERAL
style()属性:指定WSDL SOAP绑定的方式,有DOCUMENT和RPC两个值。默认值时DOCUMENT:style=SOAPBinding.Style.DOCUMENT
parameterStyle()属性:指定参数的样式。默认值为WRAPPED。
3.3@javax.jws.WebMethod注释
@WebMethod注释的办法作为Web Service办法对外暴露。
operationName()属性:用来定义被标注的办法所实现的WSDL operation。如果没有指定该属性,则默认会使用java的办法名称
action()属性:用来设置与该operation相对应的提示
3.4@javax.jws.WebParam注释
@WebParam注释控制办法参数在WSDL中的内容
name()属性:当web service采用的是RPC/Literal样式,则name()属性被设为wsdl:param的名称
3.5@javax.jws.WebResult注释
该注释控制返回值在WSDL中的内容。
name():返回办法名称 默认是WSDL的操作名称跟Response。
3.6@javax.jws.Oneway注释
该注释用来声明,相应的Web Service操作将返回一个空消息
二、WEB容器模式
开发步骤如下:
建立一个POJO端点--在web.xml中--------将这个POJO端点配置成一个Servlet-----------将这个POJO端点打包成一个应用
例子:
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class WebServiceTest {
@WebMethod
public String SayHello(String name){
return name+"说:你好!世界!";
}
}
web.xml中
<servlet>
<servlet-name>HelloService</servlet-name>
<servlet-class>com.havy.webServlet.WebServiceTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloService</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
这样就部署成功一个webService了
三、Web Service的客户端调用
1.在J2SE或者其他的web中调用WEB SERVICE
1.1在应用程序的类路径下放入JAX-WS的jar文件,对于web应用来说,应放入WEB-INF/lib目录。当有某些应用使用JAX-WS
版本高于2.0时,就要升级JDK的版本,如下:把jaxws-api.jar和jaxb-api.jar两个文件copy到JDK6/jre/lib/endorsed目录下
1.2利用WebService客户端工具生成辅助类
1.3借助辅助类调用webService
使用wsimport工具的ant任务类生成代码:build.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="toolsforJava" default="toolsforjavagen" basedir="..">
<property name="app.dir" value="${basedir}/toolsforJava" />
<property name="src.dir" value="${app.dir}/src" />
<path id="build.classpath" description="设置类路径">
<fileset dir="${basedir}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="toolsforjavagen" description="生成webservice客户端辅助代码,执行后请刷新项目">
<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" classpathref="build.classpath"/>
<wsimport wsdl="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl"
sourcedestdir="${src.dir}" package="com.longsun.ws.client" keep="true"
verbose="true" destdir="${app.dir}/bin"/>
</target>
</project>
注意:该文件放在工程目录的根目录下,然后运行后,刷新项目,即可发现生成的辅助类。
ant文件说明:
<taskdef>节点说明com.sun.tools.ws.ant.WsImport任务标签,标签名为wsimport
wsdl属性为Web服务的位置
package属性为生成代码使用的包名
sourcedestdir属性为生成代码存放的目录
keep属性为指定是否生成文件
verbose属性指定是否显示执行细节
生成辅助类后,就可以调用该webService了
如:
package com.longsun.webService;
import com.longsun.ws.client.HelloWorld;
import com.longsun.ws.client.HelloWorldService;
public class TestHelloWorld {
public static void main(String[] args){
try{
HelloWorldService service=new HelloWorldService();
HelloWorld helloWold=service.getHelloWorldPort();
String result=helloWold.sayHello("havy");
System.out.println(result);
result=helloWold.login("kang", "123456");
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}
}
}
2.在EJB中调用webService
在EJB容器中一般通过注入注释来使用webService,开发步骤如下:
利用工具生成辅助类-------使用注释注入服务类或服务端口
2.1为了使webService的版本和jboss相同,即使用JBOSS带的wsconsume工具生成辅助类
build.xml代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project name="toolsforEJB" default="toolsforejbgen" basedir=".">
<property environment="env"></property>
<property name="src.dir" value="${basedir}/ejbModule"></property>
<property name="jboss.home" value="${env.JBOSS_HOME}"></property>
<property name="jboss.server.config" value="default"></property>
<property name="build.dir" value="${basedir}/build"></property>
<property name="build.classes.dir" value="${build.dir}/classes"></property>
<path id="build.classpath">
<fileset dir="${jboss.home}/client">
<include name="*.jar"/>
</fileset>
<pathelement location="${build.classes.dir}"/>
</path>
<target name="toolsforejbgen" description="生成webservice客户端辅助类代码,执行后请刷新项目">
<taskdef name="wsimport" classname="org.jboss.wsf.spi.tools.ant.WSConsumeTask" classpathref="build.classpath">
</taskdef>
<wsimport wsdl="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl"
sourcedestdir="${src.dir}" package="com.longsun.ws.client" keep="true"
verbose="true" destdir="${basedir}/bin"/>
</target>
</project>
现在在session Bean中调用Web Service的代码如下:
@Stateless
@Remote(WSClient.class)
public class WSClientImpl implements WSClient{
@WebServiceRef(wsdlLocation="http://127.0.0.1:8080/toolsforEJB/HelloWorldImpl?wsdl")
private HelloWorldService service;
public String invokeWs(String name){
HelloWorld hello=service.getHelloWorldPort();
return hello.sayHello(name);
}
}
@WebServiceRef注释来直接引用服务类或服务的端口接点,其定义如下:
package javax.xml.ws;
@Target({TYPE,METHOD,FIELD})@Retention(RUNTIME)
public @interface WebServiceRef{
String name() default "";
String wsdlLocation() default "";
Class type default Object.class;
Class value default Object.class;
String mappedName() default "";
};
name()属性:定义了webService绑定到JNDI ENC的名称
wsdlLocation()属性:指定了WSDL文件的位置
mappedName()属性:指定通过厂商专用的WebSercie全局JNDI引用服务
Type()和value()属性:用来指定是否要将服务类或服务端口注入到某个数据成员或成员属性中。为了注入一个
服务的端口接口,value()必须设置为服务类,如:
@WebServiceRef(HelloWorldService.class)
private HelloWorld hellWorld;