您的位置:首页 > 运维架构 > Tomcat

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

2017-10-08 13:37 639 查看

此博文用于记录编写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/arti ad53
cle/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 "%r" %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 "%r" %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上部署时遇到的一些问题,欢迎大家学习指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息