我怎么看qq开通的服务globalaxis是开通的

vb6.0加载程序出错,该如何处理_Webservic axis公布出错-找了好久都不知道哪错,求高手解答_WPF 动态的条形图,(大神们.) 小弟我都快急死了.上午之前必须完成呀__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
vb6.0加载程序出错,该如何处理
Webservic axis公布出错-找了好久都不知道哪错,求高手解答
WPF 动态的条形图,(大神们.) 小弟我都快急死了.上午之前必须完成呀
vb6.0加载程序出错,该如何处理
vb6.0加载程序出错从网上下载了一个源码,在我的机器上不能正常运行,我的系统是win7旗舰的,在别人的机器上都可以正常运行,我安装了一个虚拟机,也可以正常运行。我就感觉是vb的安装程序出问题了,于是从新卸载安装了vb环境,可是情况依然存在,求高人指点~~毕竟每次都用虚拟机还是太不方便啊
对了,报错的地方其实本来就不是错,一个菜单的的enable属性不能设置,这个肯定没问题,不过总是到这就出错,我把菜单项给去掉之后,又会出现其他的错误,这些在其他的机器上木有问题,所以很烦人啊,觉得还是vb环境出问题了,求解决方法------解决方案--------------------估计啊,win7和vb6还有有代沟的
------解决方案--------------------VB安装后要安装SP小益的小JJ呢?
估计啊,win7和vb6还有有代沟的
------解决方案--------------------
DLL 或控件
引用 目录不对
重新引用一下 就OK 的
Webservic axis公布出错-找了好久都不知道哪错,求高手解答
Webservic axis发布出错----找了好久都不知道哪错,求高手解答我是看着这个做的/zzticzh/blog/item/b290b2386f36bdddd4622521.html。他的源代码我运行没问题。但是我把他的东西全复制过去出现404 未找到。
而且我的web.xml 报(唯一一个报错的地方)
cvc-complex-type.2.4.a: Invalid content was found starting with element 'display-name'. One of '{"/xml/ns/
javaee":servlet-class, "/xml/ns/javaee":jsp-file}' is expected.
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"&
&!-- Apache-Axis 配置开始 --&
&servlet-name&AxisServlet&/servlet-name&
&display-name&Apache-Axis Servlet&/display-name&
&servlet-class&org.apache.axis.transport.http.AxisServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&AxisServlet&/servlet-name&
&display-name&查看Services列表&/display-name&
&url-pattern&/services/&/url-pattern&
&/servlet-mapping&
&servlet-mapping&
&servlet-name&AxisServlet&/servlet-name&
&display-name&Services地址&/display-name&
&url-pattern&/services/*&/url-pattern&
&/servlet-mapping&
&!-- Apache-Axis 配置结束 --&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
server-config.wsdd
&?xml version="1.0" encoding="UTF-8"?&
&deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&
&globalConfiguration&
&parameter name="sendMultiRefs" value="true" /&
&parameter name="disablePrettyXML" value="true" /&
&parameter name="adminPassword" value="admin" /&
&parameter name="attachments.Directory" value="./attachments" /&
&parameter name="dotNetSoapEncFix" value="true" /&
&parameter name="enableNamespacePrefixOptimization" value="false" /&
&parameter name="sendXMLDeclaration" value="true" /&
&parameter name="sendXsiTypes" value="true" /&
&parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl" /&
&requestFlow&
&handler type="java:org.apache.axis.handlers.JWSHandler"&
&parameter name="scope" value="session" /&
&/handler&
&handler type="java:org.apache.axis.handlers.JWSHandler"&
&parameter name="scope" value="request" /&
&parameter name="extension" value=".jwr" /&
&/handler&
&/requestFlow&
&/globalConfiguration&
&handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper" /&
&handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" /&
&handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" /&
&!-- 发布WebService
name:service名称
&service name="SayHello" provider="java:RPC"&
&!-- 允许调用的方法 * 全部
&parameter name="allowedMethods" value="*" /&
&!-- WebService 对应的class
&parameter name="className" value="com.WebService.server.SayHello" /&
&/service&
&service name="AdminService" provider="java:MSG"&
&parameter name="allowedMethods" value="AdminService" /&
&parameter name="enableRemoteAdmin" value="false" /&
&parameter name="className" value="org.apache.axis.utils.Admin" /&
&namespace&http://xml.apache.org/axis/wsdd/&/namespace&
&/service&
&service name="Version" provider="java:RPC"&
&parameter name="allowedMethods" value="getVersion" /&
&parameter name="className" value="org.apache.axis.Version" /&
&/service&
&transport name="http"&
&requestFlow&
&handler type="URLMapper" /&
&handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler" /&
&/requestFlow&
&parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler" /&
&parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" /&
&parameter name="qs.list"
value="org.apache.axis.transport.http.QSListHandler" /&
&parameter name="qs.method"
value="org.apache.axis.transport.http.QSMethodHandler" /&
&parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler" /&
&parameter name="qs.wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler" /&
&/transport&
&transport name="local"&
&responseFlow&
&handler type="LocalResponder" /&
&/responseFlow&
&/transport&
&/deployment&------解决方案--------------------File &/axis2-web/listSingleService.jsp& not found------解决方案--------------------我已经用XFire解决发不webservice的问题了,现又遇到一个问题。求解答。。。。
http://topic.csdn.net/u//20f7ae61-183d-47c6-97b4-c3383e3aee9b.html------解决方案--------------------给分,版本问题真纠结
WPF 动态的条形图,(大神们.) 小弟我都快急死了.上午之前必须完成呀
WPF 动态的条形图,(大神们...) 我都快急死了.下午之前必须完成呀我初学WPF不到2个星期,今天要完成一个动态的条形图.
脑子就一片空白了,
求指教呀 大神们...组长帮我下载了一个DevExpress WPF Demos
在上面有一个图形的源码是这样的&Grid&
&dxc:ChartControl Name="chart" BorderThickness="0" EnableAnimation="True"
CrosshairEnabled="{Binding ElementName=chbVisible, Path=IsChecked, Converter={StaticResource InvertedBoolConverter}}"&
&dxc:ChartControl.CrosshairOptions&
&dxc:CrosshairOptions CrosshairLabelMode="ShowForNearestSeries"/&
&/dxc:ChartControl.CrosshairOptions&
&dxc:ChartControl.Diagram&
&dxc:XYDiagram2D BarDistance="0.04"&
&dxc:XYDiagram2D.DefaultPane&
&dxc:Pane MirrorHeight="100.0"/&
&/dxc:XYDiagram2D.DefaultPane&
&dxc:XYDiagram2D.AxisX&
&dxc:AxisX2D TickmarksLength="{Binding ElementName=lbModel, Path=SelectedItem, Converter={StaticResource Bar2DKindToTickmarksLengthConverter}}" /&
&/dxc:XYDiagram2D.AxisX&
&dxc:XYDiagram2D.AxisY&
&dxc:AxisY2D&
&dxc:AxisY2D.Title&
&dxc:AxisTitle Content="Millions of Dollars" /&
&/dxc:AxisY2D.Title&
&/dxc:AxisY2D&
&/dxc:XYDiagram2D.AxisY&
&dxc:XYDiagram2D.Series&
&dxc:BarSideBySideSeries2D x:Name="Series1998"
DisplayName="1998"
Model="{Binding ElementName=lbModel, Path=SelectedItem, Converter={StaticResource Bar2DKindToBar2DModelConverter}}"
AnimationAutoStartMode="SetStartState" &
&dxc:BarSideBySideSeries2D.Label&
&dxc:SeriesLabel Indent="20" ResolveOverlappingMode="Default"
ConnectorThickness="1"
Visible="{Binding ElementName=chbVisible, Path=IsChecked}"
dxc:BarSideBySideSeries2D.LabelPosition="{Binding ElementName=lbPosition, Path=SelectedItem}" /&
&/dxc:BarSideBySideSeries2D.Label&
&dxc:BarSideBySideSeries2D.Points&
&dxc:SeriesPoint Argument="Illinois" Value="423.721" /&
&dxc:SeriesPoint Argument="Indiana" Value="178.719" /&
&dxc:SeriesPoint Argument="Michigan" Value="308.845" /&
&dxc:SeriesPoint Argument="Ohio" Value="348.555" /&
&dxc:SeriesPoint Argument="Wisconsin" Value="160.274" /&
&/dxc:BarSideBySideSeries2D.Points&
&/dxc:BarSideBySideSeries2D&
&dxc:BarSideBySideSeries2D x:Name="Series2001"
DisplayName="2001"
Model="{Binding ElementName=lbModel, Path=SelectedItem, Converter={StaticResource Bar2DKindToBar2DModelConverter}}"
AnimationAutoStartMode="SetStartState"
ToolTipPointPattern="Year: {S}
State: {A}
GSP: {V}"&
&dxc:BarSideBySideSeries2D.Label&
&dxc:SeriesLabel Indent="20" ResolveOverlappingMode="Default"
ConnectorThickness="1"
Visible="{Binding ElementName=chbVisible, Path=IsChecked}"
dxc:BarSideBySideSeries2D.LabelPosition="{Binding ElementName=lbPosition, Path=SelectedItem}" /&
&/dxc:BarSideBySideSeries2D.Label&
&dxc:BarSideBySideSeries2D.Points&
&dxc:SeriesPoint Argument="Illinois" Value="476.851" /&
&dxc:SeriesPoint Argument="Indiana" Value="195.769" /&
&dxc:SeriesPoint Argument="Michigan" Value="335.793" /&
&dxc:SeriesPoint Argument="Ohio" Value="374.771" /&
&dxc:SeriesPoint Argument="Wisconsin" Value="182.373" /&
&/dxc:BarSideBySideSeries2D.Points&
&/dxc:BarSideBySideSeries2D&
&dxc:BarSideBySideSeries2D x:Name="Series2004"
DisplayName="2004"
Model="{Binding ElementName=lbModel, Path=SelectedItem, Converter={StaticResource Bar2DKindToBar2DModelConverter}}"
AnimationAutoStartMode="SetStartState"
ToolTipPointPattern="Year: {S}
State: {A}
GSP: {V}"&
&dxc:BarSideBySideSeries2D.Label&
&dxc:SeriesLabel Indent="20" ResolveOverlappingMode="Default"
ConnectorThickness="1"
Visible="{Binding ElementName=chbVisible, Path=IsChecked}"
dxc:BarSideBySideSeries2D.LabelPosition="{Binding ElementName=lbPosition, Path=SelectedItem}" /&
&/dxc:BarSideBySideSeries2D.Label&
&dxc:BarSideBySideSeries2D.Points&
&dxc:SeriesPoint Argument="Illinois" Value="528.904" /&
&dxc:SeriesPoint Argument="Indiana" Value="227.271" /&
&dxc:SeriesPoint Argument="Michigan" Value="372.576" /&
&dxc:SeriesPoint Argument="Ohio" Value="418.258" /&
&dxc:SeriesPoint Argument="Wisconsin" Value="211.727" /&
&/dxc:BarSideBySideSeries2D.Points&
&/dxc:BarSideBySideSeries2D&
&/dxc:XYDiagram2D.Series&
&/dxc:XYDiagram2D&
&/dxc:ChartControl.Diagram&
&dxc:ChartControl.Legend&
&dxc:Legend ReverseItems="True" /&
&/dxc:ChartControl.Legend&
&dxc:ChartControl.Titles&
&dxc:Title Dock="Top" HorizontalAlignment="Center"&Great Lakes Gross State Product&/dxc:Title&
&dxc:Title Dock="Bottom" HorizontalAlignment="Right" FontSize="12" Foreground="Silver" Margin="0,10,0,0"&From www.bea.gov&/dxc:Title&
&/dxc:ChartControl.Titles&
&/dxc:ChartControl&
&/Grid&我只能弱弱的看懂一点点...需要显示的数据应该与一个自己写的Model想对应的然后取值出来显示的, 那该怎么去做呢,model应该如何去写.又是如何将取出来的值放入代码中,如果不是在前台放入值,那么在后台又是怎样放入值呢..
自己弄了半天,还是不能将数据显示.....------解决方案--------------------
通过服务去取得数据库中的数据,然后在页面下的CS文件中取得返回的数据
------解决方案--------------------
用图片代替条形图的条状体。图片的高度就是条形图的值。位置自己在页面上放好。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:AXIS实现Web服务深入篇
&&AXIS实现Web服务深入篇
AXIS实现Web服务深入篇
serviceWeb/Web
前段时间我的一篇文章《应用AXIS开始Web服务之旅》介绍了如何通过AXIS这个项目来实现Web服务的功能。该文章主要介绍AXIS的结构、如何使用jws文件的方式开发一个简单的Web服务,并用了比较大的篇幅来介绍Web服务的客户端编程,应该说是使用AXIS开发Web服务的入门篇,本文假设你已经看过《应用AXIS开始Web服务之旅》并对AXIS有一定的基础,在这个基础上我们将要介绍的内容有几个方面包括使用service方式实现Web服务、复杂类型参数或者返回值以及面向消息/文档的服务类型,同时还会简单提及Web服务的会话管理以及安全问题等等。
在开始我们的文章之前,我们还需要搭建一个环境,我们需要一个支持Web服务的web应用程序并假设名字为axis,如何建立请参照《应用AXIS开始Web服务之旅》文章中的介绍。
使用定制发布编写Web服务
使用jws文件的方式编写Web服务具有方便、快捷的优点,它可以很快的将你已有的类发布成Web服务。但是更多的时候这并不是一个好的主意,因为这种做法引发的问题是我们必须要将已有类的源码发布出来,因为更多的时候我们并不想这样做;另外虽然你可以先用工具开发并调试完毕一个java文件后再改名为jws,但是这多少有些便扭,而且并不是类中的所有方法你都想发布成可通过Web服务来访问的,这时候你就必须将这些方法的修饰符改为不是public的,这就跟你原有的类不同步,以后的修改将会更加的麻烦。
在这里我把定制发布方式称为service方式,就好像JSP的出现不会使Servlet失宠的道理一样,有了jws,service方式还是有它的用武之地,而且是大放异彩。发布一个service方式的Web服务需要两部分内容:类文件以及Web服务发布描述文件。下面我们使用一个简单的例子来讲述这个过程。
首先我们需要一个service类,这个类跟普通的类没有任何区别,下面是我们实现一个城市便民服务的类,我们需要将CityService类的两个方法getZip和getTel发布成Web服务,编译该文件并把class文件拷贝到&webapp&/WEB-INF/classes对应目录下。
Package lius.axis.
&&* 该类实现了城市服务,用于发布成Web服务
&&* @author Liudong
&&public class CityService {
&&&&* 获取指定城市的邮编&&&&
&&&&* @param city&&&&
&&&&* @return&&&&
& &&public String getZip(String city) {
&&&&&&&& return "510630";
&&&&/**&&&&
&&&&&&* 获取指定城市的长途区号&&&&
&&&&&&* @param city&&&&
&&&&&&* @return&&&&
&&&&public String getTel(String city) {
&&&&&&&& return "020";
程序已经完成,下面是发布这个Web服务。打开&webapp&/WEB-INF/server-config.wsdd如果这个文件不存在则创建一个新的文件,内容如下:
&?xml version="1.0" encoding="UTF-8"?&
&deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"&
&&&&&&&& &globalConfiguration&&
&&&&&&&&&&&&&&&& &parameter name="adminPassword" value="admin"/&&
&&&&&&&&&&&&&&&& &parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/&&
&&&&&&&&&&&&&&&& &parameter name="sendXsiTypes" value="true"/&&
&&&&&&&&&&&&&&&& &parameter name="sendMultiRefs" value="true"/&&
&&&&&&&&&&&&&&&& &parameter name="sendXMLDeclaration" value="true"/&&
&&&&&&&&&&&&&&&& &parameter name="axis.sendMinimizedElements" value="true"/&&
&&&&&&&&&&&&&&&& &requestFlow&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &handler type="java:org.apache.axis.handlers.JWSHandler"&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &parameter name="scope" value="session"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &/handler&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &handler type="java:org.apache.axis.handlers.JWSHandler"&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &parameter name="scope" value="request"/&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &parameter name="extension" value=".jwr"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &/handler&&
&&&&&&&&&&&&&&&& &/requestFlow&
&&&&&&&& &/globalConfiguration&
&&&&&&&& &handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/&
&&&&&&&& &handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/&
&&&&&&&& &handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/&&&
&&&&&&&& &service name="city" provider="java:RPC"&&
&&&&&&&&&&&&&&&& &!-- 服务类名 --& &
&&&&&&&&&&&&&&&& &parameter name="className" value="lius.axis.demo.CityService"/&&
&&&&&&&&&&&&&&&& &!-- 允许访问所有方法 --&&
&&&&&&&&&&&&&&&& &parameter name="allowedMethods" value="*"/&
&&&&&&&& &/service&&
&&&&&&&& &transport name="http"&&
&&&&&&&&&&&&&&&& &requestFlow&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &handler type="URLMapper"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/&&
&&&&&&&&&&&&&&&& &/requestFlow&
&&&&&&&& &/transport&
&&&&&&&& &transport name="local"&&
&&&&&&&&&&&&&&&& &responseFlow&&&
&&&&&&&&&&&&&&&&&&&&&&&&& &handler type="LocalResponder"/&&
&&&&&&&&&&&&&&&& &/responseFlow&
&&&&&&&& &/transport&
&/deployment&
其中粗斜体的部分是我们服务的配置信息,启动Tomcat并打开浏览求访问地址: http://localhost:8080/axis/services/city?wsdl ,下面是浏览器显示我们Web服务的WDSL数据。
当然了,这个过程比起jws方式来说是稍微麻烦一点,你可以把它想象成你发布一个servlet一样,创建servlet类然后在web.xml中加入配置信息。
处理复杂类型参数和返回值
之前我们做的演示程序都很简单,方法的参数和返回值都是简单类型的数据,但是在实际应用过程中往往没有这么简单。在使用面向对象的编程语言时,我们会希望数据类型可以是某个对象,比如我们提供一个接口用来发送短信息,那么我们希望接口的参数是一个消息对象,这个消息对象封装了一条信息的所有内容包括发送者、接收者、发送时间、优先级、信息内容等等,如果我们把每个内容都做成一个参数,那这个接口的参数可能会非常的多。因此封装成对象是很有必要的。
在使用Axis来编写Web服务时对复杂类型数据的处理同样也是非常简单。Axis要求复杂类型对象的编写必须符合JavaBean的规范,简单的说就是对象的属性是通过getter/setter方法来访问的。来看看下面这个简单的例子所输出的WSDL信息有何特殊的地方。为了简便,我们还是使用jws来编写,需要编写三个文件:sms.jws,Message.java,Response.java。
//文件名:sms.jws
import lius.axis.demo.*;
public class sms{&&&&&&&&
&&* 短信息发送Web服务接口&
&&public Response send(Message msg) throws Exception{
&&&&&&&& System.out.println("CONTENT:"+msg.getContent());
&&&&&&&& Response res = new Response();
&&&&&&&& res.setMessage(msg);
&&&&&&&& res.setCode(0);
&&&&&&&& res.setErrorText("");
&&&&&&&& &&&
//Message.javapackage lius.axis.
&&* 欲发送的信息
&&* @author Liudong
public class Message {
&&&&&&&& private S
&&&&&&&& private S
&&&&&&&& private S
&&&&&&&& public String getContent() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setContent(String content) {
&&&&&&&&&&&&&&&& this.content =
&&&&&&&& }
&&&&&&&& public String getFrom() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setFrom(String from) {
&&&&&&&&&&&&&&&& this.from =
&&&&&&&& }&&&
&&&&&&&& public int getPriority() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setPriority(int priority) {
&&&&&&&&&&&&&&&& this.priority =
&&&&&&&& }
&&&&&&&& public String getTo() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setTo(String to) {
&&&&&&&&&&&&&&&& this.to =
&&&&&&&& }
//Response.javapackage lius.axis.
&&* 信息发送回应,在这里我们做了一个对Message 类的引用
&&* @author Liudong
public class Response {
&&&&&&&& //发送结果代码
&&&&&&&& private String errorT
&&&&&&&& private M
&&&&&&&& //发送的原始信息&
&&&&&&&& public int getCode() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setCode(int code) {
&&&&&&&&&&&&&&&& this.code =
&&&&&&&& }
&&&&&&&& public String getErrorText() {
&&&&&&&&&&&&&&&& return errorT
&&&&&&&& }
&&&&&&&& public void setErrorText(String errorText) {&&
&&&&&&&&&&&&&&&& this.errorText = errorT
&&&&&&&& }
&&&&&&&& public Message getMessage() {
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public void setMessage(Message message) {
&&&&&&&&&&&&&&&& this.message =
&&&&&&&& }
编译Message.java和Response.java并将编译后的类文件拷贝到axis/WEB-INF/classes对应包的目录下,sms.jws拷贝到axis目录,访问http://localhost:8080/axis/sms.jws?wsdl即可看到WSDL信息,这些信息与之前不同的在于下面列出的内容(注意粗斜体部分内容):
&wsdl:types&
&schema targetNamespace="http://demo.axis.lius" xmlns="http://www.w3.org/2001/XMLSchema"&
& &import namespace="http://schemas.xmlsoap.org/soap/encoding/" /&
& &complexType name="Message"&
&&& &sequence&
&&&&& &element name="content" nillable="true" type="xsd:string" /&
&&&&& &element name="from" nillable="true" type="xsd:string" /&
&&&&& &element name="priority" type="xsd:int" /&
&&&&& &element name="to" nillable="true" type="xsd:string" /&
&&& &/sequence&
& &/complexType&
& &complexType name="Response"&
&&& &sequence&
&&&&& &element name="code" type="xsd:int" /&
&&&&& &element name="errorText" nillable="true" type="xsd:string" /&
&&&&& &element name="message" nillable="true" type="tns1:Message" /&
&&& &/sequence&
& &/complexType&
&/wsdl:types&
这里定义了两个类型Message和Response,就是我们接口的参数类型以及返回值的类型。现在再使用WSDL2Java工具来生成客户端Helper类看看Axis帮我们做了什么?它会自动帮我们生成两个类Message和Response,包名与类名都跟我们刚才定义的一致,你可以打开看看跟我们刚才编写的类差别多大?这两个类添加了很多方法例如getTypeDesc、getSerializer、getDeserializer等等。现在你就可以随便写个小程序测试一下了,我们就不在累赘了。Service方式Web服务的处理跟jws是类似的,不同在于service方式需要在server-config.wsdd添加类型的映射配置,下面给出一个配置的示例,读者可以根据实际情况进行修改。
&service name="SmsService" provider="java:RPC"&
&&&&&&&& &parameter name="className" value="lius.axis.demo.SmsService"/&
&&&&&&&& &parameter name="allowedMethods" value="send"/&
&&&&&&&& &operation name="send" returnType="ns:Response"&
&&&&&&&&&&&&&&&& &parameter name="msg" type="ns:Message"/&
&&&&&&&& &/operation&
&!-- 这里定义了方法的参数以及返回值 --&
&&&&&&&& &typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"&&
&&&&&&&& encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
&&&&&&&& qname="ns:Message"
&&&&&&&& serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
&&&&&&&& type="java:lius.axis.demo.Message" xmlns:ns="SmsService"/&
&&&&&&&& &typeMapping
&&&&&&&& deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"&&& encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
&&&&&&&& qname="ns:Response"&&&
&&&&&&&& serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"&&& type="java:lius.axis.demo.Response" xmlns:ns="SmsService"/&
&/service&
其他编程语言也都可以借助语言本身所附带的工具来生成这些复杂类型,如果你嫌麻烦的话可以使用XML来描述这些复杂类型,这样就简单很多。
面向消息/文档的Web服务类型
我们前面介绍的服务方式是基于RPC(远程过程调用)方式,这也是Web服务最常用的方式。面向消息/文档的的类型跟RPC不同的是它提供了一个更底层的抽象,要求更多的编程工作。客户端可以传入任何的XML文档,得到的响应不一定是SOAPEnvelope,可以返回任何它所需要的东西,甚至不返回。虽然这对开发者来说非常的灵活,但是这种通讯类型在实际的应用中并不常见。面向消息/文档的Web服务主要适合于下面几种情况,比如批量处理,基于表单的数据导入,有需要返回非XML数据时,Web服务器实现中要求直接访问传输层等等。
对于RPC类型的服务需要在全局配置文件server-config.wsdd中设置一行&service ... provider="java:RPC"&,其中RPC就是服务的方式,而对于面向消息/文档的服务类型那java:RPC就要替换成为Message,并且面向消息/文档的服务类型必须通过WSDD配置来发表。对于完成面向消息服务的类,其方法必须具有以下的格式:
public Element[] methodName(Element [] elems)
其中methodName为你自定义的方法名。在Axis的目录下可以找到MessageService.java,这就是一个完成了该类型的服务类,该服务的在WSDD中的配置如下:
&deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"&&&&& xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"&
&&&&&&&& &service name="MessageService" style="message"&
&&&&&&&&&&&&&&&& &parameter name="className" value="samples.message.MessageService"/&
&&&&&&&&&&&&&&&& &parameter name="allowedMethods" value="methodName"/&
&&&&&&&& &/service&
&/deployment&
不管是什么内容的Web服务,对客户端来说都是一样的,使用WSDL2Java来生成的客户端Helper类的MessageService接口如下:
&&* MessageService.java
&&* This file was auto-generated from WSDL
&&* by the Apache Axis WSDL2Java emitter.
package liudong.axis.services.MessageS
public interface MessageService extends java.rmi.Remote {
&&&&&&&& public java.lang.Object echoElements(java.lang.Object part) throws java.rmi.RemoteE
我从哪里可以获得…
Axis文档中有一句话很有意思,对于绝大多数类似于"我从哪里可以获得…"的问题,答案都在MessageContext类中。通过MessageContext类你可以获取下面几个内容,一个AxisEngine实例的引用;请求以及回应的信息;验证信息以及对于Servlet规范中的实例引用等等。例如当我们需要客户端的IP地址时我们可以通过下面代码片段获取:
&&* 获取客户端请求&&&&
&&* @return&&&&
private HttpServletRequest getRequest() throws Exception{
&&&&&&&& MessageContext context = MessageContext.getCurrentContext();
&&&&&&&& HttpServletRequest req = (HttpServletRequest)context.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);&&&&&&&
&&&&&&&& return req.getRemoteHost();
在类HTTPConstants中,所有以MC_开头的常量就是你所可以获取到的信息,例如上面通过MC_HTTP_SERVLETREQUEST获取对应Servlet规范中的HTTP请求。更详细的信息可以通过查询API文档获取。
Web服务会话管理
在Web服务中我们可以借助HTTP以及HTTP Cookie来处理会话信息。前面我们介绍了大多数对Axis的管理都是通过MessageContext实例来完成的。下面的例子首先验证用户的登录帐号与口令如果正确则在会话中保存用户的登录信息,并提供接口供客户端获取密码。
import org.apache.axis.MessageC
import org.apache.axis.session.S
public class login{&&&&&&
&&&&&&&& public boolean login(String user, String pass){&&&&
&&&&&&&&&&&&&&&& MessageContext mc = MessageContext.getCurrentContext();
&&&&&&&&&&&&&&&& Session session = mc.getSession();
&&&&&&&&&&&&&&&& session.set("user",user);
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& //保存用户名与口令
&&&&&&&&&&&&&&&& session.set("pass",pass);
&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& public String getPassword(String user){
&&&&&&&&&&&&&&&& MessageContext mc = MessageContext.getCurrentContext();
&&&&&&&&&&&&&&&& Session session = mc.getSession();
&&&&&&&&&&&&&&&& if(user.equals(session.get("user")))&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&& return (String)session.get("pass");
&&&&&&&&&&&&&&&&
&&&&&&&& }
对于服务器端来讲只需要通过MessageContext实例获取Session对象即可进行会话级的数据保存或者读取,而对于通过Axis的WSDL2Java工具生成的客户端来讲还需要做一个特殊的设置,请看下面客户端代码片段。
public static void main(String[] args) throws Exception {
&&&&&&&& LoginServiceLocator lsl = new LoginServiceLocator();
&&&&&&& lsl.setMaintainSession(true);
&&&&&&& Login login = lsl.getlogin();
&&&&&&& if(login.login("ld","haha"))
&&&&&&&&&&&&&&&& System.out.println("PWD:"+login.getPassword("ld"));
&&&&&&& else&
&&&&&&&&&&&&&&&& System.out.println("Login failed.");
代码中的粗体部分就是让Axis帮助我们自动处理服务器返回的Cookie信息以保证会话正常工作。
保护Web服务
网络的安全问题永远是需要最先考虑的问题,可是怎么能让我们的Web服务更加安全呢?为此Axis建议可以根据实际的需要采取以下的几种方法。
AxisAdminServiceAxisServletAxishappyaxis.jspjar
axis.enableListQueryfalseAxisServlet
最常用的不外乎上面几个,至于更详细的资料可以参考Axis解压目录下的docs/reference.html文件的详细介绍。
请大家继续欣赏更多的AXIS实现Web服:
AXIS实现Web服务深入篇 相关推荐
? ? ? ? ? ? ? ? ? ?

我要回帖

更多关于 myglobalaxis 的文章

 

随机推荐