如何通过 Jetty 服务器处理程序在 Application Context 上设置属性

How to set attributes on Application Context through a Jetty server Handler

我设置了 Jetty 服务器并将其绑定到 Restlet 应用程序:

                    server = new org.eclipse.jetty.server.Server(PORT);

                    final ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
                    servletContext.setContextPath("/");
                    servletContext.setInitParameter("org.restlet.application", MyApplication.class.getName());
                    servletContext.addServlet(ServerServlet.class, "/*");
                    servletContext.addServlet(DefaultServlet.class, "/");

                    server.setHandler(servletContext);
                    server.start();
                    server.join();

但是我想为应用程序上下文设置一些属性。如何管理。我试过了,但没有成功,而且我担心在这种情况下我完全误解了 Restlet 上下文的处理方式...

    servletContext.setAttribute("agent", this);

它一直在 MyApplication(Context parentContext) 调用中给出一个空的上下文...

我迷路了。在这种情况下,如何为我的 Restlet 应用程序提供软件上下文?

查看源代码后(参见 https://github.com/restlet/restlet-framework-java/blob/master/modules/org.restlet.ext.servlet/src/org/restlet/ext/servlet/ServerServlet.java#L947),似乎 servlet 配置和 servlet 上下文中的初始化参数都被复制到其 parameters 列表中的 Restlet 应用程序上下文中。

因此您可以将参数从 servlet 上下文传递到 Restlet 应用程序上下文。这是一个示例:

  • 配置servlet上下文时定义参数

    final ServletContextHandler servletContext
       = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContext.setContextPath("/");
    
    servletContext.setInitParameter(
      "org.restlet.application", MyApplication.class.getName());
    servletContext.setInitParameter("test", "my param"); <-----------
    
    servletContext.addServlet(ServerServlet.class, "/*");
    servletContext.addServlet(DefaultServlet.class, "/");
    
  • 在Restlet应用程序中获取参数class

    public class MyApplication extends Application {
        public MyApplication () {
            super();
        }
    
        @Override
        public Restlet createInboundRoot() {
            Series<Parameter> parameters = getContext().getParameters();
            for (Parameter parameter : parameters) {
                System.out.println("- parameter = "+parameter);
            }
    
            (...)
        }
    }
    

还有另一种(但侵入性的)方法,因为 Restlet 在应用程序上下文中的 ServletContext 上保留了一个实例。这允许传递对象而不仅仅是字符串。这是一个示例:

  • 配置servlet上下文时定义参数

    final ServletContextHandler servletContext
      = new ServletContextHandler(ServletContextHandler.SESSIONS);
    servletContext.setContextPath("/");
    
    servletContext.setAttribute("myAttr", new ArrayList<>());
    
    servletContext.addServlet(ServerServlet.class, "/*");
    servletContext.addServlet(DefaultServlet.class, "/");
    
  • 在Restlet应用程序中获取参数class

    public class MyApplication extends Application {
        public MyApplication () {
            super();
        }
    
        @Override
        public Restlet createInboundRoot() {
            ServletContext context
              = (ServletContext) getContext().getAttributes().get(
                      "org.restlet.ext.servlet.ServletContext");
            List l = (List) context.getAttribute("myAttr");
            (...)
        }
    }
    

希望对你有帮助, 蒂埃里