Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1678469
  • 博文数量: 210
  • 博客积分: 10013
  • 博客等级: 上将
  • 技术积分: 2322
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-25 15:56
文章分类

全部博文(210)

文章存档

2011年(34)

2010年(121)

2009年(37)

2008年(18)

我的朋友

分类: LINUX

2010-04-20 19:41:49

 Php调用java类配置过程

 (php-java-bridge实现实例)

Php是在apache下面解析的,而java类是在tomcat下面解析的,我之前的web服务都是部署在了tomcat下面,因为目前要转移web服务,使用phprpc修改为三层架构,所以尝试一下使用php调用java

以下的配置都是基于php-java-bridge,下面的介绍出自ibm官网http://www.ibm.com/developerworks/cn/aix/library/au-javaphpaix5

PHP Java Bridge 是一种经过优化的、基于 XML 的协议,它允许您在 PHP 应用程序中直接使用 Java 类。尽管从理论上讲,它的工作方式类似于 SOAP,但是实际上,它比 SOAP 方法的效率要高得多。

该系统使用 JSR 223 接口进行工作。PHP 组件可以与任何 ECMA-335 后端系统通信,其中包括 Java 技术、基于 Java 的扩展接口(如 JPython JRuby),部署公共语言运行时(Common Language RuntimeCLR)的 .NET 应用程序、甚至还包括 .NET 兼容的解决方案(如 Mono)。

这个过程是双向的:PHP 脚本可以调用 Java/.NET 类,或者 Java 组件可以调用 PHP 类或脚本。甚至可以将这种桥接集成到解决方案中,以便在请求一个类的时候,允许自动地启动后端系统(Apache/IIS PHP、或者 .NET、或者 Java/Tomcat)。

该系统通过访问 Tomcat 应用服务器上的一个远程类进行工作。当您运行 PHP 应用程序时,它从远程 Java 应用程序服务平台加载 PHP Java Bridge 代码。这将初始化系统,并使得 PHP 脚本知道如何与该应用服务器上的远程 Java 类进行通信。

很显然,为了能够使用 PHP Java Bridge 访问您的 Java 类,您必须在安装 PHP Java Bridge 之前,安装 Apache PHP

下面是配置过程:

1.              首先要保证你的系统已经装上了apachephp,以及tomcatjdk,这些文件的安装网络上比较全,在此不多赘述。

2.              将下载的javabridge.war文件直接拷贝到tomcatwebapps目录下面,然后重启tomcat,之后你会发现在tomcatwebapps目录下面多了一个JavaBridge目录,其java目录下包含了我们要调用的Java.inc文件。Javabridge官网:

3.              然后在浏览器里访问,看到如下所示,证明你的tomcat正确解析了这个包。

     php/java bridge examples

     …………

4.                但是在默认的情况下,PHP Java Bridge 配置为不允许来自非本地服务器的连接。这意味着,如果您希望将您的应用程序部署到不同的服务器,那么可能会阻止您的连接。要更改这项配置,您需要更改 JavaBridge 应用程序所使用的参数。要实现这一点,可以编辑 JavaBridge 部署的 Web 应用程序目录中的 web.xml 文件。它应该是 Tomcat 安装目录中的 webapps/JavaBridge/WEB-INF/web.xml 文件。 您需要取消对这个部分的注释,以便允许对您的 Java 类进行远程访问

    
  promiscuous
  On

5.              JavaBridge类似,php配置默认属性也是不允许远程文件的包含,要修改这个属性,就要编辑php.ini文件,将下面两个属性打开

        allow_url_fopen = On

              allow_url_include = On(这个属性可能要添加)

6.              apache的目录/var/www/html/下面写一个测试php页面,内容如下:

      1

      2 //require_once("/usr/local/tomcat/webapps/JavaBridge/java/Java.inc");

      3 require_once("");

      4 $System = new Java("java.lang.System");

      5 $te = $System->getProperties();

      6 echo $te;

      7 ?>

7.     在浏览器中访问,如果能看到如下内容,则你的   apache   可以访问到本机的java类了。

