使用自己发布的WebService与Flex通信
关键字: WebService Flex 通信 问题前几天发了个Flex利用HttpService和XML与后台的Servlet通信的例子,今天再给大家展示下本人近几天的学习成果----发布一个WebService,并利用其做为Flex与Java通信的桥梁。最后,我会给出在做这个例子时遇到的一些困难和解决方案。希望对大家有些帮助!
The First Step:
利用Apache的AXIS引擎发布WebService。(本文假设您已经下载了AXIS)
1 利用MyEclipse新建一个Web工程,把AXIS_HOME/webapps/axis/web-inf下的web.xml和lib目录拷贝到你所建的工程的相应目录。
2 创建一个Web服务的提供类,这里展示下我创建的类。
- /**
- * Web服务提供类
- *
- * 编写者:王景辉 湖南农业大学&湖南爱瑞洁投资管理公司
- */
- package com.wjh;
- import java.util.HashMap;
- public class WebServiceClass {
- HashMap data = new HashMap() ;
- public void init() {
- data.put("百度", "李彦宏") ;
- data.put("腾讯", "马化腾") ;
- data.put("网易", "丁磊") ;
- }
- public String get(String key) {
- init() ;
- return data.get(key) ;
- }
- public void put(String key,String value) {
- data.put(key, value) ;
- }
- }
然后把此类编译。
3 把此工程部署到Tomcat,然后转到Tomcat_HOME/webapps/你的工程/web-inf下面,建立一个wsdd文件,本例创建的文件名称为dep.wsdd。
- <deployment xmlns="http://xml.apache.org/axis/wsdd/"
- xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
- <service name="wjhService" provider="java:RPC">
- <parameter name="className" value="com.wjh.WebServiceClass"/>
- <parameter name="allowedMethods" value="*"/>
- service>
- deployment>
注意,这里面的className值和上面所建的类的包名一致,其中service的name取值任意,代表的在当前Web应用服务器唯一的WebService标识。
4 运用AXIS的AdminClient工具生成server-config.wsdd文件,即服务器端WebService的声明(行使到这一步,本文假设你已经正确的把AXIS的必须jar文件和其依赖库设置到了classpath,具体设置方式看看JavaEye的AXIS-http://www.javaeye.com/subject/Axis-Webservice打开命令行窗口,进入dep.wsdd文件所在的目录,运行java org.apache.axis.client.AdminClient undeploy.wsdd,如果出现<Admin>Done processing则表明发布成功。
5 在FlexBuilder2中画出Flex界面,本例的界面代码如下:
- xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
- <mx:WebService id="ws" wsdl="http://localhost:8080/ws/services/wjhService?wsdl" useProxy="false" showBusyCursor="true">
- <mx:operation name="put" result="Alert.show('恭喜!添加成功','返回框',3)" fault="Alert.show('添加失败','失败',3)">
- mx:operation>
- <mx:operation name="get" result="showInfo(event)" fault="Alert.show('失败','tile',2)">
- mx:operation>
- mx:WebService>
- <mx:Panel title="DataGrid Control Example" height="100%" width="100%"
- paddingTop="10" paddingLeft="10" paddingRight="10">
- <mx:Label x="10" y="10" text="公司" height="39" width="55" fontSize="21" fontWeight="bold"/>
- <mx:TextInput x="61" y="10" height="31" id="company"/>
- <mx:Label x="10" y="66" text="老大" width="55" height="49" fontSize="21" fontWeight="bold"/>
- <mx:TextInput x="61" y="75" height="31" id="ceo"/>
- <mx:Button label="添加" height="37" fontSize="17" id="add" click="addCompany();"/>
- <mx:Button label="查看" height="29" fontSize="17" id="see" click="seeCeo();"/>
- mx:Panel>
- >
上面代码的
大致的流程是这个样子的:添加个功能基本上没有什么作用(具体原因我会在后面阐述),主要是查看功能,因为我们前面的服务提供类定义了一个HashMap,并存储了一些数值,所以当我们输入键值时,服务期会返回相应的value。
6 打完收工,尽情的享受WebService吧!!!
Important:
这个例子虽然简单,但是确遇到了很多问题。
1 问题描述:生成server-config.wsdd文件时,AdminClient不会报错,也出现发布成功的信号,但是web-inf下就是没有server-config.wsdd文件生成。
解决方案:Tomcat版本过低,更换Tomcat版本,最好是Tomcat5.5及以上版本。我的是5.0就出现了此问题。
2 问题描述:Flex在运行时一篇深绿色,自己写上去的组件全部“潜水”,消失了!这个问题是最诡异的。
解决方案:本人一行一行代码的测,结果终于解决了这个问题。但是我不敢确定是不是这里的问题。我在自己的
3 大家看到我的服务提供类里面的get方法体第一句话是init方法的调用,刚开始写的时候我是直接return的,但是这样做时,当我点击界面的查看按钮时,Flex不会报错,但也没有任何值返回来,于是我先进行添加再进行查看,也没有任何效果,最后我把init方法调用放在了get的方法体,这样才能成功。
在此我有个疑问:是不是Flex在调用后台Web服务提供类的时候,是不是每次请求都要进行一次类的实例化?但是我自己都不太相信这个假想,假如不是这样,那我遇到的问题又怎么解释呢?欢迎道友给出见解!!!
附件是本例的源代码!!!
评论
Processing file delopy.wsdd
Exception: AxisFault
faultCode: {http://xml.apache.org/axis/}HTTP
faultSubcode:
faultString: (404)/axis/services/AdminService
faultActor:
faultNode:
faultDetail:
{}:return code: 404
<html><head><title>Apache Tomcat/5.5.16 - Error report</tit
le><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;ba
ckground-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;
color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Ari
al,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-f
amily:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-famil
y:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:
Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color :
black;}A.name {color : black;}HR {color : #525D76;}--></style> </hea
d><body><h1>HTTP Status 404 - /axis/services/AdminService</h1&
gt;<HR size="1" noshade="noshade"><p><b>ty
pe</b> Status report</p><p><b>message</b> <u>
;/axis/services/AdminService</u></p><p><b>description<
;/b> <u>The requested resource (/axis/services/AdminService) is not ava
ilable.</u></p><HR size="1" noshade="noshade"
><h3>Apache Tomcat/5.5.16</h3></body></html>
{http://xml.apache.org/axis/}HttpErrorCode:404
可以这样解决:
java org.apache.axis.client.AdminClient -lhttp://地址:端口/context模块/services/AdminService dep.wsdd
例如本例发布Web服务的命令为:
java org.apache.axis.client.AdminClient -lhttp://localhost:8080/ws/services/AdminService dep.wsdd
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 29678 次
- 性别:

- 来自: 长沙

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
Oracle中实现分页的SQL语 ...
注意需要排序是使用:ROW_NUMBER() OVER (ORDER BY fi ...
-- by topcloud -
Flex与Java Servlet交互实 ...
呵呵,有什么问题在这里交流吧! 发站内短信也可以。QQ一般不上
-- by mhqawjh -
Oracle中实现分页的SQL语 ...
我认为用这个比较好 select * from ( select row_.*, ...
-- by feiji868 -
Flex与Java Servlet交互实 ...
写得很好。有很大的提示作用。多谢楼主,希望能有更多彩的文章。
-- by hegang3 -
Oracle中实现分页的SQL语 ...
laodizhuq 写道应该是: SELECT x.* from ( ...
-- by armorking






评论排行榜