如何在tomcat或resin下将PHP脚本包含到JSF页面中


How to include PHP script into JSF page under tomcat or resin?

我在Tomcat下工作过JSF应用程序。在相同的项目中,我配置,也使用,PHP如Caucho Resin站点(Link)

所述

但是当我尝试将分离的PHP工作脚本包含到JSG页面时,页面失败。

我有test.php与:

<?php
print "hello world";
?>

web.xml中我添加了:

<servlet>
    <servlet-name>Quercus Servlet</servlet-name>
    <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
    <init-param>
        <param-name>license-directory</param-name>
        <param-value>WEB-INF/licenses</param-value>
    </init-param>
</servlet> 
<servlet-mapping>
    <servlet-name>Quercus Servlet</servlet-name>
    <url-pattern>*.php</url-pattern>
</servlet-mapping>

resin.jar加入web-inf/lib

当我直接调用test.php时,它正在工作,但是当我尝试包括这样:

<ui:include src="test.php"/>

或者直接在JSF页面写php代码,如果失败

这里有一个例外:

javax.faces.view.facelets.FaceletException: Error Parsing /test.php: Error Traced[line: 5] Premature end of file.
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:429)
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:403)
    at com.sun.faces.facelets.compiler.Compiler.compile(Compiler.java:124)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.createFacelet(DefaultFaceletFactory.java:319)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.access$100(DefaultFaceletFactory.java:92)

有人做过这种实验吗?

当您直接调用PHP页面时,它正在由Quercus Servlet处理,完全没有问题。但是,当您调用包含在非PHP页面中的PHP页面时,例如JSP(或JSF或XHTML或其他文件扩展名),您的Quercus Servlet不会处理它,从而给您这个错误。

您可以使用Quercus Servlet和/或Faces Servlet对页面进行混合解析(我还没有测试过,所以我不确定它是否会工作)。另一种选择是不直接在JSP/JSF页面中使用PHP脚本,而是使用它们来处理操作,即<form action="test.php">

请注意,这不是JSF、Tomcat、Resin或Caucho的问题,而是servlet的问题,或者更糟的是,设计问题。这就引出了一个问题:为什么要在web应用程序中使用如此奇怪的设计?