Java中的各大WebService:Java6、Axis2、XFire、CXF简要介绍和使用

归类于Java 参与评论

Java中的各大WebService:Java6、Axis2、XFire、CXF简要介绍和使用

首先说明下,对于以上这些开源的框架和JWS,我都用过了。

看了前面一系列Java6 JWS的文章,很显然,无论从开发还是部署角度来说,Java6的JWS都是最容易的。我们不禁回想:有了Java6,还需要Axis2、XFire、CXF吗?

要回答这个问题,需要对几种JWS的实现以及其他功能做个对比就搞明白了。

1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。

2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。

3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。

4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。

基于以上的认识,我们可以得知,虽然有了Java6,但是我们还可以选择Axis2、XFire、CXF等。我们不能指望有了Java6 JWS,就能异想天开去实施SOA。如果要与别的语言交互,也许我们还有赖于Axis2等等,当然这不是唯一选择,仅仅是一种可供选择的方案。

还有,目前很多企业的应用还是基于Java5的,而Java5的项目不会瞬间都升级到Java6,如果要在老项目上做扩展,我们还有赖于其他开源的WS引擎。

因此,是否还需要Aixs2、XFire、CXF要看你具体的项目是否需要,而不能一概而论。

关于 java.lang.IllegaAccessError:Class ref in pre-verified class resoved to unexpected implementation

归类于Android 参与评论

初始Adroid 魔幻威力,遇此一难题,四处搜寻解决之道。

错误现象:在将程序安装到模拟器,并启动程序时直接报错。提示主程序严重异常。

原因:由于一开始没有直接指定BuildTarget的GoogleMapAPI,所以自己直接将map.jar复制到了lib下,导致环境中跟项目中都有map.jar,多出了,导致出错。

解决方法:删除lib下的map.jar,指定BuildTarget为GoogleMapAPI。

就此google 地图正常出现。爽哉!

———–一些详细示例———————:

http://www.cnblogs.com/zhangdongzi/archive/2012/01/09/2317632.html

http://hi.baidu.com/168dengruijun/item/6adab9bb6d687ba6eaba93cc

http://noobjava.iteye.com/blog/1004781

http://wenku.baidu.com/view/704d821ea76e58fafab003b0.html

http://wenku.baidu.com/view/1706d7ea6294dd88d0d26bd3.html

https://developers.google.com/maps/?hl=zh-CN

———–以下为一些参考——————-:

这2天在研究了一下Google map,遇到了一个错误

:java.lang.IllegaAccessError:Class ref in

pre-verified class resoved to unexpected

implementation

这个错误的意思是引进了没有必要的包。经过1的

纠结,我才发现我在建工程的时候Build Target

没有选择“Google APIs‘,所以在程序中用到

google map的类

的时候eclipse会提示我引进外面google map的包

,所以导致了这个 错误,fk,浪费了我一天的时

间。希望以后编程能够细心一点!

Android Google Map API 开发基础知识

归类于Android 参与评论

开发基于谷歌地图的应用和普通的android应用差不多都要使用它提供给我们的类库,所不同的是google map的类库不是android平台的基本类库,是google api的一部分,所以建立项目时,SDK要选择Google APIs;

还有一点,开发基于地图的应用时候需要使用google map的APIkey,必须先申请key,然后才能开发基于地图的应用。

下边分步骤记录下,整个过程:

 一、申请google Maps API key(用于开发和debug)

为了能顺利的申请Android Map API Key,必须要准备google的账号和系统的证明书。一般Google发布Key都需要Google账号,Google账号是通用的,Gmail的账号就可以。当一个程序发布时必须要证明书,证明书其实就是MD5.我们这里并不是发布,而只是为了开发测试,可以使用Debug版的证明书,下面我们就来学习如何申请Debug版的Key:

1.找到你的debug.keystore文件

在Eclipse工具下,选择windows–>Preference–>Android–>Build,其中Default debug keystore的值便是debug.keystore的路径了。

2.取得debug.keystore的MD5值

