`

java与php通过webservice进行数据交互

阅读更多

刚在项目中应用到了java与php通过webservice进行数据交互。觉得挺有意思,贴出来,跟大家分享。

一.java编写webservice服务端,php作为客户端调用.

1.首先我们写一个简单的java类并发布webservice.

package com.php;

import java.util.Map;

 

public class WebServiceImpl {

 public String sendTransact(Map map) throws Exception {
  System.out.println("::: Call testModel1 :::");
  
  if(map!=null){
   String bugmanifestid = StringUtil.getValue(map.get("bugmanifestid"));
   String editedby = StringUtil.getValue(map.get("editedby"));
   String dditeddate = StringUtil.getValue(map.get("dditeddate"));
   String fullinfo = StringUtil.getValue(map.get("fullinfo"));
   String action = StringUtil.getValue(map.get("action"));
   System.out.println("bugmanifestid ->" +bugmanifestid);
   System.out.println("editedby      ->" +editedby);
   System.out.println("dditeddate    ->" +dditeddate);
   System.out.println("fullinfo      ->" +fullinfo);
   System.out.println("action        ->" +action);
  }
  return "success";
 }
}

 2.配置server-config.wsdd

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <handler name="URLMapper"
  type="java:org.apache.axis.handlers.http.URLMapper" />
 <handler name="auth"
  type="java:com.php.AuthenticationHandler" />
 <handler name="URLLogging"
  type="java:com.php.LogHandler">
  <parameter name="filename" value="c:\\MyService.log" />
 </handler>

 <service name="IWebService" provider="java:RPC">
  <parameter name="className"
   value="com.php.WebServiceImpl" />
  <parameter name="allowedMethods" value="*" />
  <namespace>http://localhost:8088/testphpweb</namespace>    
 </service>

 <transport name="http">
  <requestFlow>
   <handler type="URLMapper" />
   <handler type="URLLogging" />
  </requestFlow>
 </transport>

</deployment>

3.发布到jboss后,访问http://localhost:8088/testphpweb/services/IWebService?wsdl能看到xml文件就说明webservice发布好了。

4.写testphpweb.php文件

 <?php

header("Content-Type: text/html; charset=GB2312");
echo " ::: PHP CALL JAVA-WEBSERVICE ::: <br>";
require_once("nusoap/lib/nusoap.php");

// 要访问的webservice路径
$NusoapWSDL="http://localhost:8088/testphpweb/services/IWebService?wsdl";

// 生成客户端对象
$client = new soapclient($NusoapWSDL, true);

// 设置参数(注意:PHP只能以'数组集'方式传递参数,如果服务端是java,用Map接收)
$param = array( 'bugmanifestid' => 'E090500001',
    'editedby'      => '张三',
    'dditeddate'    => '2009-05-19',
    'fullinfo'      => '已联系刘德华,筹备今晚吃饭的事,等待回复',
    'action'        => '0');

echo "begin remote 。。。<br>";
// 调用远程方法
$result = $client->call('sendTransact', array($param));
echo "end remote 。。。<br>";

// 显示执行结果
if (!$err=$client->getError()){  
 echo '结果 : '.$result;    
}else{  
 echo '错误 : '.$err;  
}  
?>

 5.启动apache,访问http://localhost/service/testphpweb.php

php页面显示:

 ::: PHP CALL JAVA-WEBSERVICE :::
begin remote 。。。
end remote 。。。
结果 : success

jboss后台监视结果:

17:12:20,781 INFO  [STDOUT] ::: Call testModel1 :::
17:12:20,781 INFO  [STDOUT] bugmanifestid ->E090500001
17:12:20,781 INFO  [STDOUT] editedby      ->张三
17:12:20,781 INFO  [STDOUT] dditeddate    ->2009-05-19
17:12:20,781 INFO  [STDOUT] fullinfo      ->已联系刘德华,筹备今晚吃饭的事,等待回复
17:12:20,796 INFO  [STDOUT] action        ->0

到此,php作为客户端调用java写的webservice服务端完成.

二,php编写webservice服务端,java作为客户端调用.

1.编写php webservice    

<?php

header("Content-Type: text/html; charset=GB2312");
require_once("nusoap/lib/nusoap.php");

function sendManifest($param)
{

  //把接收到的数据显示出来
    return "hello ".$param["projectid"]."<=>".$param["projectname"]."<=>".$param["moduleid"];
}

$server = new nusoap_server();

//配置WSDL namespace
$server->configureWSDL('myservice',                                    //服务名称
     'http://localhost/service/web_call_center.php',                   //tns指定的namespace,一般填写自己的URI
     true,                                                             //endpoint url or false
     'rpc',                                                            //服务样式
     'http://schemas.xmlsoap.org/soap/http',                           //传输协议,一直是这个。
     'http://localhost/service/web_call_center.php'                    //wsdl 'types'元素targetNamespace
);

// 注册web服务
$server->register('sendManifest',                                      // 服务
    array(
 'projectid'     => 'xsd:string',
 'projectname'   => 'xsd:string',
 'moduleid'      => 'xsd:string',
 'modulepath'    => 'xsd:string',
 'bugtitle'      => 'xsd:string',
 'bugtype'       => 'xsd:string',
 'openedby'      => 'xsd:string',
 'openeddate'    => 'xsd:string',
 'assignedto'    => 'xsd:string',
 'assigneddate'  => 'xsd:string',
 'fixedtime'     => 'xsd:string',
 'fullinfo'      => 'xsd:string',
 'bugmanifestid' => 'xsd:string'),                                  // 输入参数;数组,指定类型
    array('resultCode' => 'xsd:string'),                               // 输出;数组,指定类型
    'http://localhost/service/web_call_center.php',                    // namespace of method
    '',                                                                // soapaction
    'rpc',                                                             // style
    'encoded',                                                         // use
    'serviceConsumeNotify'                                             // documentation
);

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

2.启动apache后,访问  http://localhost/service/phpserver.php,如果页面如下图所示,表示webservice发布好了。
 

 3.编写java客户端CallPhpServer .java 并调用php webservice

package com.php;

import java.util.HashMap;
import java.util.Map;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

 

public class CallPhpServer {

 
 public static String callManifest() throws Exception {
  System.out.println("0");
  Service service = new Service();

  Call call = (Call) service.createCall();
  System.out.println("1");
  call.setTargetEndpointAddress(new java.net.URL("http://localhost/service/phpserver.php")); 
  call.setOperationName("sendManifest");
  System.out.println("2");
  Map map=new HashMap();
  map.put("projectid", "109");
  map.put("projectname", new String("新MM国际物流平台".getBytes(),"iso-8859-1"));
  map.put("moduleid", "11");
  map.put("modulepath", new String("财务管理".getBytes(),"iso-8859-1"));
  map.put("bugtitle", new String("关于总账报表数据的问题".getBytes(),"iso-8859-1"));
  map.put("bugtype", "TrackThings");
  map.put("openedby", "zhangsan");
  map.put("openeddate", "2009-05-31");
  map.put("assignedto", "liumang");
  map.put("assigneddate", "2009-05-31");
  map.put("fixedtime", "2009-06-03");
  map.put("fullinfo", new String("现在总账报表页面下的合计数据不对,烦请抓紧事件核实确认更正,谢谢!".getBytes(),"iso-8859-1"));
  map.put("bugmanifestid", "E090500001");
  call.addParameter("param", org.apache.axis.Constants.SOAP_ARRAY,javax.xml.rpc.ParameterMode.IN);
  call.setReturnType(org.apache.axis.Constants.XSD_STRING);
  System.out.println("3");
  Object obj=call.invoke(new Object[]{map});
  return obj.toString();
 }
 public static void main(String[] args) throws Exception {
  System.out.println("::: call php webservice :::");
  String str = callManifest();

  String result=new String(str.getBytes("iso-8859-1"),"GBK");
  System.out.println(result);
 }
}
控制台显示结果:

::: call php webservice :::
0
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
1
2
3
hello 109<=>新MM国际物流平台<=>11
到此,java作为客户端调用php的webservice服务端完成.

分享到:
评论

相关推荐

    医药洁净室空调箱多模式控制程序解析——基于西门子1500 PLC与昆仑通泰触摸屏的应用

    内容概要:本文详细介绍了医药洁净室空调箱的多模式控制程序,涵盖停止模式、生产模式、值班模式、消毒循环模式和消毒排风模式。文中强调了不同模式下的具体控制逻辑及其重要性,并深入探讨了西门子1500 PLC与昆仑通泰触摸屏在博途15编程环境中如何协同工作,实现精准控制。此外,还展示了部分PLC程序代码片段,帮助读者更好地理解和实施这些控制逻辑。 适用人群:从事医药洁净室设计、安装、维护的技术人员,以及对工业自动化控制系统感兴趣的工程师。 使用场景及目标:适用于医药洁净室项目的规划与实施阶段,旨在帮助技术人员掌握空调箱多模式控制的设计思路和技术细节,从而提升系统的可靠性和稳定性。 其他说明:文中提供的示例代码和控制逻辑对于实际工程项目具有较高的参考价值,有助于缩短开发周期,降低调试难度。同时,结合博途15和昆仑通泰触摸屏的实际应用案例,使理论与实践相结合,便于理解和操作。

    【嵌入式系统】STM32F407ZET6驱动HC-SR04超声波模块实现精准测距功能的设计与代码实现文档所属领域(

    内容概要:本文档主要介绍了HC-SR04超声波测距模块的工作原理及其在STM32F407ZET6平台上的应用。HC-SR04超声波测距模块能提供2cm-400cm范围内的非接触式距离感测,精度达3mm。其工作原理是通过TRIG引脚接收触发信号后,自动发送8个40kHz的方波并检测返回信号。若有返回信号,ECHO引脚将输出一个高电平,高电平持续的时间即为超声波往返的时间。根据这个时间可以计算出测试距离。文中还提供了基于STM32F407ZET6平台的C语言代码示例,详细说明了如何配置TRIG和ECHO引脚,以及如何通过测量ECHO引脚高电平持续时间来获取距离值。; 适合人群:对超声波测距模块有一定兴趣,具有嵌入式系统基础知识的研发人员或学生。; 使用场景及目标:①了解HC-SR04超声波测距模块的基本工作原理;②掌握如何在STM32平台上配置和使用HC-SR04模块进行测距。; 其他说明:此文档提供的代码和原理有助于开发者快速上手HC-SR04超声波测距模块的应用开发,建议读者结合实际硬件进行实验以加深理解。

    基于滚动优化的大规模电动汽车充放电策略优化MATLAB代码实现

    内容概要:本文介绍了基于滚动优化的大规模电动汽车充放电策略优化的MATLAB代码实现。文中提出了针对大规模电动汽车调度问题的一种快速优化方法——滚动优化法,并将其与均衡负载法和全局优化法进行了对比。该方法通过将全局问题分解为多个局部子问题,降低了求解复杂度,提高了计算效率。模型考虑了电动汽车的随机到达分布及其充放电策略,目标是最小化电力系统的负荷波动并最大化电动汽车的充放电效益。实验结果显示,滚动优化法在保持电力系统稳定性的前提下显著提升了电动汽车的充放电效益。 适合人群:从事智能交通系统研究、电力系统优化、电动汽车调度等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要优化大规模电动汽车充放电策略的研究项目或实际应用,旨在提升电力系统的稳定性和电动汽车的经济效益。 其他说明:代码基于MATLAB+CVX平台实现,附带详细注释,便于学习和复现。

    基于博途软件的PLC自助洗车机控制系统:全仿真程序、画面、接线图及IO分配表

    内容概要:本文介绍了基于PLC(可编程逻辑控制器)的自助洗车机控制系统的设计与实现。系统采用博途软件编写,实现了从启动到结束的完整洗车流程,包括喷水、刷洗、喷洒清洁剂、吹干等步骤。文中详细描述了洗车机的动作流程、原点复位设计、系统架构、代码与控制逻辑分析,并提供了人机界面、接线图和IO分配表等辅助资料。此外,还强调了系统的稳定性和优质售后服务。 适合人群:从事自动化控制领域的工程师和技术人员,特别是对PLC编程和洗车机控制系统感兴趣的读者。 使用场景及目标:适用于需要了解或开发自助洗车机控制系统的场合,旨在帮助读者掌握PLC编程技巧和洗车机的工作原理,提高系统的稳定性和可靠性。 其他说明:本文不仅提供了详细的硬件和软件设计方案,还涵盖了故障处理和售后服务的内容,确保系统的长期稳定运行。

    【嵌入式系统】STM32F407ZET6 GPIO接口详解:输入输出模式与应用实例介绍文档的主要内容

    内容概要:本文档详细介绍了STM32F407ZET6的GPIO(通用输入输出接口)。GPIO在输出模式下能控制端口输出高低电平,适用于驱动LED、控制蜂鸣器等;在输入模式下可读取端口的高低电平或电压,如读取按键输入、ADC电压采集等。每个通用I/O端口包含多个32位配置寄存器、数据寄存器等。文档列举了GPIO的八个功能模式,重点解析了输出状态中的推挽输出和开漏输出,以及输入状态中的下拉电阻和上拉电阻的概念与工作原理。推挽输出可输出高低电平,由两个互补的晶体管提供较大电流驱动;开漏输出通常只能输出低电平,适合电平转换。输入状态方面,下拉电阻将信号初始化为低电平,上拉电阻则初始化为高电平,其本质分别是输出和注入电流。; 适合人群:嵌入式系统开发人员、电子工程师、对STM32微控制器有兴趣的学习者。; 使用场景及目标:①帮助开发者理解STM32F407ZET6的GPIO工作机制;②为实际项目中GPIO的应用提供理论指导,如控制外部设备、读取传感器数据等。; 其他说明:文档提供了详尽的寄存器配置信息和功能模式介绍,有助于深入理解和灵活运用GPIO接口。建议读者结合实际硬件操作进行学习,以加深理解。

    两电平三相并网逆变器的有限控制集模型预测控制(FCS-MPC)代码实现与波形分析

    内容概要:本文详细介绍了两电平三相并网逆变器的有限控制集模型预测控制(FCS-MPC)的代码实现方法。首先设置了系统的参数,如滤波电感、等效电阻、控制周期等。接着阐述了离散化状态方程和代价函数的设计,其中代价函数考虑了电流跟踪误差和开关损耗。然后展示了主控制循环的具体实现,通过遍历所有可能的开关状态选择最优的动作。最后对仿真效果进行了分析,指出了常见的问题及解决方案,如采样同步、权重系数调整和离散化精度等问题。 适合人群:电力电子领域的初学者和技术爱好者,尤其是对逆变器控制策略感兴趣的读者。 使用场景及目标:适用于需要理解和实现两电平三相并网逆变器FCS-MPC控制的人群。目标是掌握FCS-MPC的工作原理,能够独立完成相关代码编写,并能进行基本的参数调整和优化。 其他说明:文中提供了详细的代码片段和仿真波形图,帮助读者更好地理解理论与实践的结合。同时附有参考文献,方便进一步深入学习。

    CST仿真超表面技术实现线极化转圆极化极化转换器的研究与文献复现

    内容概要:本文详细介绍了利用CST微波工作室进行超表面仿真,将线极化波转化为圆极化波的技术实现过程。首先,构建了一个简单的十字形金属贴片作为超表面单元模型,设置了金属层和基板的具体参数。接着,通过调整X和Y方向的相位差达到90度来实现极化转换,并使用VBA脚本进行参数优化。最终,在12.5GHz频率处实现了低于3dB的轴比,验证了圆极化的成功转换。此外,还讨论了网格划分对仿真的影响,指出六边形网格相比矩形网格能更快收敛。 适合人群:从事电磁仿真、天线设计以及超表面研究的专业技术人员。 使用场景及目标:适用于需要深入了解线极化转圆极化技术原理及其实际应用的研究人员和技术开发者。目标是掌握CST仿真工具的操作技巧,理解极化转换的关键技术和优化方法。 其他说明:文中提供了详细的建模步骤、参数设置和代码片段,有助于读者快速上手并复现实验结果。同时提醒注意网格划分的选择,以提高仿真效率。

    全国大学生电子设计竞赛论文模板(20190717084742).pdf

    电子设计竞赛相关资源

    Modbus RTU协议在STC32G与STC8系列单片机上的优化实现及应用

    内容概要:本文详细介绍了新版Modbus RTU从机源码针对STC32G和STC8系列单片机的优化改进。主要改进包括硬件CRC加速、动态内存分配机制、自动波特率检测等功能特性。文中对比了新旧版本的性能差异,特别是在CRC校验效率提升、内存管理和通信稳定性方面的显著进步。此外,还提供了与多种组态软件的适配方法,如威纶通触摸屏的地址映射技巧,以及ModbusPoll工具的预配置模板,帮助开发者快速搭建和调试系统。 适合人群:嵌入式系统开发工程师,尤其是熟悉STC系列单片机和Modbus协议的开发者。 使用场景及目标:适用于工业自动化控制系统中需要高效稳定通信的应用场景,旨在提高系统的实时性和可靠性,降低开发难度并缩短产品上市周期。 其他说明:文中提到的部分技术细节(如硬件CRC、动态内存分配)可能不适合所有应用场景,在具体项目中可根据实际情况选择是否采用。对于初次接触Modbus协议的新手来说,建议先掌握基础知识再深入研究本文提供的高级特性。

    实训商业源码-工作场所技能必不可少的应用程序主页模板-毕业设计.zip

    实训商业源码-工作场所技能必不可少的应用程序主页模板-毕业设计.zip

    110kV变电站电气一次设计:主接线方案、短路电流计算及设备选型详解

    内容概要:本文详细介绍了110kV变电站电气一次设计的关键步骤和技术要点。首先,通过对原始参数的解读,明确了变电站的基本要求。接着,重点讨论了主接线方案的选择,通过案例分析展示了双母线接线方式的优势。随后,深入探讨了短路电流计算的重要性及其对电网安全的影响。最后,针对电气一次设备的选型进行了全面分析,强调了质量和效率的平衡。整个设计过程最终通过AutoCAD2014绘制出了详细的主接线A0大图。 适合人群:从事电力系统设计、运行和维护的专业技术人员,尤其是对110kV变电站电气一次设计感兴趣的工程师。 使用场景及目标:适用于新建设或改造110kV变电站项目,帮助设计师优化主接线方案,提高电网的安全性和可靠性,同时降低运营成本。 其他说明:文中提供了具体的CAD绘图命令片段作为参考,有助于读者更好地理解和应用相关设计方法。

    实训商业源码-抽奖页面小程序模板-毕业设计.zip

    实训商业源码-抽奖页面小程序模板-毕业设计.zip

    电力系统中基于39节点故障数据的短路分析与负荷仿真实验

    内容概要:本文详细介绍了基于39节点故障数据的短路分析与负荷仿真实验。文中首先概述了故障数据的特点,指出故障主要集中在特定区域的多个节点上,短路持续时间和负荷水平存在显著差异。接着,文章描述了仿真的具体过程和方法,强调了采用先进技术进行多场景下电网运行的模拟。仿真结果显示,短路点分布广泛,短路持续时间从数小时到数天不等,负荷水平变化范围大。此外,还讨论了数据处理技术和仿真模型构建的关键步骤,提出了故障应对中的安全保障措施。最后,作者总结了研究的重要性和对未来工作的建议,如加强电网监控、提升应急响应能力和推进智能化电网建设。 适合人群:从事电力系统研究、电网管理和维护的技术人员及研究人员。 使用场景及目标:适用于希望深入了解电网故障分析和负荷仿真技术的专业人士,旨在提高电网运行的可靠性和稳定性。 阅读建议:读者可以通过本文了解电网故障的具体表现形式及其对电网运行的影响,掌握先进的仿真技术和数据处理方法,从而为实际工作中遇到的问题提供解决方案。

    (addon.py):Blender MCP插件

    MCP插件(addon.py):Blender插件,在Blender中创建一个套接字服务器来接收和执行命令

    基于Qt框架的最小生成树算法(Prim和Kruskal)动态可视化实现及其应用

    内容概要:本文介绍了利用Qt框架实现Prim和Kruskal两种最小生成树算法的动态可视化项目。该项目不仅展示了这两种算法的具体执行过程,还提供了详细的源代码和技术解析。Prim算法通过维护两个节点集合之间的最短边进行构建,而Kruskal算法则借助并查集防止形成环路。两者均实现了动态展示,使算法执行过程如同观看动画般直观。此外,文中还提到了一些实现细节,如优先队列的特殊使用方法、多线程环境下的数据同步以及图形化界面的设计。 适合人群:计算机科学专业学生、算法爱好者、软件开发者。 使用场景及目标:本项目的应用场景主要是在教学环境中用于讲解最小生成树算法的工作机制,帮助学习者更好地理解和掌握相关概念;同时也适用于希望深入研究这两类算法实现方式的研究人员。 其他说明:附带完整的源代码和一份详尽的技术报告,涵盖从理论分析到实际编码过程中遇到的问题及解决方案。

    电力电子领域中基于滞环电流控制的VIENNA整流器技术研究与优化

    内容概要:本文详细介绍了基于滞环电流控制的VIENNA整流器的技术特点和工作原理。首先概述了VIENNA整流器作为一种高效AC-DC转换器的独特优势,如高功率因数、低谐波失真和高效率。接着阐述了滞环电流控制技术的基本原理,即通过实时检测和比较实际电流与给定电流的偏差,控制开关器件的通断,实现电流的精确控制。然后具体解释了基于滞环电流控制的VIENNA整流器的工作机制,强调其快速响应、高精度和低噪声的特点。最后总结了该整流器的多项优点,包括高效率、快速响应、高功率因数和较低的谐波失真,指出其在未来电力电子系统中的广泛应用前景。 适合人群:从事电力电子技术研究和开发的专业人士,以及对高效AC-DC转换器感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解VIENNA整流器及其控制技术的研究人员和技术人员,旨在提升对电力转换系统的理解和优化能力。 其他说明:本文不仅提供了理论分析,还讨论了实际应用中的优化策略,有助于推动相关技术的进步和发展。

    实训商业源码-单个商品销售系统源码-毕业设计.zip

    实训商业源码-单个商品销售系统源码-毕业设计.zip

    全国大学生电子设计竞赛介绍(20190716151135).pdf

    电子设计竞赛相关资源

    samtec-signal-integrity-handbook.pdf

    samtec-signal-integrity-handbook

    南京大学ppt模板红色风论文答辩PPT模板

    南京大学ppt模板红色风论文答辩PPT模板

Global site tag (gtag.js) - Google Analytics