我设置了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应用程序提供软件上下文?
答案 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");
(...)
}
}
希望它可以帮到你, 亨利