2009-11-29 86 views
56

我在玩JAX-RS,在Tomcat上部署。它基本上是:在JAX-RS資源中獲取ServletContext

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

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

} 

有什麼辦法,我可以我的JAX-RS資源中獲得ServletContext從哪裏來的?

回答

87

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

哪個javax.ws.rs類作爲servlet處理程序使用? – leeeroy

+0

不是真的讓你受到這個。您已經擁有處理HTTP GET請求的類。請詳細說明Servlet Handler的含義。乾杯。 –

+0

servlet容器需要一個servlet來處理請求。 com.sun.ws.rest.spi.container.servlet.ServletContainer負責處理請求並將它們分派給我的帶註釋的類。你暗示我不應該使用com.sun。*類,那麼我應該使用什麼? – leeeroy

5

只要使用這樣的資源注入,

@Resource ServletContext servletContext; 
5

正如其他人所指出的時,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。只要您遵循標準java bean命名模式,您可以使用任何方法名稱, void setXXX(Foo foo)並使用@Context註釋。

+0

不應該是setServletContext(@Context ServletContext上下文) – Thomas

6

當您實現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 
} 

現在,您可以選擇靜態變量您已經閱讀參數分配。這允許您在啓動時讀取參數一次,並通過您分配給它的靜態變量重複使用很多次。

+0

也可以將'context-param'放置在Apache Tomcat的'conf/context.xml'中:http://stackoverflow.com/a/1626190/ 2639234 – KeksArmee