有没有办法将一些操作引导到我的所有servlet?

时间:2016-04-13 14:55:57

标签: java servlets init bootstrapping dynamic-websites

我有一堆Servlet。我希望他们所有人都能实例化Logger,几乎完全相同 是否有适当的(如主文件)我可以在这些代码中使用它们? 目前我所做的是创建一个Servlet类的子类,它在init函数中执行,并且所有其他Servltes都从它继承。

1 个答案:

答案 0 :(得分:0)

我不知道你正在为记录器做什么是个好主意(我想你会失去一些记录器容量),但是,如果你想在servlet中有一个独特的实例,你应该声明它和以静态方式初始化它:

static final SomethingClear GLOBAL;
static{
    // do tons of things to init 
    GLOBAL = ClassWithStaticFunc.gimmeGlobalLoaded();
}

为什么这样更好?因为还有另一个有趣的 - 或者很好,可能很烦人:( - 在servlet中加载静态(在唯一性的意义上,并且总是将在内存中的实例)变量的方式:

Servlets没有像'main'那样的东西。它们是存在于servlet容器中的唯一实例,由它实例化,其方法(doGet,doPost,doPut,doDelete)由servlet容器按需执行,为它们提供请求和响应对象。因此,在内存中,每个servlet都会有一个且只有一个实例,因此doGet,doPut,doDelete和doPost之外的任何变量在内存中都是唯一的。这是在java-time的开头以这种方式完成的,以节省内存......

这是合并会话的有趣方式...... :(

如果你在servlet中为这些方法之外的任何东西做出贡献,它将被分配给你的应用程序的所有会话,并且不是很明显,并且不容易找到...

因此最好将它们标记为静态和最终,因为它们将始终被创建(您无法访问对象构造)并且只有一个实例。这不好,但是servlet并不好......

我曾经做过一个独特的servlet,它使用反射调用我的自定义'Servlets'(每个请求一个对象,在web.xml中将我的'servlet'的名称作为initParam,并将servlet-name始终设置为相同的servlet那是矿井的实例,解决会话合并问题并且工作得很好。