使用JAX-RS将对象注入servlet类



我对整个servlet还很陌生,所以如果我混淆或使用了不正确/令人困惑的术语,请纠正我。然而,我正在使用JAX-RS(Jersey)用Java编写一个博客ping服务器,并且我面临一个问题,即我有一个接受REST输入的servlet类,而另一个列出相同内容的servlet类。

现在,他们正在通过一个类共享他们的对象,这个类看起来像这样:

public class BlogPingUtils {
    private static final String LIST_OF_CHANGES = "listOfChanges";
    public static List<PingInfo> getListOfChanges(ServletContext context) {
        List<PingInfo> listOfChanges = (List<PingInfo>)context.getAttribute(LIST_OF_CHANGES);
        if(listOfChanges == null) listOfChanges = new ArrayList<PingInfo>();
        return listOfChanges;
    }
    public static void setListOfChanges(ServletContext context, List<PingInfo> listOfChanges) {
        context.setAttribute(LIST_OF_CHANGES, listOfChanges);
    }
}

这在小规模的开发环境中可以工作,但它感觉很脏,而且由于并发问题等原因,在重型生产环境中可能无法工作。而且它不是很灵活。我想做的是有一个接口,可以有读写数据的方法。然后,我将把实现该接口的类的一个对象注入这两个servlet,这样它们实际上使用同一个对象与数据交互。然后,这将由一个同步的列表或数据库事务或其他东西来支持。

做这件事的首选方式是什么?有可能吗?我的web.xml现在非常简单,看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  <display-name>Blog Ping</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.vrutberg.blogping</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

与其说是一个静态类,不如用getter和setter设计一个Interface,而不是创建一个实现类。

然后,我将向两个servlet都可见的线程安全中央存储库(如JNDI)注册singleton(或池,具体取决于您的需求)实现类。

servlet查询中央存储库并"强制转换"到接口。

最新更新