我是使用Java进行Web开发的新手。 我正在开发一个Web服务,我选择了REST / Jersey 。
我想在启动服务时初始化一些东西并保留它们 一直以来的服务。
第一个问题: Jersey Servlet的构造函数是否适合这样做?
基本上,我想要的是加载位于WEB-INF目录中的config.ini文件。 在this help之后,我理解我需要一个 ServletContext 来加载我的文件作为资源。
但是,我不清楚如何在 Jersey Servlet中获取 ServletContext ,因为它实际上不是servlet的实例,而是POJO带一些注释。 我想尝试this tip,但属性“context”在构造函数中为null。我认为 Jersey 可能会在构造函数之后填充它。对吗?
那么如何正确地做到这一点?
到目前为止,这是我的代码:
/** Main REST servlet */
@Path("/")
public class Servlet {
// ----------------------------------------------------
// Constants
// ----------------------------------------------------
static private final String CONFIG_PATH = "/WEB-INF/config.ini";
// ----------------------------------------------------
// Attributes
// ----------------------------------------------------
/** Context */
@Context ServletContext context;
// ----------------------------------------------------
// Constructor
// ----------------------------------------------------
/** Init the servlet */
public Servlet() {
// Load config.ini from WEB-INF
Config.config = new Config(
this.context.getResourceAsStream(CONFIG_PATH));
// FAIL! this.context is null ...
}
// ----------------------------------------------------
// URI Handlers
// ----------------------------------------------------
/** Welcome page */
@GET
@Path("/")
@Produces(MediaType.TEXT_HTML)
public String welcome() {
return "<h1>Hi there.</h1>";
}
}
非常感谢任何帮助。 提前谢谢,
圣拉斐尔
答案 0 :(得分:9)
使用ContextListener并不是JAX-RS的方法 - ContextListener是&#34;下一层,&#34;实际上,在servlet API中。
您可以将带注释的声明放在构造函数参数中,然后将其传递给构造函数:
public Servlet(@Context ServletContext context) {
在构造对象之后,对数据成员使用@Context注释初始化该成员,如您所发现的那样。
另一种方法是将Config对象的初始化移动到某种init调用中,并且仅在需要时初始化它,即延迟初始化。然后,ServletContext数据成员已经由Jersey框架设置。
祝你好运!
柯克
答案 1 :(得分:7)
我不熟悉Jersey,但通常在Java Web应用程序中,我认为正确的做法是创建ContextListener。
上下文侦听器是一个实现接口javax.servlet.ServletContextListener的类,并在您的web.xml中配置。它有一个方法,当应用程序第一次被装入容器时执行,另一个方法在应用程序停止时执行,因此它是放置一些一次性初始化内容和清理之前的理想位置。应用程序已停止。
所以步骤是:
您可以在此处找到其他信息:tutorial
或者在Sun的,呃,Oracle的网站上。
顺便说一下,如果你的文件在JAR文件中,我不确定ServletContext方法是加载它的最佳方法。我觉得你最喜欢的事情就像:
this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties");