用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 "%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上部署时遇到的一些问题,欢迎大家学习指正。
- 用java编写webservice和在tomcat上部署时遇到的一些问题
- tomcat部署遇到的一些问题
- 关于在部署jsp网站时遇到问题:MySql连接不上、Tomcat的闪退
- jax-ws webservice部署到tomcat 遇到的问题
- webservice部署到tomcat遇到问题:
- Java编译和Tomcat启动遇到的一些问题
- 部署WebService遇到的问题
- 在iis上部署django时遇到的问题
- 在Centos上安装webmin时遇到的一些问题
- tomcat安装和配置时遇到的一些小问题
- 关于如何在eclipse中部署服务遇到的一些问题和解决。
- webservice和android通信遇到的一些问题
- tomcat 7 和 tomcat 6部署war时遇到的问题
- 配置tomcat时遇到的一些问题
- 在新的主机上部署网站遇到的问题
- 在websphere上部署应用遇到的问题
- [AWS] 记录在AWS上部署WordPress遇到的问题
- 关于Resin在Eclipse或者Myeclipse上利用Debug模式部署的方法以及遇到的一些问题
- CentOS 7安装配置Redis数据库
- easyui文件框与html文件框实现本地图片预览
- JAVA提高篇(26)--集合
- feignclient设置hystrix参数
- 2016 Europe
- 用java编写webservice和在tomcat上部署时遇到的一些问题
- Java I/O 操作及优化建议
- 输出一个整数的每一位
- jQuery中延迟对象then方法和when方法源码分析
- 线程总结
- The C Programming Language 练习题2-8
- es6入门(二):解构赋值和字符串的扩展
- SourceTree<四>子模块
- 35 个 Java 代码性能优化总结