67

我正在玩 JAX-RS,部署在 Tomcat 上。基本上是:

@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {

    @GET
    public String hello() {
        return "Hello World";
    }

}

有什么方法可以ServletContext在我的 JAX-RS 资源中获取?

4

5 回答 5

103

此外,@Resource注释可能不起作用。试试这个

@javax.ws.rs.core.Context 
ServletContext context;

在您点击服务方法之前,注入不会发生

public class MyService {
    @Context ServletContext context;

    public MyService() {
         print("Constructor " + context);  // null here     
    }

    @GET
    @Path("/thing") {               
             print("in  wizard service " + context); // available here
于 2009-11-29T05:55:11.087 回答
9

正如其他人所指出的, servletContext 可以在字段级别注入。它也可以在方法级别注入:

public static class MyService {
    private ServletContext context;
    private int minFoo;

    public MyService() {
        System.out.println("Constructor " + context); // null here
    }

    @Context
    public void setServletContext(ServletContext context) {
        System.out.println("servlet context set here");
        this.context = context;

        minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue();

    }

    @GET
    @Path("/thing")
    public void foo() {
        System.out.println("in wizard service " + context); // available here
        System.out.println("minFoo " + minFoo); 
    }
}

这将允许您使用可用的 servletContext 执行额外的初始化。

明显的注意 - 您不必使用方法名称setServletContext。您可以使用任何您想要的方法名称,只要您遵循 setter 的标准 java bean 命名模式void setXXX(Foo foo)并使用 @Context 注释。

于 2013-01-06T15:15:21.583 回答
6

当您实现 ServletContextListener 时,servlet 上下文也可用。这使得在启动时加载连接字符串等参数变得容易。您可以在 web.xml 中定义侦听器类,该类会在您的 Web 应用程序启动时加载您的 ServletContextListener。

在 web.xml 文件中,添加<listener>and<context-param>标记。<listener>指定在启动时调用的类。该<context-param>标记定义了您的 Web 应用程序中可用的上下文参数。

首先,在 web.xml 文件中包含<listener>和标签:<context-param>

<web-app>
  <!-- ... -->
  <listener>
    <listener-class>com.your.package.ServletContextClass</listener-class>
  </listener>

  <!-- Init parameters for db connection -->
  <context-param>
    <param-name>your_param</param-name>
    <param-value>your_param_value</param-value>
  </context-param>
  <!-- ... -->
</web-app>

现在创建 servlet 上下文类,如下所示。

public class ServletContextClass implements ServletContextListener
{
  public void contextInitialized(ServletContextEvent arg0) 
   {
    //use the ServletContextEvent argument to access the 
    //parameter from the context-param
    String my_param = arg0.getServletContext().getInitParameter("your_param");
   }//end contextInitialized method

  @Override
  public void contextDestroyed(ServletContextEvent arg0) 
  { }//end constextDestroyed method
}

您现在可以选择哪个静态变量来分配您已读取的参数。这允许您在启动时读取参数一次,并通过分配给它的静态变量多次重复使用。

于 2015-04-09T11:25:56.017 回答
5

像这样使用资源注入,

@Resource ServletContext servletContext;
于 2009-11-29T04:37:53.710 回答