我有一个简单的servlet应用程序。
我是否将配置相关信息存储在我的web.xml文件中?
我的servlet中是否会触发一个事件,我应该将配置值保存到静态只读变量?
我现在有一个servlet,但是生命周期是从全球开始的另一个文件吗?
就像在.net中一样,你有自己的页面,但有一个global.asax.cs类可以在以下特定事件中触发:
application_startup
application_shutdown
application_beginRequest
application_endRequest
servlet是否具有此功能,还是基于每个servlet?
答案 0 :(得分:4)
application_startup
application_shutdown
@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
@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_startup
和application_shutdown
,请查看javax.servlet.ServletContextListener。
对于application_beginRequest
和application_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,属性文件等。