如何通过 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");
(...)
}
}
希望对你有帮助,
蒂埃里
我设置了 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"); (...) } }
希望对你有帮助, 蒂埃里