我希望两个Java servlet共享公共init()
和destroy()
方法以及初始化参数。所以很自然地,我实现了抽象servlet public abstract class CommonConnectionServlet extends HttpServlet
,实现了所提到的方法。我还在web.xml
文件中添加了一些初始化参数。我描述了两个扩展我的抽象servlet的servlet。但是它没有用 - glassfish服务器试图创建CommonConnectionServlet
实例,引发异常并且servlet没有启动。
我可以以某种方式阻止抽象servlet的实例化吗?或者,通常声明抽象servlet是一个坏主意吗?
答案 0 :(得分:2)
抽象servlet很好,如果你愿意,你可以这样做。问题似乎是您在 web.xml 中声明了它。在那里宣布(或注释)作为' servlet'将被实例化。
首先,将其从web.xml中删除。然后,如果我理解正确,您想通过web.xml共享一些参数。最简单的方法是创建"上下文参数"而不是" init-parameters",如下所示:
<web-app>
<context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
...
</web-app>
然后,您必须重写您的抽象servlet以首先尝试GenericServlet.getInitParameter(),但如果没有返回任何内容,则重试ServletContext.getInitParameter()。
这种子类servlet可以在需要时覆盖参数,但如果没有,则使用公共共享参数。