{java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=/usr/java/jdk1.6.0_17/jre/lib/i386, java.vm.version=14.3-b01, shared.loader=, java.vm.vendor=Sun Microsystems Inc., java.vendor.url= path.separator=:, tomcat.util.buf.StringCache.byte.enabled=true, java.util.logging.config.file=/usr/local/tomcat/conf/logging.properties, java.vm.name=Java HotSpot(TM) Client VM, file.encoding.pkg=sun.io, sun.java.launcher=SUN_STANDARD, user.country=CN, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/usr/local/tomcat/bin, java.runtime.version=1.6.0_17-b04, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.endorsed.dirs=/usr/local/tomcat/endorsed, os.arch=i386, java.io.tmpdir=/usr/local/tomcat/temp, line.separator= , java.vm.specification.vendor=Sun Microsystems Inc., java.naming.factory.url.pkgs=org.apache.naming, java.util.logging.manager=org.apache.juli.ClassLoaderLogManager, os.name=Linux, sun.jnu.encoding=UTF-8, java.library.path=/usr/java/jdk1.6.0_17/jre/lib/i386/client:/usr/java/jdk1.6.0_17/jre/lib/i386:/usr/java/jdk1.6.0_17/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib, java.specification.name=Java Platform API Specification, java.class.version=50.0, sun.management.compiler=HotSpot Client Compiler, os.version=2.6.11-1.1369_FC4, user.home=/root, catalina.useNaming=true, user.timezone=Asia/Shanghai, java.awt.printerjob=sun.print.PSPrinterJob, file.encoding=UTF-8, java.specification.version=1.6, catalina.home=/usr/local/tomcat, java.class.path=/usr/local/tomcat/bin/bootstrap.jar, user.name=root, java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory, package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper., java.vm.specification.version=1.0, java.home=/usr/java/jdk1.6.0_17/jre, sun.arch.data.model=32, user.language=zh, java.specification.vendor=Sun Microsystems Inc., java.vm.info=mixed mode, sharing, java.version=1.6.0_17, java.ext.dirs=/usr/java/jdk1.6.0_17/jre/lib/ext:/usr/java/packages/lib/ext, sun.boot.class.path=/usr/java/jdk1.6.0_17/jre/lib/resources.jar:/usr/java/jdk1.6.0_17/jre/lib/rt.jar:/usr/java/jdk1.6.0_17/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0_17/jre/lib/jsse.jar:/usr/java/jdk1.6.0_17/jre/lib/jce.jar:/usr/java/jdk1.6.0_17/jre/lib/charsets.jar:/usr/java/jdk1.6.0_17/jre/classes, server.loader=, java.vendor=Sun Microsystems Inc., catalina.base=/usr/local/tomcat, file.separator=/, java.vendor.url.bug= common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.,sun.beans.,

8.              下面自己写一个类,实现调用。内容如下:

      1 package test;

      2

      3 public class Test{

      4         private String t1="hello world!";

      5         public String get(){

      6         return this.t1;

      7 }

      8 public static void main(String args[]){

      9         Test t = new Test();

     10                System.out.println(t.get());

     11 }

     12 }

然后在和test目录同级的目录下写一个MANIFEST.MF文件,内容如下:

Main-Class:(空格)test.Test(回车)

MANIFEST.MF文件具有严格的结构,一定要按照这个格式写,如果包含了第三方包,一定要在第二行注明!

目录结构如下:

Xxxx

       MANIFEST.MF

       test

              Test.java

然后在test目录同级执行jar cvfm test.jar MANIFEST.MF test/ 生成一个jar文件test.jar,用命令java –jar test.jar执行以下看是否可行。

9.              修改test.php的内容如下

      1

      2 //require_once("/usr/local/tomcat/webapps/JavaBridge/java/Java.inc");

      3 require_once("");

      4 $System = new Java("java.lang.System");

      5 $te = $System->getProperties();

      6 echo $te;

      7 java_require("/root/");//一定要把刚才生成的jar文件放到这个require的目录下面

      8 $objectKey = new java("test.Test");

      9 $tes =$objectKey->get();

     10 echo $tes;

     11 ?>

刷新

你会看到比刚才看到的java环境内容多一行的Hello world内容。

后记test.php文件的require_once的参数,如果是本机访问tomcat,可以写绝对路径,不用http形式的,如果是这一行出现错误,不妨写成绝对路径试试看,如果出现错误,一般是php.ini或者你的web.xml文件的两处修改没有做。还有就是如果没有看到想要的内容或者有什么错误,记得先重启一下apache或者tomcat试试看,柳暗花明,呵呵。

对照我的记录,你会hello world的!

 

阅读(9084) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~