【问题标题】:How to set attributes on Application Context through a Jetty server Handler如何通过 Jetty 服务器处理程序在应用程序上下文上设置属性
【发布时间】:2015-07-29 15:57:02
【问题描述】:

我设置了一个 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 应用程序提供软件上下文?

【问题讨论】:

    标签: java jetty restlet


    【解决方案1】:

    查看源代码后(请参阅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 应用程序类中获取参数

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

    希望对你有帮助 蒂埃里

    【讨论】:

    • 再次感谢 Thierry :) 实际上我应该更具体:我需要在上下文中添加一些对象,而不仅仅是字符串值。正如在这个问题中的检查答案:stackoverflow.com/questions/15073686/… router.getContext().getAttributes().put(CONNECTION_POOL_KEY, connectionPool);
    • 不客气!有一种方法可以做到这一点,但这取决于ServletContext 类本身......我更新了我的答案以向您展示。希望它能回答你的问题!
    猜你喜欢
    • 2018-07-26
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2011-06-23
    • 2017-10-19
    • 2020-10-30
    相关资源
    最近更新 更多