我对这整个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>
答案 0 :(得分:0)
与创建实现类相比,我会设计与getter和setter的接口,而不是静态类。
然后我会使用两个servlet可见的线程安全中央存储库(如JNDI)注册单例(或池,具体取决于您的需要)实现类。
servlet查询中央存储库并“转换”到接口。