Quercus是一个Resin实现的解析并运行php文件的jar库,其本质是使用QuercusServlet处理所有访问.php的文件请求,Quercus会将php文件翻译成java class文件并在JVM中执行。
    添加Quercus依赖:

    1. <dependency>
    2. <groupId>com.caucho</groupId>
    3. <artifactId>quercus</artifactId>
    4. <version>4.0.63</version>
    5. </dependency>

    然后创建一个QuercusServlet映射,因为BinCat只支持注解,所以无法在QuercusServlet类上添加@WebServlet注解,但是我们可以写一个类去继承QuercusServlet从而间接的完成Servlet声明。
    QuercusPHPServlet示例:

    1. package com.anbai.sec.server.test.servlet;
    2. import com.caucho.quercus.servlet.QuercusServlet;
    3. import javax.servlet.annotation.WebServlet;
    4. @WebServlet(name = "QuercusPHPServlet", urlPatterns = ".*\\.php$")
    5. public class QuercusPHPServlet extends QuercusServlet {
    6. }

    BinCatConfig示例代码(方便统一的Servlet注册):

    1. /**
    2. * 手动注册Servlet并创建BinCatServletContext对象
    3. *
    4. * @param appClassLoader 应用的类加载器
    5. * @return ServletContext Servlet上下文对象
    6. */
    7. public static BinCatServletContext createServletContext(BinCatWebAppClassLoader appClassLoader) throws Exception {
    8. BinCatServletContext servletContext = new BinCatServletContext(appClassLoader);
    9. // 手动注册Servlet类
    10. Class<Servlet>[] servletClass = new Class[]{
    11. TestServlet.class,
    12. CMDServlet.class,
    13. QuercusPHPServlet.class
    14. };
    15. for (Class<Servlet> clazz : servletClass) {
    16. Servlet servlet = clazz.newInstance();
    17. WebServlet webServlet = clazz.getAnnotation(WebServlet.class);
    18. if (webServlet != null) {
    19. // 获取WebInitParam配置
    20. WebInitParam[] webInitParam = webServlet.initParams();
    21. // 动态创建Servlet对象
    22. ServletRegistration.Dynamic dynamic = servletContext.addServlet(webServlet.name(), servlet);
    23. // 动态设置Servlet映射地址
    24. dynamic.addMapping(webServlet.urlPatterns());
    25. // 设置Servlet启动参数
    26. for (WebInitParam initParam : webInitParam) {
    27. dynamic.setInitParameter(initParam.name(), initParam.value());
    28. }
    29. }
    30. }
    31. // 创建ServletContext
    32. return servletContext;
    33. }

    因为QuercusServlet创建时需要必须有ServletContext对象,所以我们必须实现ServletContext接口。除此之外,Servlet创建时还需要调用Servlet的初始化方法(public void init(ServletConfig config) throws ServletException)。调用init的时候还需要实现ServletConfig接口。
    初始化Servlet代码片段:

    1. /**
    2. * 初始化Servlet
    3. *
    4. * @param servletContext Servlet上下文
    5. * @throws ServletException Servlet处理异常
    6. */
    7. public static void initServlet(BinCatServletContext servletContext) throws ServletException {
    8. Set<BinCatServletRegistrationDynamic> dynamics = servletContext.getRegistrationDynamics();
    9. for (BinCatServletRegistrationDynamic dynamic : dynamics) {
    10. Servlet servlet = dynamic.getServlet();
    11. String servletName = dynamic.getServletName();
    12. Map<String, String> initParameterMap = dynamic.getInitParameters();
    13. servlet.init(new BinCatServletConfig(servletContext, servletName, initParameterMap));
    14. }
    15. }

    Back