第三讲:基于JAX-WS编程模型的Webservice
1.JAX-WS概述
2.开发方法
3.使用wsimport生成stub
4.指定生成新的WSDL URL
5.为webservice类指定接口
6.修改服务器名和port名
1.JAX-WS概述
JAX-WS是一个规范,可以简化开发webservice的流程,
因为他规范定义了一套用于开发webservice的标准基于
(annotations)的模型。
JDK1.5以上。不再需要services.xml
只需要两个注释:
1.@javax.jws.WebService //注释Java类发发布成WebService
2.@javax.jws.WebMethod //注释过的方法才会发布成Webservice方法
上述的RPC的webservice会将所有的public的方法都
发布成WebService方法,因此,JAX-WS要比RPC更具有
弹性。
package service;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class First{
@WebMethod
public String getMsg(String name){
return "名称"+name+"JAX-WS";
}
public String getGreeting(String name){
return "hello" + name;
}
}
发布:
很容易。将class文件压缩成jar包,并将生产的jar
文件复制到axis2\WEB-INF\servicejars目录中即可。
servicejars目录是发布WebService的默认目录,
可以在axis2.xml文件中设置其他目录。
<deployer extension=".jar" directory="servicejars"
class="org.apache.axis2.jaxws.framework.JAXWSDeployer" />
我们可修改extension属性设置其他可以发布文件的扩展名,
修改directory属性值来设置发布Web Service的目录。
<deployer extension=".abc" directory="xyz"
class="org.apache.axis2.jaxws.framework.JAXWSDeployer" />
生产WSDL是抛出异常:
最简单的解决方法:
将<JDK6安装目录>\lib目录中高的tools.jar文件复制
到<Tomcat安装目录>\lib目录或者axis2\WEB-INF\lib目录中。
让所有的web程序都可以访问这个包。
启动tomcat自动生产WSDL
(在tomcat的work目录下主机目录下有缓存,可以手动清除)
测试JAX-WS程序:
使用下面的命令生产Stub类:
%AXIS2_HOME%\bin\wsdl2java -un
http://localhost:8080/axis2/servicesFirstService.FirstPort?wsdl -p client -s -o stub
将类复制到eclipse目录中,写一个main方法调用生成的类,调用webservice
如果类中没有@WebMethod,则会将所有的类都公开。
3.使用wsimport生成stub
wsimport比wsdl2java更好用.
通过wsimport命令,可以生成一系列的类和接口(其中
包括Stub),通过这个类和接口,可以很方便地调用
webservice。
wsimport命令的基本用法:
wsimport http://localhost:8080/axis2/services/FirstService.FirstPort?wsdl
如果想保留生成的类和接口的源代码,使用如下的命令:
wsimport -keep http://localhost:8080/axis2/services/FirstService.FirstPort?wsdl
将生成的代码拷贝到eclipse工程中,然后通过以下代码调用
webservice:
FirstService firstService = new FirstService();
First first = firstService.getFirstPort();
System.out.println(first.getMsg("abcd"));
为First类指定接口
如果First类未实现接口,wsimport命令就会生成一个默认
的First接口,如果要想生成其它名称的接口,需要为First
指定一个接口。接口的代码如下:
package service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(endpointInterface="service.IFirst")
//可以通过serviceName改服务名
//可以通过portName改端口
public interface First implements IFirst
{
public String getMsg(String name){
return "信息:"+name+"JAX-WS";
}
public String getGreeting(String name){
return "Hello" + name;
}
}
package service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface IFirst
{
@WebMethod
public String getMsg(String name);
}
发布到tomcat即可,重启tomcat
指定接口应该注意的问题;
1.使用@WebService注释接口;
2.使用@WebService注释接口中要公开的方法;
3.使用@WebService注释WebService类,并使用endpointInterface属性指定接口的全名
4.WebService类的方法不能再使用@WebMethod进行注释。
以上,0配置,services.xml,jax-ws 3中方式开发web service.
第4讲 复杂数据类型传输和异步调用
1.复杂的数据类型
2.webservice方法返回值和参数类型是类或者接口
3.使用byte[]类型上传文件
4.使用DataHandler上次文件
5.异步调用WebService
1.复杂的数据类型
Axis2允许我们直接在webservice方法中声明复杂数据类型的
返回值和参数。如果真的传递二进制文件,webservice方法的返回
值或参数类型可以是byte[],也可以是java.activation.DataHandler类型。客户端的Stub类可以是byte[](C#),
也可以是javax.activation.DataHandler类型。客户端的Stub类可能是byte[],也可能DataHandler(Java)。
5.异步调用WebService
在调用wsdl2java命令时,使用-a参数来生成异步
调用的webservice方法
%AXIS2_HOME%\bin\wsdl2java -un
http://localhost:8080/axis2/servicesFirstService.FirstPort?wsdl -p client -s -a -o stub
第5讲 WebService会话管理
1.Web应用程序的权限验证和webservice权限验证的基本方法
2.实例:在webservice中使用username和password进行权限验证
3.webservice会话与权限验证
4.使用webservice会话重新实现了拥有验证功能的webservice类
5.跨服务会话管理
6.利用axis2对跨服务会话的支持,重新规划和实现了
webservice类
1.Web应用程序的权限验证和webservice权限验证的基本方法
web验证:session控制
webservice:加入username和password,然后从内容
取值验证。
webservice与会话
在每个webservice方法中加入username和password
参数可以解决访问权限的验证的问题,但这样也比较
麻烦,而在服务器段需要有开发人员自己处理验证逻辑
,还可能访问数据库,降低了性能。
从技术层面来看,webservice与web应用程序有很多类似的
地方。他们一个最大的共同点就是webservice和web应用程序
都使用了http协议。web应用程序通过HTTP消息头相应
字段(HTTP响应消息头的set-cookie和http请求消息头的
cookie字段)传递一个sessionid来维护客户端和服务器
直接的会话状态的。既然webservice是基于http协议的
,那么就是说可以通过cookie来维护会话状态。
需要启动对webservice会话的支持,在webservice的<service>元素中加入
一个scope属性,scope属性表示webservice的作用域,将scope属性值设置为
transportsession,则webservice就会向web应用一样使用会话。
与web应用程序类似,在服务器端处理会话需要分两种情况处理:
1.登录时,将相应的标记信息保存在会话中;
2.访问需要权限验证的方法时,从会话中获取这个标记,并判断用户是否通过
权限验证;
为了完成上面的功能,我们需要使用如下两个类;
1.org.apache.axis2.contextMessageConText;
2.org.apache.axis2.context.ServiceContext;
其中ServiceContext类相当于web应用程序中的HttpSession对象,我们
通过ServiceContext类的getProperty和setProperty获得和设置属性值。
配置:
1.在MyProductsStub类中加入:
_serviceClient.getOptions.setManageSession(true);
再次运行客户端程序,成功使用会话,并输出正常的结果。
2.在services.xml中加入:scope="transportsession",
<service name="MyProducts" scope="transportsession">
<parameter name="ServiceClass">
service.MyProducts
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out"
class="org.apache.rpc.receivers.RPCInOnlyMessageReceiver"
/>
</<messageReceivers>
</service>
注意:每一个Stub类的对象实例对应一个会话,
因此,不能在多个Stub类的对象之间
共享同一个会话。因此,一般在应用程序中应
将Stub类的对象实例作为全局对象来处理
(static变量或者其他的形式 )。除此之外,
<session>元素的scope属性值中所有的字母应该
为小写,如transportsession。
跨服务会话管理
在前面介绍的WebService会话可以很好的解决权限验证的问题,但还有一个很
闹心的问题没有解决,也许很多同学都看出来了。将<service>元素的scope属性值设置
为transportsession,虽然同一个webservice服务可以使用会话,但不同的webservice
服务之间却不同共享会话,这带来不便。
那么解决方法就是:跨服务会话管理,要想实现跨服务共享会话,需要做如下2件事情:
1.将ServiceContext sc = mc.getServiceContext()改成如下的代码:
ServiceGroupContext sc = mc.getServiceGroupContext;
2.将<service>元素的scope属性设置为applicaton。
客户端的Stub类不再需要加入如下的代码:
_serviceClient.getOptions.setManageSession(true);
第6讲 Axis2模板
1.介绍一下Axis2模块
2.Axis2模块的结果
3.演示如果安装和使用Axis2内置的soapmonitor模块
4.实现自定义的Logging模块
1.介绍一下Axis2模块
提供了和struts2过滤器的类似的机制,就是Axis2模块。
Axis2的模块都放在:tomcat\webapps\axis2\WEB-IN\modules
按照一定的规则来编写Axis2模块,一个模块的结构定义如下:
1.模块类。该类需要实现org.apache.axis2.modules.Module接口;
2.至少一个业务处理类:该类需要实现org.apache.axis2.engine.Handler接口
3.module.xml文件:该文件用于配置当前的模块
如果想使用某个模块,还需要在axis2.xml和services.xml文件中进行设置。
3.演示如果安装和使用Axis2内置的soapmonitor模块
soapmonitor模块是Axis2内置模块。这个模块的功能是将SOAP
请求和响应消息显示在页面上。所用的技术是Servlet+Applet.
这个模块需要在页面中转载一个Applet,通过Applet来监视
SOAP信息。如果这时有SOAP请求或者响应发生,Applet就会获得
这些SOAP消息,并将这些显示在页面上,同时在页面的上方显示
请求的URL。用户可以停止和开启soapmonitor功能。
配置:
(1)将tomcat\webapps\axis2\WEB-IN\lib目录中找到
soapmonitor-1.4.1.jar文件解压,将解压目录中的org目录拷贝到
<Tomcat安装目录>\webqpps\axis2目录中,applet所需要的
class文件需要放到这个目录。
(2)在tomcat\webapps\axis2\WEB-IN\web.xml中配置需要的servlet:
<servlet>
<servlet-name>SOAPMontitorService</servlet-name>
<servlet-class>
org.apache.axis2.soapmonitor.servlet.SOAPMontitorService
</servlet-class>
<init-param>
<param-name>SOAPMontitorPort</param-name>
<param-value>/SOAPMnotitor</param-value>
</init-param>
</servlet>
(3)在services.xml中加入以下行来引入soapmonitor
<module ref="soapmonitor" />
4.实现自定义的Logging模块
实现功能:将SOAP信息输出到Tomcat控制台。
实现Axis2模块的步骤:
1.编写实现Module接口的类。Axis2模块在进行初始化、销毁
等动作时会调用该类相应的方法。
2.编写实现Handler接口的类。该类是Axis2模块的业务处理类
3.编写module.xml文件,该文件放在META-INF目录中,用于
配置Axis2模块
4.在module.xml文件中配置Axis2模块
5.在services.xml文件中引用Axis2模块。
每一个Axis2模块都需要使用<module>元素引用才能使用。
6.发布Axis2模块。需要使用jar命令将Axis2模块压缩成mar
包(文件扩展名必须是mar),然后将.mar文件放在:
tomcat\webapps\axis2\WEB-IN\modules目录中。
1.JAX-WS概述
2.开发方法
3.使用wsimport生成stub
4.指定生成新的WSDL URL
5.为webservice类指定接口
6.修改服务器名和port名
1.JAX-WS概述
JAX-WS是一个规范,可以简化开发webservice的流程,
因为他规范定义了一套用于开发webservice的标准基于
(annotations)的模型。
JDK1.5以上。不再需要services.xml
只需要两个注释:
1.@javax.jws.WebService //注释Java类发发布成WebService
2.@javax.jws.WebMethod //注释过的方法才会发布成Webservice方法
上述的RPC的webservice会将所有的public的方法都
发布成WebService方法,因此,JAX-WS要比RPC更具有
弹性。
package service;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class First{
@WebMethod
public String getMsg(String name){
return "名称"+name+"JAX-WS";
}
public String getGreeting(String name){
return "hello" + name;
}
}
发布:
很容易。将class文件压缩成jar包,并将生产的jar
文件复制到axis2\WEB-INF\servicejars目录中即可。
servicejars目录是发布WebService的默认目录,
可以在axis2.xml文件中设置其他目录。
<deployer extension=".jar" directory="servicejars"
class="org.apache.axis2.jaxws.framework.JAXWSDeployer" />
我们可修改extension属性设置其他可以发布文件的扩展名,
修改directory属性值来设置发布Web Service的目录。
<deployer extension=".abc" directory="xyz"
class="org.apache.axis2.jaxws.framework.JAXWSDeployer" />
生产WSDL是抛出异常:
最简单的解决方法:
将<JDK6安装目录>\lib目录中高的tools.jar文件复制
到<Tomcat安装目录>\lib目录或者axis2\WEB-INF\lib目录中。
让所有的web程序都可以访问这个包。
启动tomcat自动生产WSDL
(在tomcat的work目录下主机目录下有缓存,可以手动清除)
测试JAX-WS程序:
使用下面的命令生产Stub类:
%AXIS2_HOME%\bin\wsdl2java -un
http://localhost:8080/axis2/servicesFirstService.FirstPort?wsdl -p client -s -o stub
将类复制到eclipse目录中,写一个main方法调用生成的类,调用webservice
如果类中没有@WebMethod,则会将所有的类都公开。
3.使用wsimport生成stub
wsimport比wsdl2java更好用.
通过wsimport命令,可以生成一系列的类和接口(其中
包括Stub),通过这个类和接口,可以很方便地调用
webservice。
wsimport命令的基本用法:
wsimport http://localhost:8080/axis2/services/FirstService.FirstPort?wsdl
如果想保留生成的类和接口的源代码,使用如下的命令:
wsimport -keep http://localhost:8080/axis2/services/FirstService.FirstPort?wsdl
将生成的代码拷贝到eclipse工程中,然后通过以下代码调用
webservice:
FirstService firstService = new FirstService();
First first = firstService.getFirstPort();
System.out.println(first.getMsg("abcd"));
为First类指定接口
如果First类未实现接口,wsimport命令就会生成一个默认
的First接口,如果要想生成其它名称的接口,需要为First
指定一个接口。接口的代码如下:
package service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(endpointInterface="service.IFirst")
//可以通过serviceName改服务名
//可以通过portName改端口
public interface First implements IFirst
{
public String getMsg(String name){
return "信息:"+name+"JAX-WS";
}
public String getGreeting(String name){
return "Hello" + name;
}
}
package service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface IFirst
{
@WebMethod
public String getMsg(String name);
}
发布到tomcat即可,重启tomcat
指定接口应该注意的问题;
1.使用@WebService注释接口;
2.使用@WebService注释接口中要公开的方法;
3.使用@WebService注释WebService类,并使用endpointInterface属性指定接口的全名
4.WebService类的方法不能再使用@WebMethod进行注释。
以上,0配置,services.xml,jax-ws 3中方式开发web service.
第4讲 复杂数据类型传输和异步调用
1.复杂的数据类型
2.webservice方法返回值和参数类型是类或者接口
3.使用byte[]类型上传文件
4.使用DataHandler上次文件
5.异步调用WebService
1.复杂的数据类型
Axis2允许我们直接在webservice方法中声明复杂数据类型的
返回值和参数。如果真的传递二进制文件,webservice方法的返回
值或参数类型可以是byte[],也可以是java.activation.DataHandler类型。客户端的Stub类可以是byte[](C#),
也可以是javax.activation.DataHandler类型。客户端的Stub类可能是byte[],也可能DataHandler(Java)。
5.异步调用WebService
在调用wsdl2java命令时,使用-a参数来生成异步
调用的webservice方法
%AXIS2_HOME%\bin\wsdl2java -un
http://localhost:8080/axis2/servicesFirstService.FirstPort?wsdl -p client -s -a -o stub
第5讲 WebService会话管理
1.Web应用程序的权限验证和webservice权限验证的基本方法
2.实例:在webservice中使用username和password进行权限验证
3.webservice会话与权限验证
4.使用webservice会话重新实现了拥有验证功能的webservice类
5.跨服务会话管理
6.利用axis2对跨服务会话的支持,重新规划和实现了
webservice类
1.Web应用程序的权限验证和webservice权限验证的基本方法
web验证:session控制
webservice:加入username和password,然后从内容
取值验证。
webservice与会话
在每个webservice方法中加入username和password
参数可以解决访问权限的验证的问题,但这样也比较
麻烦,而在服务器段需要有开发人员自己处理验证逻辑
,还可能访问数据库,降低了性能。
从技术层面来看,webservice与web应用程序有很多类似的
地方。他们一个最大的共同点就是webservice和web应用程序
都使用了http协议。web应用程序通过HTTP消息头相应
字段(HTTP响应消息头的set-cookie和http请求消息头的
cookie字段)传递一个sessionid来维护客户端和服务器
直接的会话状态的。既然webservice是基于http协议的
,那么就是说可以通过cookie来维护会话状态。
需要启动对webservice会话的支持,在webservice的<service>元素中加入
一个scope属性,scope属性表示webservice的作用域,将scope属性值设置为
transportsession,则webservice就会向web应用一样使用会话。
与web应用程序类似,在服务器端处理会话需要分两种情况处理:
1.登录时,将相应的标记信息保存在会话中;
2.访问需要权限验证的方法时,从会话中获取这个标记,并判断用户是否通过
权限验证;
为了完成上面的功能,我们需要使用如下两个类;
1.org.apache.axis2.contextMessageConText;
2.org.apache.axis2.context.ServiceContext;
其中ServiceContext类相当于web应用程序中的HttpSession对象,我们
通过ServiceContext类的getProperty和setProperty获得和设置属性值。
配置:
1.在MyProductsStub类中加入:
_serviceClient.getOptions.setManageSession(true);
再次运行客户端程序,成功使用会话,并输出正常的结果。
2.在services.xml中加入:scope="transportsession",
<service name="MyProducts" scope="transportsession">
<parameter name="ServiceClass">
service.MyProducts
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2006/01/wsdl/in-out"
class="org.apache.rpc.receivers.RPCInOnlyMessageReceiver"
/>
</<messageReceivers>
</service>
注意:每一个Stub类的对象实例对应一个会话,
因此,不能在多个Stub类的对象之间
共享同一个会话。因此,一般在应用程序中应
将Stub类的对象实例作为全局对象来处理
(static变量或者其他的形式 )。除此之外,
<session>元素的scope属性值中所有的字母应该
为小写,如transportsession。
跨服务会话管理
在前面介绍的WebService会话可以很好的解决权限验证的问题,但还有一个很
闹心的问题没有解决,也许很多同学都看出来了。将<service>元素的scope属性值设置
为transportsession,虽然同一个webservice服务可以使用会话,但不同的webservice
服务之间却不同共享会话,这带来不便。
那么解决方法就是:跨服务会话管理,要想实现跨服务共享会话,需要做如下2件事情:
1.将ServiceContext sc = mc.getServiceContext()改成如下的代码:
ServiceGroupContext sc = mc.getServiceGroupContext;
2.将<service>元素的scope属性设置为applicaton。
客户端的Stub类不再需要加入如下的代码:
_serviceClient.getOptions.setManageSession(true);
第6讲 Axis2模板
1.介绍一下Axis2模块
2.Axis2模块的结果
3.演示如果安装和使用Axis2内置的soapmonitor模块
4.实现自定义的Logging模块
1.介绍一下Axis2模块
提供了和struts2过滤器的类似的机制,就是Axis2模块。
Axis2的模块都放在:tomcat\webapps\axis2\WEB-IN\modules
按照一定的规则来编写Axis2模块,一个模块的结构定义如下:
1.模块类。该类需要实现org.apache.axis2.modules.Module接口;
2.至少一个业务处理类:该类需要实现org.apache.axis2.engine.Handler接口
3.module.xml文件:该文件用于配置当前的模块
如果想使用某个模块,还需要在axis2.xml和services.xml文件中进行设置。
3.演示如果安装和使用Axis2内置的soapmonitor模块
soapmonitor模块是Axis2内置模块。这个模块的功能是将SOAP
请求和响应消息显示在页面上。所用的技术是Servlet+Applet.
这个模块需要在页面中转载一个Applet,通过Applet来监视
SOAP信息。如果这时有SOAP请求或者响应发生,Applet就会获得
这些SOAP消息,并将这些显示在页面上,同时在页面的上方显示
请求的URL。用户可以停止和开启soapmonitor功能。
配置:
(1)将tomcat\webapps\axis2\WEB-IN\lib目录中找到
soapmonitor-1.4.1.jar文件解压,将解压目录中的org目录拷贝到
<Tomcat安装目录>\webqpps\axis2目录中,applet所需要的
class文件需要放到这个目录。
(2)在tomcat\webapps\axis2\WEB-IN\web.xml中配置需要的servlet:
<servlet>
<servlet-name>SOAPMontitorService</servlet-name>
<servlet-class>
org.apache.axis2.soapmonitor.servlet.SOAPMontitorService
</servlet-class>
<init-param>
<param-name>SOAPMontitorPort</param-name>
<param-value>/SOAPMnotitor</param-value>
</init-param>
</servlet>
(3)在services.xml中加入以下行来引入soapmonitor
<module ref="soapmonitor" />
4.实现自定义的Logging模块
实现功能:将SOAP信息输出到Tomcat控制台。
实现Axis2模块的步骤:
1.编写实现Module接口的类。Axis2模块在进行初始化、销毁
等动作时会调用该类相应的方法。
2.编写实现Handler接口的类。该类是Axis2模块的业务处理类
3.编写module.xml文件,该文件放在META-INF目录中,用于
配置Axis2模块
4.在module.xml文件中配置Axis2模块
5.在services.xml文件中引用Axis2模块。
每一个Axis2模块都需要使用<module>元素引用才能使用。
6.发布Axis2模块。需要使用jar命令将Axis2模块压缩成mar
包(文件扩展名必须是mar),然后将.mar文件放在:
tomcat\webapps\axis2\WEB-IN\modules目录中。