`
阿莫西林狸
  • 浏览: 7856 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

webService使用实例

阅读更多
看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧。此文章采用的项目是我毕业设计的webservice部分。
首先要建一个web工程和android工程,在此采用myeclipse开发,个人觉得比较方便,要是eclipse安装了tomcat也行。这的web端采用了框架hibernate和spring,因为我的项目只是client端调用web端的数据,没什么web页面,所以就没用struts了。
讲解前先说说流程:此项目里,在web端里webservice把实体类转换成json的对象通过一个web地址发布出去;(由于WebService 是一种基于SOAP协议的远程调用标准。通过WebService可以将不同操作系统平台,不同语言、不同技术整合到一起,而在Android SDK中并没有提供调用WebService的库,因此需要使用第三方类库(KSOAP2)来调用WebService ),client端就需要通过发布的地址来获取数据了。
以下就一步一步来讲解了,所有的代码和流程就以用用户登录来体现了:
一、Web端
1、Model和Hibernate配置
实体类SysUser:
Java代码  收藏代码

    public class SysUser implements Serializable { 
        private Long id; 
        private String userPwd; 
        private String userPhone; 
        public SysUser() { 
        } 
        public SysUser(Long id,  String userPwd, String userPhone) { 
            super(); 
            this.id = id; 
            this.userPwd = userPwd; 
            this.userPhone = userPhone; 
            } 
        //get和set 
        } 


Hibernate:
Java代码  收藏代码

    <hibernate-mapping> 
        <class name="com.silent.cn.model.SysUser" table="SYS_USER"> 
            <id name="id" type="java.lang.Long"> 
                <column name="ID" precision="22" scale="0" /> 
                <generator class="native" /> 
            </id> 
            <property name="userPwd" type="java.lang.String"> 
                <column name="USER_PWD" length="20" /> 
            </property> 
            <property name="userPhone" type="java.lang.String"> 
                <column name="USER_PHONE" length="11" /> 
            </property> 
        </class> 
        </hibernate-mapping> 


2、PoJo包
这里面是服务器端返回使用的类,webservice传递数据时,可能只会传递一部分数据,这样的话,就要把要传递的数据封装成一个pojo类,再转成一个json对象,这样的话无论是从代码的整洁、逻辑还是高效,都会是非常完美的写法。在web端和client端的类要完全一样,这样的话更为简单。
Java代码  收藏代码

    /**
     * 登陆状态
     */ 
    public class DataOperateResult { 
        private String status; 
        public String getStatus() { 
            return status; 
        } 
        public void setStatus(String status) { 
            this.status = status; 
        } 
    } 


3、WebService接口
    这里面是封装的webservice接口,手机端就是直接通过这些接口进行数据的传送与接收,最重要的是在接口上一定要加上"@WebService"这个注解,这样才能把此类里面的方法封装成一个webservice接口,关键代码如下:
Java代码  收藏代码

    //手机客户端服务类(专门负责与手机客户端进行交互) 
    @WebService 
    public interface MobileClientService { 
        /**
         * 登陆
         * @param opPhone
         * @param loginPwd
         */ 
        public String userLogin(@WebParam(name = "opPhone") String opPhone, @WebParam(name = "loginPwd") String loginPwd); 
    } 


     要注意的是方法里的参数前一定要加上@WebParam(name = "***(随便取的名字)"),这是因为这个opPhone参数通过webservice发布出去之后是以opPhone这个名称存在的,在手机端那边的方法直接获取opPhone就可以了。
4、WebService接口实现类
ws里面接口的实现类,在这个类的开始,一定要加上"@WebService(endpointInterface = "com.silent.cn.ws.MobileClientService")"这个注解,它表示是继承自com.silent.cn.ws.MobileClientService的类,没有这一步,webservice接口是不会实现其功能的。下面是代码:
Java代码  收藏代码

    @WebService(endpointInterface = "com.silent.cn.ws.MobileClientService") 
    public class MobileClientServiceImpl implements MobileClientService { 
        public String userLogin(String opPhone, String loginPwd) { 
            SysUser sysUser = userLoginDao.userLogin(opPhone, loginPwd); 
            DataOperateResult dataOperateResult = new DataOperateResult(); 
            if (sysUser != null) { 
                // 封装登录验证结果 
                dataOperateResult.setStatus(SUCC); 
                System.out.println("登陆成功!"); 
                return JSONObject.fromObject(dataOperateResult).toString(); 
            } else { 
                System.out.println("不存在或手机号码和密码不正确!"); 
                dataOperateResult.setStatus(FAIL); 
                return JSONObject.fromObject(dataOperateResult).toString(); 
            } 
        } 
    } 


5、Dao和Dao实现类
Java代码  收藏代码

    /**
     * 用户登录DAO
     */ 
    public interface UserLoginDao { 
        /**
         * 根据用户名和用户密码登陆
         * @param userPhone 用户手机号码
         * @param passWord 用户密码
         * @return
         */ 
        public SysUser userLogin(String userPhone, String passWord); 
    } 

Java代码  收藏代码

    /**
     * 用户登录DAO实现类
     */ 
    public class UserLoginDaoImpl extends BaseDao implements UserLoginDao { 
        public SysUser userLogin(String userPhone, String passWord) { 
            String sql = " from SysUser where userPhone=? and userPwd=? "; 
            List<SysUser> list = this.getHibernateTemplate().find(sql, new Object[] { userPhone, passWord }); 
            if (list.size() == 0) { 
                return null; 
            } 
            return list.get(0); 
        } 
    } 


6、Spring配置
    这里spring的配置为了整洁与不臃肿,分成了三部分,分别实现了不同功能:
applicationContext.xml:所有的spring配置信息,包括连接数据库、配置事务管理器、配置事务传播特性 、dao模板等等
Java代码  收藏代码

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
        <property name="url" value="jdbc:mysql://localhost:3306/phonesell" /> 
        <property name="username" value="root" /> 
        <property name="password" value="root" /> 
    </bean> 
    <bean id="sessionFactory" 
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource" /> 
        </property> 
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
                <prop key="hibernate.show_sql">true</prop> 
            </props> 
        </property> 
        <!-- 实体类资源映射 --> 
        <property name="mappingDirectoryLocations"> 
            <list> 
                <value>classpath:/com/silent/cn/model/</value> 
            </list> 
        </property> 
    </bean> 
    <!-- 配置事务管理器 --> 
    <bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
        <property name="sessionFactory"> 
            <ref bean="sessionFactory" /> 
        </property> 
    </bean> 
    <!-- 配置事务传播特性 --> 
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
        <tx:attributes> 
            <tx:method name="save*" propagation="REQUIRED" /> 
            <tx:method name="delete*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
            <tx:method name="do*" propagation="REQUIRED" /> 
            <tx:method name="*" read-only="false" /> 
        </tx:attributes> 
    </tx:advice> 
    <!-- 哪些类的哪些方法参与事务 --> 
    <aop:config> 
        <aop:pointcut id="allManagerMethod" 
            expression="execution(* com.silent.cn.dao.impl.*.*(..))" /> 
        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" /> 
    </aop:config> 
    <!-- dao模板(所有dao都将使用此模板) --> 
    <bean id="daoTemplate" abstract="true"> 
        <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 
    <bean id="jdbcTemplate" abstract="true"> 
        <property name="dataSource" ref="dataSource"></property> 
    </bean> 
    <!--WebService配置--> 
    <import resource="applicationContext-webservice.xml" /> 
    <import resource="applicationContext-dao.xml" /> 
    </beans> 


7、WebService接口配置
这里设定的address就是该webservice的实际地址了:
Java代码  收藏代码

    <!-- 
    配置WebService接口 http://localhost:8080/PhoneSell/ws/clientService?wsdl 
        --> 
    <jaxws:endpointid="clientServiceEndpoint"address="/clientService" implementorClass="com.silent.cn.ws.MobileClientService"> 
            <jaxws:implementor> 
                <bean id="clientService" class="com.silent.cn.ws.impl.MobileClientServiceImpl"> 
                    <property name="userLoginDao" ref="userLoginDao" /> 
                </bean> 
            </jaxws:implementor> 
        </jaxws:endpoint> 


8、配置web.xml
在web里添加下面的语句:
Java代码  收藏代码

    <servlet> 
       <servlet-name>CXFServlet</servlet-name> 
       <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>CXFServlet</servlet-name> 
        <url-pattern>/ws/*</url-pattern> 
    </servlet-mapping> 


9、WebService接口测试
    最好安装soapUI  pro这个软件,SOAPUI这个工具功能非常强大,是作为测试工具来用的,它既可以模拟客户端,也可以模拟服务端,可以根据描述文件很容易就生成的模拟的服务端和服务端,还可以有测试用例管理,负荷测试等,对通讯的中间过程也可以全程监控。
SOAPUI是一个免费的工具,而SOAPUI PRO是收费的,功能更强大。详细的SOAPUI用法可以参考下面的网址:http://xzhoumin.blog.163.com/blog/static/40881136201231955833137/ ;
Client端
1、
首先,我们要获取Web端在Tomcat发布成功之后的接口地址与方法地址,如果是模拟器的话,其IP地址必须是10.0.2.2;如果是真机,那么电脑和真机都要用wifi连接到同一个网段下,而且IP地址就是电脑的实际IP地址,这样手机才能从Tomcat上获取数据,代码如下:
Java代码  收藏代码

    //WebService接口地址 
    public static String NAME_SPACE_SALE = "http://ws.cn.silent.com/"; 
    // 网址(如果是模拟器额话,需要把IP地址<192.168.1.***:8080>换成10.0.2.2:8080) 
    public static String NAME_SPACE = "http://10.0.2.2:8080/PhoneSell/"; 
    // 连接地址(WebService的方法地址) 
    public static String END_POINT_SALE = NAME_SPACE + "ws/clientService"; 


2、
然后,我们要写一个通用的WebService接口请求方法,此方法是通用的,只要是通过ksoap与web端交互的都可以使用该方法,代码如下:
Java代码  收藏代码

        public static SoapObject common(String methodName, HashMap<String, Object> map, String nameSpace, String endPoint) { 
             String soapAction = nameSpace + methodName; 
             // 指定WebService的命名空间和调用的方法名 
            SoapObject rpc = new SoapObject(nameSpace, methodName); 
            // 设置需调用WebService接口需要传入的参数 
            if (null != map && map.size() > 0) { 
                Object[] key = map.keySet().toArray(); 
                for (int i = 0; i < key.length; i++) { 
                    rpc.addProperty(key[i].toString(), map.get(key[i])); 
                } 
            } 
            // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
            envelope.bodyOut = rpc; 
            // 设置是否调用的是dotNet开发的WebService 
            envelope.dotNet = false; 
            // 设置连接超时时间为20秒 
        HttpTransportSE transport = new HttpTransportSE(endPoint, timeout); 
            try { 
                // 调用WebService 
                transport.call(soapAction, envelope); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } catch (XmlPullParserException e) { 
                e.printStackTrace(); 
            } 
            // 获取返回的数据 
            SoapObject soapObject = (SoapObject) envelope.bodyIn; 
            return soapObject; 
        } 
    } 


3、
    接着,就是写各种webservice数据交互的方法了,基本上都是封装成一个json对象再以字符串形式传递,这里是用户登录方法:
Java代码  收藏代码

    public static String verifyUser(Context context, String userPhone, String userPwd)      { 
            // 设置调用接口需要传递的参数名称、值 
            HashMap<String, Object> paramMap = new HashMap<String, Object>(); 
            paramMap.put("opPhone", userPhone); 
            paramMap.put("loginPwd", userPwd); 
            try { 
                // 调用接口 
                SoapObject soapObject = common("userLogin", paramMap, NAME_SPACE_SALE, END_POINT_SALE); 
                return soapObject.getProperty(0).toString(); 
            } catch (Exception e) { 
                return null; 
            } 
        } 


注:hashmap里的key就是web端webservice接口里的@WebParam(name = "opPhone"),此字符串一定要匹配
分享到:
评论

相关推荐

    简单的webservice使用实例

    在提供的压缩包文件"webservice使用实例"中,应该包含了服务端和客户端的源代码,以及运行和测试的说明。初学者可以通过运行这些示例来更好地理解Web服务的工作原理。通过这种方式,你可以了解到如何创建、部署和...

    WebService教程+实例+代码提示功能WebService实例.rar

    这个"WebService教程+实例+代码提示功能WebService实例.rar"压缩包文件显然包含了关于WebService的学习资料、实例代码和可能的代码提示功能,旨在帮助用户深入理解和实践WebService的开发。 首先,"教程地址.txt"很...

    webService调用实例 Demo

    【标题】:“webService调用实例 Demo” 在IT行业中,Web Service是一种常见的应用程序接口(API)形式,它允许不同系统间的交互,无论它们是用何种编程语言或运行在何种操作系统上。本“webService调用实例 Demo”...

    Delphi WebService简单实例

    本实例主要探讨的是如何使用Delphi构建一个简单的WebService客户端应用,以及利用Web App Debugger进行调试。让我们深入理解这些关键概念。 1. **Delphi WebService**: Delphi 提供了对创建和消费Web Services的...

    webService—Axis实例webService—Axis实例webService—Axis实例

    webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例webService—Axis实例

    webservice使用cxf的实例

    总的来说,"webservice使用cxf的实例"这个主题涵盖了从基础理论到实际操作的各个环节,包括CXF框架的使用、Web服务的创建与部署、客户端调用、数据绑定、安全性和Spring集成等多个方面。通过学习和实践,开发者可以...

    WebService应用实例及教程

    5. WebService实例 - 假设我们有一个名为“WeatherService”的WebService,提供获取天气预报的功能。 - 在WSDL中,定义了一个名为“getWeather”操作,接受城市名作为参数,返回当前天气信息。 - 客户端通过调用...

    WebService服务器端实例

    WebService服务器端实例主要涉及到的是基于开放标准的网络通信技术,用于不同系统间的互操作性。在Web服务的世界里,WebService是一种允许应用程序通过互联网交换数据的方式。它基于XML(可扩展标记语言)进行数据...

    一个简单的WEBSERVICE 例子

    在这个例子中,`Service1` 类继承自 `System.Web.Services.WebService`,这标志着该类是一个 WebService。构造函数 `Service1()` 被用于初始化组件。 #### 2.2 WebService 属性设置 ```csharp [WebService( ...

    WebService开发实例图解教程

    【WebService开发实例图解教程】 WebService是一种基于XML的开放标准,用于在不同的应用程序之间交换数据和服务。它允许不同平台和编程语言之间的互操作性,通过HTTP协议提供服务,因此易于集成到现有系统中。本...

    Java开发WebService实例

    ### Java开发WebService实例详解 在IT领域,尤其是企业级应用开发中,WebService作为一种标准化的、跨平台的服务交互方式,被广泛应用于系统间的数据交换与服务调用。本文将基于给定的“Java开发WebService实例”...

    WebService完全实例详细解析

    - **XML数据处理**:在本例中,使用`XmlDataDocument`类来处理XML数据,这在处理WebService返回的数据时非常常见。 总结,WebService是一种强大的工具,它促进了不同系统间的协作和数据共享。通过理解其基本概念和...

    webservice接口调用实例

    在本实例中,"webservice_client"可能是一个客户端应用程序,用于与服务器端的Web Service进行交互。客户端通常需要完成以下步骤来调用Web Service接口: 1. **获取WSDL文档**:WSDL文件定义了服务的接口,包括操作...

    较完整的webservice例子

    “xfireWS”可能是项目的名称,暗示这个例子使用了XFire框架。XFire是Apache CXF的前身,是一个开源的Java Web Service框架,它支持SOAP、RESTful风格的服务,并且可以方便地与Spring框架集成,简化Web Service的...

    axis2webservice接口例子

    标题中的“axis2webservice接口例子”指的是使用Apache Axis2框架创建的一个Web服务接口实例。Apache Axis2是Java平台上的一款强大的Web服务开发工具,它提供了高效、灵活且可扩展的环境来构建和部署Web服务。这个...

    webservice接口例子

    本压缩包文件提供了关于WebService接口的实例,帮助我们理解和实践这种技术。 标题中的“webservice接口例子”是指该资源包含一个或多个实际的WebService接口示例,可能涵盖了如何创建、调用以及处理响应等方面。...

    Java使用SOAP获取webservice实例解析

    ### Java使用SOAP获取WebService实例解析 #### WebService简介 WebService是一种跨编程语言和操作系统平台的、在网络上进行数据交换的一种方式。它使用标准的Internet协议,如HTTP、XML、SOAP等来实现不同系统间的...

    eclipse+webservice简单实例源码

    【标题】"eclipse+webservice简单实例源码"揭示了这个压缩包是关于使用Eclipse集成开发环境创建和运行一个简单的Web服务示例的源代码。Eclipse是一款广泛使用的开源IDE,尤其在Java开发中非常流行。Web服务,尤其是...

Global site tag (gtag.js) - Google Analytics