用java编写webservice和在tomcat上部署时遇到的一些问题

来源:互联网 发布:软件测试的周期 编辑:程序博客网 时间:2024/05/29 09:29

此博文用于记录编写webservice时及在服务器tomcat部署时遇到的问题,以便于自己日后查阅,同时也欢迎大家学习指正

  由于项目需要,我用java(Myecplise)编写webservice作为服务端以供Android客户端调用。以下将具体介绍一下用java编写webservice服务端:
  

一、java编写webservice服务端

  1、数据库连接:我所使用的数据库是SQL SERVER 2012,需要用到JDBC,我使用的是jdbc6.0下的sqljdbc.jar包,关于具体怎么调用,可以到http://blog.csdn.net/u013322907/article/details/52739856 学习参考(转载),上面有详尽的方法。基于不同的数据库,只要加载不同的驱动就可以了,下面附上我的一小段数据库连接代码:

//读取配置文件中的数据String paramFile="sqlserver.ini";//文件名java.util.Properties props = new java.util.Properties();    props.load(new FileInputStream(paramFile));driver=props.getProperty("driver"); //驱动项,区分mysql、sql server、oracle等数据库url=props.getProperty("url");//连接数据库地址和数据库名user=props.getProperty("user");//数据库用户pass=props.getProperty("pass");//登陆密码//加载驱动Class.forName(driver);//初始化数据库conn=DriverManager.getConnection(url,user,pass);

配置文件内容如下:

driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;DatabaseName=BOOK
user=sa
pass=123456

连接完成以后,就可以根据自己的需要操作数据库了。

  2、编写简单的webservice服务:
我使用的是myecplise,可以参考http://www.cnblogs.com/yisheng163/p/4524808.html?utm_source=tuicool(转载),这里面介绍的是用程序发布,关于如何在服务器上发布,会在后续讲解。

  3、Android客户端调用webservice服务:
  http://www.cnblogs.com/superpang/p/4911422.html(转载)我参考的是此篇文章,不过由于自己水平有限,在具体实现时还是遇到了问题。在我自己整理的方法下,是能实现客户端请求webservice的,下面我将自己实现的方法贴出来供大家参考:
  

