代码之家  ›  专栏  ›  技术社区  ›  leeeroy

在JAX-RS资源中获取ServletContext

  •  60
  • leeeroy  · 技术社区  · 16 年前

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

    @Path("/hello")
    @Produces({"text/plain"})
    public class Hellohandler {
    
        @GET
        public String hello() {
            return "Hello World";
        }
    
    }
    

    有什么办法我能找到那辆车吗 ServletContext 在我的JAX-RS资源中?

    5 回复  |  直到 10 年前
        1
  •  101
  •   djna    15 年前

    @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
    
        2
  •  9
  •   JohnC    13 年前

    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的标准JavaBean命名模式,就可以使用任何方法名,

        3
  •  6
  •   Kobby Kan    11 年前

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

    <listener> <context-param> <听众> 指定在启动时调用的类。这个 <上下文参数>

    首先,包括 <听众> < web.xml文件中的标记:

    <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>
    

    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
    }
    

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

        4
  •  5
  •   ZZ Coder    16 年前

    就这样使用资源注入,,

    @Resource ServletContext servletContext;