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());}}}// 创建ServletContextreturn 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));}}
