在Struts中实现系统的初始化工作
通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等。
在Struts中实现系统的初始化工作
在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆 盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。
Java代码
代码
1. package fangwei.servlet;
2.
3. import javax.servlet.ServletException;
4. import org.apache.struts.action.ActionServlet;
5.
6. /**
7. * 系 统唯一的Servlet类BaseServlet<br>
8. * 完成系统初始化的工作
9. */
10. public class BaseServlet extends ActionServlet {
11.
12. private static final long serialVersionUID = -4743066925691800288L;
13.
14. @Override
15. /*
16. * 系 统初始化
17. */
18. public void init() throws ServletException {
19. super.init();
20.
21. // 初始化系统全局变量
22. // ...
23.
24. // 加载自定义配置文件
25. // ...
26.
27. // 启动定时任务
28. // ...
29. }
30.
31. }
2.
3. import javax.servlet.ServletException;
4. import org.apache.struts.action.ActionServlet;
5.
6. /**
7. * 系 统唯一的Servlet类BaseServlet<br>
8. * 完成系统初始化的工作
9. */
10. public class BaseServlet extends ActionServlet {
11.
12. private static final long serialVersionUID = -4743066925691800288L;
13.
14. @Override
15. /*
16. * 系 统初始化
17. */
18. public void init() throws ServletException {
19. super.init();
20.
21. // 初始化系统全局变量
22. // ...
23.
24. // 加载自定义配置文件
25. // ...
26.
27. // 启动定时任务
28. // ...
29. }
30.
31. }
Xml代码
1. package fangwei.servlet;
2.
3. import javax.servlet.ServletException;
4. import org.apache.struts.action.ActionServlet;
5.
6. /**
7. * 系 统唯一的Servlet类BaseServlet<br>
8. * 完成系统初始化的工作
9. */
10. public class BaseServlet extends ActionServlet {
11.
12. private static final long serialVersionUID = -4743066925691800288L;
13.
14. @Override
15. /*
16. * 系 统初始化
17. */
18. public void init() throws ServletException {
19. super.init();
20.
21. // 初始化系统全局变量
22. // ...
23.
24. // 加载自定义配置文件
25. // ...
26.
27. // 启动定时任务
28. // ...
29. }
30.
31. }
2.
3. import javax.servlet.ServletException;
4. import org.apache.struts.action.ActionServlet;
5.
6. /**
7. * 系 统唯一的Servlet类BaseServlet<br>
8. * 完成系统初始化的工作
9. */
10. public class BaseServlet extends ActionServlet {
11.
12. private static final long serialVersionUID = -4743066925691800288L;
13.
14. @Override
15. /*
16. * 系 统初始化
17. */
18. public void init() throws ServletException {
19. super.init();
20.
21. // 初始化系统全局变量
22. // ...
23.
24. // 加载自定义配置文件
25. // ...
26.
27. // 启动定时任务
28. // ...
29. }
30.
31. }
那么,在Struts2中我 们应该怎么做呢?
在Struts2中实现系统的初始化工作
在Struts2中,我们可以写一个filter让它继承于FilterDispatcher并覆盖其 init()方法,然后修改web.xml文件的Struts2启动相关配置来达到目的。
Java代码
1. package fangwei.filter;
2.
3. import javax.servlet.FilterConfig;
4. import javax.servlet.ServletException;
5.
6. import org.apache.struts2.dispatcher.FilterDispatcher;
7.
8. public class BaseFilterDispatcher extends FilterDispatcher {
9.
10. @Override
11. public void init(FilterConfig arg0) throws ServletException {
12. super.init(arg0);
13.
14. // 初始化系统全局变量
15. // ...
16.
17. // 加载自定义配置文件
18. // ...
19.
20. // 启动定时任务
21. // ...
22. }
23.
24. }
2.
3. import javax.servlet.FilterConfig;
4. import javax.servlet.ServletException;
5.
6. import org.apache.struts2.dispatcher.FilterDispatcher;
7.
8. public class BaseFilterDispatcher extends FilterDispatcher {
9.
10. @Override
11. public void init(FilterConfig arg0) throws ServletException {
12. super.init(arg0);
13.
14. // 初始化系统全局变量
15. // ...
16.
17. // 加载自定义配置文件
18. // ...
19.
20. // 启动定时任务
21. // ...
22. }
23.
24. }
Xml代码
代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <web-app>
3. <filter>
4. <filter-name>struts2</filter-name>
5. <filter-class>fangwei.filter.BaseFilterDispatcher</filter-class>
6. </filter>
7. <filter-mapping>
8. <filter-name>struts2</filter-name>
9. <url-pattern>/*</url-pattern>
10. </filter-mapping>
11. </web-app>
2. <web-app>
3. <filter>
4. <filter-name>struts2</filter-name>
5. <filter-class>fangwei.filter.BaseFilterDispatcher</filter-class>
6. </filter>
7. <filter-mapping>
8. <filter-name>struts2</filter-name>
9. <url-pattern>/*</url-pattern>
10. </filter-mapping>
11. </web-app>
思考
不管是Struts、Struts2还是其他的web层框架,它们目前基于的技术都是 Servlet,只要根据web.xml找到那个启动类,我们就能通过覆盖该类的的init()方法来实现系统的初始化工作。
比较优雅的实现系统的初始化工作
以上的实现方式都侵入了框架的原生类,利用Servlet 容器的特性我们可以更优雅的实现系统的初始化工作。 我们可以写一个listener让它实现ServletContextListener接口,在contextInitialized()方法中做 想做的事情。将此listener配置到web.xml中,Servlet容器如tomcat会在启动该web应用程序时调用此方法。
Java代码
代码
1. package fangwei.listener;
2.
3. import javax.servlet.ServletContextEvent;
4. import javax.servlet.ServletContextListener;
5.
6. public class InitListener implements ServletContextListener {
7.
8. public void contextDestroyed(ServletContextEvent sce) {
9. System.out.println("web exit ... ");
10. }
11.
12. public void contextInitialized(ServletContextEvent sce) {
13. System.out.println("web init ... ");
14. //系统的初始化工作
15. // ...
16. }
17.
18. }
2.
3. import javax.servlet.ServletContextEvent;
4. import javax.servlet.ServletContextListener;
5.
6. public class InitListener implements ServletContextListener {
7.
8. public void contextDestroyed(ServletContextEvent sce) {
9. System.out.println("web exit ... ");
10. }
11.
12. public void contextInitialized(ServletContextEvent sce) {
13. System.out.println("web init ... ");
14. //系统的初始化工作
15. // ...
16. }
17.
18. }
Xml代码
代码
# <?xml version="1.0" encoding="UTF-8"?>
# <web-app>
# <listener>
# <listener-class>fangwei.listener.InitListener</listener-class>
# </listener>
# <filter>
# <filter-name>struts2</filter-name>
# <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
# </filter>
# <filter-mapping>
# <filter-name>struts2</filter-name>
# <url-pattern>/*</url-pattern>
# </filter-mapping>
# </web-app>
# <web-app>
# <listener>
# <listener-class>fangwei.listener.InitListener</listener-class>
# </listener>
# <filter>
# <filter-name>struts2</filter-name>
# <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
# </filter>
# <filter-mapping>
# <filter-name>struts2</filter-name>
# <url-pattern>/*</url-pattern>
# </filter-mapping>
# </web-app>