首先cmd命令行进入debug.keystore文件所在的路径,执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是“android”,这样即可取得MD5值。

3.申请Android Map 的API Key.

打开浏览器,输入网址:http://code.google.com/android/maps-api-signup.html,填入你的认证指纹(MD5)即可获得apiKey了,结果显示如下:

感谢您注册 Android 地图 API 密钥!
您的密钥是:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我IE打开的时候是乱码,不知道是不是自己电脑有问题。后来改用了chrome就正常显示了。

到此,我们就完成了API Key的申请了,记录下Key值,在后续开发中使用。(放在layout中加入的MapView中)

二.Google Map API的使用

Android中定义了一个名为com.google.android.map的包,其中包含了一系列用于在google map上显示、控制和叠层信息的功能类,以下是该包中最重要的几个类:

1.MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity,并且在其派生类的onCreate()中,都要创建一个MapView实例。

2.MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文件系统,而这些线程需要有MapActivity来管理。

3.MapController:MapController用于控制地图的移动、缩放等。

4.OverLay:这是一个可显示于地图之上的可绘制的对象。

5.GeoPoint:这是一个包含经纬度位置的对象。

三.实例开发

1.创建工程,注意SDK旋转为”Goolge APIs”

2.修改AndroidManifest.xml文件

由于使用Google Map API,所以必须添加<uses-library android:name=”com.google.android.maps” />

由于需要从网络获取地图数据,所以需要访问网络的权限<uses-permission android:name=”android.permission.INTERNET”/>

可能还需要添加其他权限。

例如:

AndroidManifest.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.yarin.android.Examples_09_03″
android:versionCode=”1″
android:versionName=”1.0″>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<uses-library android:name=”com.google.android.maps” />
<activity android:name=”.Activity01″
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>
<uses-permission android:name=”android.permission.INTERNET” />
<uses-sdk android:minSdkVersion=”5″ />
</manifest>
复制代码

3.创建MapView

要显示地图,需要创建一个MapView,在Xml文件中的布局如下。其中的android:apiKey的值就是我们第一步申请的Key了。

main.xml

复制代码
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<com.google.android.maps.MapView
android:id=”@+id/MapView01″
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:apiKey=”0AubmfALdupLSlQkE67OTXgcQgWtyhXcO7uhsIQ”/>
</RelativeLayout>
复制代码

当然,可以在程序中通过如下代码来创建MapView:

MapView map = new MapView( this, “(android maps api key)”);

4.实现MapActivity

MapView需要由MapActivity来管理,所以程序部分应该继承自MapActivity类,必须实现isRouteDisplay方法。

MapView提供了3中模式的地图,分别可以通过以下方式设置采用什么模式来显示地图。

mMapView.setTraffic(true); //设置为交通模式

mMapView.setSatellite(true); //设置为卫星模式//

mMapView.setStreetView(false); //设置为街景模式

通过setBuiltZoomControls方法设置地图是否支持缩放。

5.MapController的使用

如果需要设置地图显示的地点以及放大倍数等,就需要使用MapController来控制地图。可以通过如下代码获得MapController对象:

mMapController = mMapView.getController();

要定位地点,需要构造一个GeoPoint来表示地点的经纬度,然后使用animateTo方法将地图定位到指定的GeoPoint上,代码如下:

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);

6.Ovelay的使用

如果需要在地图上标注一些图标文字等信息,就需要使用Overlay。这里我们首先要将地图上的经度和纬度转换成屏幕上的实际坐标,才能将信息绘制上去。Map API中提供了Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以将经度和纬度转换成屏幕上的坐标。

首先需要实现OverLay中的draw方法才能在地图上绘制信息,代码如下:

复制代码
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
……..
}
}
复制代码

综合上面的代码如下

Activity01.java

