我正在玩 JAX-RS,部署在 Tomcat 上。基本上是:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
有什么方法可以ServletContext
在我的 JAX-RS 资源中获取?
我正在玩 JAX-RS,部署在 Tomcat 上。基本上是:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
有什么方法可以ServletContext
在我的 JAX-RS 资源中获取?
此外,@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
正如其他人所指出的, 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 注释。
当您实现 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
}
您现在可以选择哪个静态变量来分配您已读取的参数。这允许您在启动时读取参数一次,并通过分配给它的静态变量多次重复使用。
像这样使用资源注入,
@Resource ServletContext servletContext;