通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等。
在Struts中实现系统的初始化工作
在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。
- package
fangwei.servlet; -
- import
javax.servlet.ServletException; - import
org.apache.struts.action.ActionServlet; -
-
- public
class BaseServlet extends ActionServlet { -
-
private static final long serialVersionUID = -4743066925691800288L; -
-
@Override -
-
public void init() throws ServletException { -
super.init(); -
-
// 初始化系统全局变量 -
// ... -
-
// 加载自定义配置文件 -
// ... -
-
// 启动定时任务 -
// ... -
} -
- }
package fangwei.servlet; import javax.servlet.ServletException; import org.apache.struts.action.ActionServlet; public class BaseServlet extends ActionServlet { private static final long serialVersionUID = -4743066925691800288L; @Override public void init() throws ServletException { super.init(); // 初始化系统全局变量 // ... // 加载自定义配置文件 // ... // 启动定时任务 // ... } }
- <?xml
version="1.0" encoding="UTF-8"?> - <web-app>
-
<!-- struts servlet begin --> -
<servlet> -
<servlet-name>struts</servlet-name> -
<servlet-class>fangwei.servlet.BaseServlet</servlet-class> -
<init-param> -
<param-name>config</param-name> -
<param-value>/WEB-INF/struts/struts-config.xml</param-value> -
</init-param> -
<load-on-startup>0</load-on-startup> -
</servlet> -
<servlet-mapping> -
<servlet-name>struts</servlet-name> -
<url-pattern>*.do</url-pattern> -
</servlet-mapping> -
<!-- struts servlet end --> - </web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app> <!-- struts servlet begin --> <servlet> <servlet-name>struts</servlet-name> <servlet-class>fangwei.servlet.BaseServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts/struts-config.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>struts</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- struts servlet end --> </web-app>
在Struts2中实现系统的初始化工作
在Struts2中,我们可以写一个filter让它继承于FilterDispatcher并覆盖其init()方法,然后修改web.xml文件的Struts2启动相关配置来达到目的。
- package
fangwei.filter; -
- import
javax.servlet.FilterConfig; - import
javax.servlet.ServletException; -
- import
org.apache.struts2.dispatcher.FilterDispatcher; -
- public
class BaseFilterDispatcher extends FilterDispatcher { -
-
@Override -
public void init(FilterConfig arg0) throws ServletException { -
super.init(arg0); -
-
// 初始化系统全局变量 -
// ... -
-
// 加载自定义配置文件 -
// ... -
-
// 启动定时任务 -
// ... -
} -
- }
package fangwei.filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import org.apache.struts2.dispatcher.FilterDispatcher; public class BaseFilterDispatcher extends FilterDispatcher { @Override public void init(FilterConfig arg0) throws ServletException { super.init(arg0); // 初始化系统全局变量 // ... // 加载自定义配置文件 // ... // 启动定时任务 // ... } }
- <?xml
version="1.0" encoding="UTF-8"?> - <web-app>
-
<filter> -
<filter-name>struts2</filter-name> -
<filter-class>fangwei.filter.BaseFilterDispatcher</filter-class> -
</filter> -
<filter-mapping> -
<filter-name>struts2</filter-name> -
<url-pattern>/*</url-pattern> -
</filter-mapping> - </web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter> <filter-name>struts2</filter-name> <filter-class>fangwei.filter.BaseFilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
思考
不管是Struts、Struts2还是其他的web层框架,它们目前基于的技术都是Servlet,只要根据web.xml找到那个启动类,我们就能通过覆盖该类的的init()方法来实现系统的初始化工作。
比较优雅的实现系统的初始化工作
以上的实现方式都侵入了框架的原生类,利用Servlet容器的特性我们可以更优雅的实现系统的初始化工作。 我们可以写一个listener让它实现ServletContextListener接口,在contextInitialized()方法中做想做的事情。将此listener配置到web.xml中,Servlet容器如tomcat会在启动该web应用程序时调用此方法。
- package
fangwei.listener; -
- import
javax.servlet.ServletContextEvent; - import
javax.servlet.ServletContextListener; -
- public
class InitListener implements ServletContextListener { -
-
public void contextDestroyed(ServletContextEvent sce) { -
System.out.println("web exit ... "); -
} -
-
public void contextInitialized(ServletContextEvent sce) { -
System.out.println("web init ... "); -
//系统的初始化工作 -
// ... -
} -
- }
package fangwei.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class InitListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent sce) { System.out.println("web exit ... "); } public void contextInitialized(ServletContextEvent sce) { System.out.println("web init ... "); //系统的初始化工作 // ... } }
- <?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>
<?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>
再思考