Bare bones servlet应用程序,在哪里存储我可以参考的配置设置?

时间:2011-11-02 02:25:53

标签: java servlets

我有一个简单的servlet应用程序。

我是否将配置相关信息存储在我的web.xml文件中?

我的servlet中是否会触发一个事件,我应该将配置值保存到静态只读变量?

我现在有一个servlet,但是生命周期是从全球开始的另一个文件吗?

就像在.net中一样,你有自己的页面,但有一个global.asax.cs类可以在以下特定事件中触发:

application_startup
application_shutdown
application_beginRequest
application_endRequest

servlet是否具有此功能,还是基于每个servlet?

3 个答案:

答案 0 :(得分:4)

application_startup
application_shutdown

实施ServletContextListener

@WebListener
public class ApplicationListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Do your job here on application startup.
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do your job here on application shutdown.
    }

}

您可以将应用程序范围的变量存储为ServletContext的属性。

event.getServletContext().setAttribute("foo" new Foo());

它可以通过继承的getServletContext()方法在servlet中使用。

Foo foo = (Foo) getServletContext().getAttribute("foo");

仅在EL中使用JSP。

${foo.someProperty}

application_beginRequest
application_endRequest

实施ServletRequestListener

@WebListener
public class RequestListener implements ServletRequestListener {

    @Override
    public void requestInitialized(ServletRequestEvent event) {
        // Do your job here on request begin.
    }

    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        // Do your job here on request end.
    }

}

您可以将请求范围的变量存储为ServletRequest的属性。

event.getServletRequest().setAttribute("foo" new Foo());

它可以通过传入的HttpServletRequest参数在servlet中使用。

Foo foo = (Foo) request.getAttribute("foo");

仅在EL中使用JSP。

${foo.someProperty}

您甚至可以在一个类中实现这两个接口:

@WebListener
public class GlobalListener implements ServletContextListener, ServletRequestListener {
    // ...
}

或者,更常见的是,如果您希望能够更全面地修改/控制请求,Filter

@WebFilter(urlPatterns={"/some/*"})
public class SomeFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        // Do here your application startup job.

        // If you have any <init-param> in web.xml, then you could get them
        // here by config.getInitParameter("name") and assign it as field.
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // Do here your request/response preprocessing job.

        // Continue the request/response (if you haven't already forwarded/redirected the request/response beforehand).
        chain.doFilter(request, response);

        // Do here your request/response postprocessing job.
    }

    @Override
    public void destroy() {
        // Do here your application shutdown job.

        // If you have assigned any expensive resources as field of
        // this Filter class, then you could clean/close them here.
    }

}

另见https://stackoverflow.com/tags/servlet-filters/info

可以在the javax.servlet package中找到Servlet API的所有其他侦听器作为接口。学会在Javadocs找到自己的方式。

答案 1 :(得分:2)

对于application_startupapplication_shutdown,请查看javax.servlet.ServletContextListener

对于application_beginRequestapplication_endRequest,请查看javax.servlet.Filter

两者都可以通过相应的级别事件管理范围(以地图或初始化参数的形式),您可以在其中放置配置和/或初始化/完成组件。

答案 2 :(得分:0)

Servlet有一个加载顺序;它曾经常常具有执行初始化任务的启动servlet,在其他servlet之前加载。

现在,这通常由启动监听器处理。

http://download.oracle.com/docs/cd/B14099_19/web.1012/b14017/filters.htm#i1000654

可能在init-params中存储参数,但还有其他选项,如JNDI,属性文件等。