前两天,公司有一个利用android远程操作sqlserver的项目,对此我是毫无头绪的,但也挺感兴趣的,于是开始上网搜索方法,网上有挺多方法了,发现使用webservice的挺多的,不过我对这些技术一点了解都没有,最后也决定用webservice+xfire做,花了几天的时间赶写了一个demo,终于就就在刚刚完工了,想起来写的东西不多,但是解决各种小错误也花了挺多时间,现在也仍然有个没有解决的问题,在文章后面会提到,还希望有会的大侠指点下。最终实现用到的工具:sqlserver+xfire+tomcat+android,下面我大概介绍一下这个小demo吧。注:因为以前对相关知识不了解,所以大概的原理知道,很多细节的东西不是很清楚,其中可能有些说的不对的地方,还望高手指出,万分感谢!
这个demo主要实现的是通过android客户端对sqlserver数据库的增删改查功能,要做的项目说到底也就是这些基本功能,只不过涉及了复杂的业务逻辑处理,这个小demo算得上是解决了一大半的技术难题。实现分为两个方面,一方面是服务器端,主要是连接sqlserver进行交互,另一方面是客户端,通过android发送请求与服务器端进行交互进而与数据库交互。下面介绍下它的功能,(因为只是做个测试,所以界面就随便做了下,挺难看的,谅解谅解
^ ^):
第一个功能就是登陆功能
第二个功能是查询所有用户信息,显示在listview中。
第三个功能是新增用户功能。
第四个功能是修改用户功能。
第五个功能是删除用户功能。
服务端控制台打印信息:
因为代码的内容实在太多,所以本文主要介绍下大概的框架以及一些需要注意的地方,算是给大家参考参考,同时也是做个笔记,以后在遇到类似的项目可以重复使用。
首先看看数据库表的结构,如下图
其中id为primary key,自增1,name和pwd不能为空
一、服务端:
开发工具用的eclipse,需要引入xfire的jar包,项目的结构图如下:
注:本项目为dynamic web project
需要注意的地方:
1、导入xfire要用的jar包,把xfire-all-1.2.6.jar以及lib下的所有jar包加入到项目的....\WebContent\WEB-INF\lib路径下
2、导入sqlserver驱动jar包,这个地方比较麻烦,因为sqlserver2000和2005是有区别的,本例使用的2005,引入的是一个jar包,如果是2000的话需要引入三个jar包,在源码的文档里有相应的注释。
3、在eclipse里安装好tomcat插件,为了不使篇幅太长,相关操作将另行发文章,不过这个一般都会。
4、项目中的IUser.aegis.xml文件
引用网友的解释:在写webservice接口的时候,通常大家都会定义一些方法的参数,但是根据xfire的xsd文件描述情况来看,它的参数命名通常是in0,in1等等,一次类推,很不友好。
按照XFire-Spring生成的WSDL文档中接口参数名极不友好:
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="in2" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="in3" nillable="true" type="xsd:string" />
大家都知道,作为一个合格的程序员,在写代码的时候方法参数命名什么的要尽量做到见名知意,显然他这种风格是不适合我们的。因此我们要创新,这就有了下文。
如何自动将in0与in1替换成友好的参数名称呢 ?
方法如下:
在与接口类同一包下面建一个接口类名称.aegis.xml 的文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="settleMessage">
<parameter index="0" mappedName="id" />
<parameter index="1" mappedName="username" />
<parameter index="2" mappedName="password" />
</method>
</mapping>
</mappings>
注意:
name为接口中方法名称
index为方法中第一个参数
mappedName为替换后的名称
该XML文件的位置一定要与你定义的webservice的接口位于同一个目录(包下)否则不起作用
5、services.xml
需要在这儿注册service以及其实现类和命名空间。
6、完成后把项目部署到tomcat服务器,然后启动服务器输入如下地址(注:我的tomcat端口号改为8888了,所以此地址只是作为参考)http://localhost:8888/hysoftServer/services,如果出现下面所示的页面基本上就算是成功了
二、android客户端
开发工具也是eclipse,项目结构图如下:
需要注意的地方:
1、引入ksoap2的jar包本例使用的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar,这儿有一个值得注意的地方,引入后还要勾选下图的地方,这儿耽误了我不少时间,进入方法右击项目build path--configure build path
2、记得在AndroidManifest.xml中加入联网权限,<uses-permission android:name="android.permission.INTERNET"/>
3、MyWebServiceHelper,这是最重要的一个类了,负责与服务器的交互,其中有几个参数需要注意下
参数targetNameSpace 与 服务器端services.xml中指定的命名空间(<namespace></namespace>)标签一致
参数WSDL为"http://服务器ip地址/服务器端项目名/services/MyService"
其他地方参考源代码中的注释,在做这个demo的时候遇到过很多问题,将总结完后将另行发博客说明,在此我有个一直没解决的问题,希望会的高手给个例子。新增用户功能我刚开始是准备使用User对象做参数的,但是后来报错了,上网查了下,说是自己定义的对象不能当参数传,需要经过其他处理,也试了几种方法,都没成功,最后倒是看到一个网友的回答如下:
如果谁有好的办法还望指点下。
本文所使用的源代码以及需要使用到的jar包都传到本人的资源里了,有需要的可以去下载!
jar包包括:所有用到的jar包 4类
1、xfire(n多个) --webservice框架用到的
2、sqlserver驱动 (3个)--连接sqlserver数据库用到的
3、ksoap2-android-assembly-2.6.5-jar-with-dep(1个)
注:jar包路径最好别含中文