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

时间:2015-07-29 15:57:02

标签: java jetty restlet

我设置了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();

但是我想为Application上下文设置一些属性。如何管理。我尝试了这个,但它没有做到这一点,我担心我非常误解如何处理Restlet上下文是这样的......

    servletContext.setAttribute("agent", this);

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

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

1 个答案:

答案 0 :(得分:1)

在查看源代码(参见https://github.com/restlet/restlet-framework-java/blob/master/modules/org.restlet.ext.servlet/src/org/restlet/ext/servlet/ServerServlet.java#L947)之后,似乎来自servlet config和servlet上下文的两个init参数都被复制到其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应用程序类中获取参数

    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应用程序类中获取参数

    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");
            (...)
        }
    }
    

希望它可以帮到你, 亨利