复制代码
import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;public class Activity01 extends MapActivity
{
private MapView mMapView;
private MapController mMapController;
private GeoPoint mGeoPoint;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.MapView01);
//设置为交通模式
// mMapView.setTraffic(true);
//设置为卫星模式
// mMapView.setSatellite(true);
//设置为街景模式
mMapView.setStreetView(false);
//取得MapController对象(控制MapView)
mMapController = mMapView.getController();
mMapView.setEnabled(true);
mMapView.setClickable(true);
//设置地图支持缩放
mMapView.setBuiltInZoomControls(true);

//设置起点为成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint);
//设置倍数(1-21)
mMapController.setZoom(15);

//添加Overlay,用于显示标注信息
MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = mMapView.getOverlays();
list.add(myLocationOverlay);
}
protected boolean isRouteDisplayed()
{
return false;
}
class MyLocationOverlay extends Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
Point myScreenCoords = new Point();
// 将经纬度转换成实际屏幕坐标
mapView.getProjection().toPixels(mGeoPoint, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 0, 0);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText(“天府广场”, myScreenCoords.x, myScreenCoords.y, paint);
return true;
}
}
}

复制代码

android模拟器上网问题

归类于Android 参与评论

有可能是DNS的问题:

Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人(像我)来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。

使用adb的shell,确认系统的各项属性

adb shell

getprop

getprop会列出系统当前的各项属性

在结果里可以看到:

[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]

第四步:把dns改成我们自己的DNS

setprop net.dns1 192.168.1.1

通过Android模拟器运行网络通信程序详细

归类于Android 参与评论

mars课程里关于Socket通信那一课说那些程序只能在真机上运行,模拟器模拟不了,实际上是可以的。
Android模拟器是通过一个类似路由器的虚拟网络层与电脑相连,可以看作模拟器是处于“内网”当中,每个模拟器都有自己的虚拟路由器,而且虚拟路由器的地址总是10.0.2.1,在模拟器看来,电脑的地址是10.0.2.2,模拟器自己的地址是10.0.2.15,无论你启动多少个模拟器,对于模拟器来说都是这样的地址,模拟器之间不能直接通信。
启动模拟器的时候,电脑会给模拟器分配两个端口,通过这两个端口,电脑就能操作模拟器。第一个启动的模拟器的端口是5554和5555,第二个是5556和5557,以此类推,最多可以同时启动32个模拟器。第一个端口(偶数端口)可以接受telnet连接,对模拟器进行设置,第二个端口(奇数端口)则接受adb连接,可以用来调试。第一个端口可以在模拟器窗口的标题栏看到,如下图所示:

5554表示端口号,t表示模拟器名称。
实际上,这些端口也是电脑监听的端口,在电脑上通过netstat可以看到本机正在监听这些端口,因此通过telnet localhost 5554就能连上第一台模拟器,连上之后通过help命令可以查看操作帮助。
为了实现电脑和模拟器上的android程序进行socket通信,需要把程序开启的端口通过端口映射设置到电脑上,这跟家里的路由器端口映射概念是一样的。telnet到模拟器之后,通过
redir add tcp:1234:1234
就能把模拟器上的1234端口映射到电脑上,第一个表示电脑端口,第二个表示模拟器程序要使用端口,这两个数字可以相同也可以不同,要映射udp端口就把tcp改为udp即可
redir add udp:1234:1234
这样一来,当模拟器的程序打开1234端口时,在电脑上也打开了对应的端口,只要通过电脑连接127.0.0.1的对应端口,就连上了模拟器的程序端口,就可以通过电脑上的client向模拟器的server发送数据,不需要通过真机运行。
如果要让第一个模拟器向第二个模拟器发送数据,也可以把第二个模拟器的端口映射到电脑上,然后在第一个模拟器程序中向10.0.2.2的对应端口发送数据即可。

模拟器还有一个很有意思的功能,每个模拟器默认的电话号码就是它的第一个端口号,例如开了两个模拟器,第一个拨打5556,第二个就会显示5554来电,还能接通,发短信也可以,这样就能模拟电话和短信功能。

详细的信息可以看Dev Guide的模拟器部分:http://developer.android.com/guide/developing/devices/emulator.html

顶部