/**     * 手机号段归属地查询     *     * @param phoneSec 手机号段     */    public String getRemoteInfo(String phoneSec) throws Exception{        String WSDL_URL = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL";//wsdl 的url        String namespace = "http://WebXml.com.cn/";//namespace,命名空间,可以在URL页面上找到        //要调用的方法名称,.net写的在<s:element name="getMobileCodeInfo">节点下,而java写的在<message name="main">节点下,后缀不含Response        String methodName = "getMobileCodeInfo";        SoapObject request = new SoapObject(namespace, methodName);        // 设置需调用WebService接口需要传入的两个参数mobileCode、userId,如果没有参数,就不需要填写,前面一个是键,        //后面一个是值。这里要注意的是,在.net的webservice下,键的名字是有显示的,是什么填什么,而在java的webservice下,键的值统一为"arg0","arg1:依次类推        request.addProperty("mobileCode", phoneSec);        request.addProperty("userId", "");        /*创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的),soap12,        这里具体我也不理解如果查看soap版本,但是我用VER10是可以调用的。*/        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER10);        //由于是发送请求,所以是设置bodyOut        envelope.bodyOut = request;        //由于是.net开发的webservice,所以这里要设置为true        envelope.dotNet = true;        HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URL);//调用,第一个参数是soapActionName,.net写的要填写,格式为命名空间+方法名,java写的填null。                     httpTransportSE.call("http://WebXml.com.cn/getMobileCodeInfo", envelope);        // 获取返回的数据,注意,写上下面两段代码,程序就会崩溃,        //不知道什么原因,由于我返回的结果是字符串,这里也不再深究,用我自己的方法。        //SoapObject object = (SoapObject) envelope.bodyIn;        // 获取返回的结果        //result = object.getProperty(0).toString();        //我返回的就是字符串,所以直接用一个result接收返回值        String result=envelope.getResponse().toString();        Log.d("debug",result);        return result;    }

  因为调用webservice属于联网操作,因此不能再UI线程中执行访问webservice,为了便于将结果反馈给UI线程,采用AsyncTask线程,代码如下:

  public class QueryAddressTask extends AsyncTask<String, Integer, String> {        @Override        protected String doInBackground(String... params) {            // 查询手机号码(段)信息*/            try {                result = getRemoteInfo(params[0]);            } catch (Exception e) {                e.printStackTrace();            }            //将结果返回给onPostExecute方法            return result;        }        @Override        //此方法可以在主线程改变UI        protected void onPostExecute(String result) {            // 将WebService返回的结果显示在TextView中,这里的TextView是自定义的控件,可以按照你自己的方法显示结果            resultView.setText(result);        }    }

以上就完成了webservice服务端和客户端的编写。

二、在tomcat上部署webservice应用

  在myecplise上调试和在真正的服务器上使用webservice还是有差异的。我是部署在tomcat上的。可以下载xampp http://rj.baidu.com/soft/detail/12489.html?ald 一建搭建环境,傻瓜式安装。
  首先要将在myecplise编写的webservice 生成可以在服务器上运行的项目,参考 http://blog.csdn.net/apicescn/article/details/42916363(转载)
会自动生成wsdl等文件,生成完毕以后,可以在项目根目录下的WebRoot/WEB-INF/sun-jaxws.xml文件中的endpoint节点下的name,查看具体的webservice访问地址,比如我的name是GetStorageServicePort,那么wsdl访问地址就是http://localhost:8080/TheService/GetStorageServicePort?wsdl,其中TheService是项目的名称,可以在你项目文件目录下的.project文件中查看(name节点)。
  接着将项目打包成war,在myecplise中右键项目,选择Export,弹出选择框,搜索war,选择WAR file,
  这里写图片描述

点击下一步,

  这里写图片描述

  点击完成,生成的war文件放在tomcat安装目录下的webapps目录下,同时进行tomcat配置文件的修改,具体如下:
在tomcat目录下,conf/server.xml中加入:

      <Host name="localhost"  appBase="webapps"            unpackWARs="true" autoDeploy="true">        <!-- SingleSignOn valve, share authentication between web applications             Documentation at: /docs/config/valve.html -->        <!--        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />        -->        <!-- Access log processes all example.             Documentation at: /docs/config/valve.html             Note: The pattern used is equivalent to using pattern="common" -->        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"               prefix="localhost_access_log." suffix=".txt"               pattern="%h %l %u %t &quot;%r&quot; %s %b" />      </Host>

在host节点下写入:

    <Context docBase="F:/xampp soft/Tomcat/webapps/TheService.war" path="/test" reloadable="true"/>

其中,docBase就是war文件所在的地方,path是虚拟目录,比如上面例子,我就可以使用localhost:8080/test来访问,reloadable表示是否在不重启服务器的情况下更改配置。完整如下:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">    <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html -->    <!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />-->    <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" -->    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"     prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />    <Context docBase="F:/xampp soft/Tomcat/webapps/TheService.war" path="/test" reloadable="true"/></Host>

在配置完毕以后,就可以启动服务器,启动完毕以后,默认可以使用http://localhost:8080/TheService/GetStorageServicePort?wsdl 访问。在这里要注意的是,你java项目里的所有外部引用到的包,要全部放在tomcat安装目录下的lib文件夹内,不然会运行失败。

三、在tomcat上部署webservice应用:补充

  在使用android客户端调用webservice时,一直出错,后经排查发现,我在程序中读取配置文件出错。
  1、我的配置文件在项目根目录下,在打包成war包时,根本没有把配置文件打包进war包,后来我在项目根目录下新建一个resource文件夹,把所有配置文件都放在里面,再打包成war文件,放入服务器启动,配置文件自动放在tomcat生成的项目文件夹 你的项目名称\WEB-INF\classes目录下。
  2、关于如何在服务器上获取文件路径,可以参考 http://www.cnblogs.com/franson-2016/p/6163422.html (转载),我使用的是

  //读取配置文件中的数据        java.util.Properties props = new java.util.Properties();                    props.load(this.getClass().getResourceAsStream("/"+paramFile));

读取classes目录下的文件。经测试有效。其中paramFile就是你自己配置文件名。

以上为我用java编写webservice和在tomcat上部署时遇到的一些问题,欢迎大家学习指正。