【问题标题】:Get ServletContext in JAX-RS resource在 JAX-RS 资源中获取 ServletContext
【发布时间】:2010-12-21 08:00:45
【问题描述】:

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

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

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

}

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

【问题讨论】:

    标签: tomcat servlets jakarta-ee jax-rs application-variables


    【解决方案1】:

    就这样使用资源注入,

    @Resource ServletContext servletContext;
    

    【讨论】:

      【解决方案2】:

      此外,@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
      

      【讨论】:

      • 我使用哪个 javax.ws.rs 类作为 servlet 处理程序?
      • 并没有真正让你明白这一点。您已经有了一个处理 HTTP GET 请求的类。请详细说明 Servlet 处理程序的含义。干杯。
      • servlet 容器需要一个 servlet 来处理请求。 com.sun.ws.rest.spi.container.servlet.ServletContainer 负责处理请求并将它们分派给我的注释类。你暗示我不应该使用 com.sun.* 类,那么我应该使用什么呢?
      • 为什么不使用任何流行的 servlet 容器,例如 Jetty 或 Tomcat?
      • 正如问题所说,我正在使用 Tomcat。 Tomcat 不会盲目地识别我的 jax-rs 注释类。它将需要一个 servlet 来处理请求。与 Jetty 的交易相同。
      【解决方案3】:
      【解决方案4】:

      正如其他人所指出的,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 注释。

      【讨论】:

      • 不应该是setServletContext(@Context ServletContext上下文)
      【解决方案5】:

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

      在 web.xml 文件中,添加 <listener><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
      }
      

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

      【讨论】:

      猜你喜欢
      • 2013-12-09
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多