Quercus
是一个Resin
实现的解析并运行php
文件的jar
库,其本质是使用QuercusServlet
处理所有访问.php
的文件请求,Quercus
会将php文件翻译成java class
文件并在JVM中执行。
添加Quercus
依赖:
<dependency>
<groupId>com.caucho</groupId>
<artifactId>quercus</artifactId>
<version>4.0.63</version>
</dependency>
然后创建一个Quercus
的Servlet
映射,因为BinCat
只支持注解,所以无法在QuercusServlet
类上添加@WebServlet
注解,但是我们可以写一个类去继承QuercusServlet
从而间接的完成Servlet
声明。
QuercusPHPServlet示例:
package com.anbai.sec.server.test.servlet;
import com.caucho.quercus.servlet.QuercusServlet;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "QuercusPHPServlet", urlPatterns = ".*\\.php$")
public class QuercusPHPServlet extends QuercusServlet {
}
BinCatConfig示例代码(方便统一的Servlet注册):
/**
* 手动注册Servlet并创建BinCatServletContext对象
*
* @param appClassLoader 应用的类加载器
* @return ServletContext Servlet上下文对象
*/
public static BinCatServletContext createServletContext(BinCatWebAppClassLoader appClassLoader) throws Exception {
BinCatServletContext servletContext = new BinCatServletContext(appClassLoader);
// 手动注册Servlet类
Class<Servlet>[] servletClass = new Class[]{
TestServlet.class,
CMDServlet.class,
QuercusPHPServlet.class
};
for (Class<Servlet> clazz : servletClass) {
Servlet servlet = clazz.newInstance();
WebServlet webServlet = clazz.getAnnotation(WebServlet.class);
if (webServlet != null) {
// 获取WebInitParam配置
WebInitParam[] webInitParam = webServlet.initParams();
// 动态创建Servlet对象
ServletRegistration.Dynamic dynamic = servletContext.addServlet(webServlet.name(), servlet);
// 动态设置Servlet映射地址
dynamic.addMapping(webServlet.urlPatterns());
// 设置Servlet启动参数
for (WebInitParam initParam : webInitParam) {
dynamic.setInitParameter(initParam.name(), initParam.value());
}
}
}
// 创建ServletContext
return servletContext;
}
因为QuercusServlet
创建时需要必须有ServletContext
对象,所以我们必须实现ServletContext
接口。除此之外,Servlet
创建时还需要调用Servlet
的初始化方法(public void init(ServletConfig config) throws ServletException
)。调用init
的时候还需要实现ServletConfig
接口。
初始化Servlet代码片段:
/**
* 初始化Servlet
*
* @param servletContext Servlet上下文
* @throws ServletException Servlet处理异常
*/
public static void initServlet(BinCatServletContext servletContext) throws ServletException {
Set<BinCatServletRegistrationDynamic> dynamics = servletContext.getRegistrationDynamics();
for (BinCatServletRegistrationDynamic dynamic : dynamics) {
Servlet servlet = dynamic.getServlet();
String servletName = dynamic.getServletName();
Map<String, String> initParameterMap = dynamic.getInitParameters();
servlet.init(new BinCatServletConfig(servletContext, servletName, initParameterMap));
}
}