`

如何在Struts2中实现系统的初始化工作

阅读更多

本文所讨论的话题

通常web系统在启动时需要做一些初始化的工作,比如初始化系统全局变量,加载自定义配置文件,启动定时任务等。 

 

在Struts中实现系统的初始化工作

在Struts中,我们可以写一个Servlet让它继承于ActionServlet并覆盖其init()方法,然后修改web.xml文件的Struts启动相关配置来达到目的。  

package fangwei.servlet;

import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;

/**
 * 系统唯一的Servlet类BaseServlet<br>
 * 完成系统初始化的工作
 */
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>

 那么,在Struts2中我们应该怎么做呢? 

 

在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);

        // 初始化系统全局变量
        // ...

        // 加载自定义配置文件
        // ...

        // 启动定时任务
        // ...
    }

}

 

<?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 ... ");
        //系统的初始化工作
        // ...
    }

}

 

<?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>

 

 

再思考

 固步自封果然不是什么好事。非常感谢downpour 同学的指点。

分享到:
评论
11 楼 benbear2008 2009-07-31  
fangwei 写道
changtuipangxie 写道
changtuipangxie 写道

想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!


我的意思就是,做没做过在定制任务的时候,用到了Spring的IoC注入方式?


目前我只知道可以使用硬编码取得spring容器中的bean
public class SysListener implements ServletContextListener{   
    public void contextInitialized(ServletContextEvent se){   
        WebApplicationContext wa =   WebApplicationContextUtils.getWebApplicationContextse.getServletContext());   
        IXXXService xxxService = (IXXXService )wa.getBean("xxxService ");   
        //Do something here...   
    }   
}  



支持,我一直在想不用ClassPathXmlApplicationContext的方法
10 楼 找不到服务器 2009-03-05  
factory = (BeanFactory) sce.getServletContext().getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)

sce:ServletContextEvent
9 楼 找不到服务器 2009-03-05  
  
changtuipangxie 写道
想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!

嘿嘿,要先获得WEBAPPLICATIONCONTEXT
8 楼 fangwei 2009-03-05  
changtuipangxie 写道
changtuipangxie 写道

想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!


我的意思就是,做没做过在定制任务的时候,用到了Spring的IoC注入方式?


目前我只知道可以使用硬编码取得spring容器中的bean
public class SysListener implements ServletContextListener{   
    public void contextInitialized(ServletContextEvent se){   
        WebApplicationContext wa =   WebApplicationContextUtils.getWebApplicationContextse.getServletContext());   
        IXXXService xxxService = (IXXXService )wa.getBean("xxxService ");   
        //Do something here...   
    }   
}  
7 楼 bask 2009-02-23  
如果使用spring
<bean id="initService" class="com.service.InitService" init-method="init"/>
这个不就可以了吗?直接初始化...
6 楼 Rooock 2009-02-23  
changtuipangxie 写道
changtuipangxie 写道

想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!


我的意思就是,做没做过在定制任务的时候,用到了Spring的IoC注入方式?



在你的web.xml中,spring启动的那个listener是在你这个listener之前还是之后.注意加载的顺序.
5 楼 changtuipangxie 2009-02-22  
changtuipangxie 写道

想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!


我的意思就是,做没做过在定制任务的时候,用到了Spring的IoC注入方式?
4 楼 changtuipangxie 2009-02-22  
想请问一下,如果在web.xml中定义了那个InitListener,然后我还想在其中利用Spring注入的方式在这里使用注入的东西,可发现这些都是为空的,说明没注入进来!
3 楼 fangwei 2008-12-29  
<div class='quote_title'>downpour 写道</div>
<div class='quote_div'>有这个必要嘛?搞个类实现ServletContextListener接口不就完了,还去hack框架的原生类做啥呢?</div>
<p><br/>以前一直是这么做的,也没有去寻找更好的实现方式,献丑了,呵呵。。。</p>
<p> </p>
2 楼 jiangpingzhan 2008-12-29  
downpour 写道
有这个必要嘛?搞个类实现ServletContextListener接口不就完了,还去hack框架的原生类做啥呢?


支持
1 楼 downpour 2008-12-28  
有这个必要嘛?搞个类实现ServletContextListener接口不就完了,还去hack框架的原生类做啥呢?

相关推荐

    Struts2学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的基本操作 8、struts2...

    struts2+hibernate学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...

    struts2+Hibernate+Spring学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...

    办公自动化管理系统(Struts2.0+Hibernate3.0+SQLServer实现)

    办公自动化系统应实现的功能如下。  企业的日常管理,应包括企业的会议管理和公告管理。用户可以通过这一模块查看企业发布的会议、公告,并设置了添加新公告和会议的功能。  考勤管理,应包括外出登记、请假登记...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts文档struts-config.xml 11.6.5 配置web....

    办公自动化源码(使用的技术包括jsp java struts2 sqlserver Hibernate)

    办公自动化系统应实现的功能如下。  企业的日常管理,应包括企业的会议管理和公告管理。用户可以通过这一模块查看企业发布的会议、公告,并设置了添加新公告和会议的功能。  考勤管理,应包括外出登记、请假登记...

    使用JIVE的代理模式来扩展struts+Spring+Hibernate的web框架

    第二种方法,在struts中不易实现,因为Strust的Action被Struts容器接管理,Action初始化,实例化都是由系统自动进行的.如果真的是由AOP实现,也许是一大推代码,很麻烦. 下面就讲讲第三种方法: [ 注意: 以下代码随手写的,...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts文档struts-config.xml 11.6.5 配置web....

    JAVA-Struts图书馆管理系统-struts

    书管理系统的项目介绍 一,介绍 图书管理系统为学校图书馆的自主借书还书等功能提供支持,用户有自己的账号,在线完成线下借书还书等操作。 管理系统包括图书的名称,作者,图书分类,图书编号,剩余数量,借出数量...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    11.3 利用Struts实现用户登录的示例 11.6.1 编写实现登录的页面login.jsp 11.6.2 编写存储登录用户信息的类User.java 11.6.3 编写控制器LoginAction.java 11.6.4 配置Struts文档struts-config.xml 11.6.5 配置web....

    JAVA-Struts图书馆管理系统+源码

    书管理系统的项目介绍 一,介绍 图书管理系统为学校图书馆的自主借书还书等功能提供支持,用户有自己的账号,在线完成线下借书还书等操作。 管理系统包括图书的名称,作者,图书分类,图书编号,剩余数量,借出数量...

    健身房管理信息系统设计.doc

    对于基于Struts框架的Web应用程序,当客户端浏览器发出请求时,请求会被控制器 截获,并调用在Web应用启动时就加载并初始化核心控制器组件ActionServlet,然后通 过ActionServlet从Struts- config.xml文件中读取...

    办公自动化管理系统

    在运行本程序时,需要将Struts 1.1、Hibernate 3.0和SQL Server 2005数据库驱动包拷贝到Tomcat安装路径下的webapps文件夹中的06\WEB-INF\lib文件夹中。 使用说明 系统介绍 结合当今市场的需求,为了满足用户的需要。...

    s2sh + extjs4 办公平台架构

    2、系统中菜单配置可以使用右键菜单管理,这个实现当时花了我一点时间,我感觉右键更符合传统的操作习惯。 3、系统利用struts2 拦截器 判断用户是否登录哦 4、使用p6spy 打印出hibernate 中已经替换了占位符参数...

    Spring攻略(第二版 中文高清版).part2

    2.7 自定义Bean初始化和析构 72 2.7.1 问题 72 2.7.2 解决方案 72 2.7.3 工作原理 72 2.8 用Java Config简化XML配置 77 2.8.1 问题 77 2.8.2 解决方案 77 2.8.3 工作原理 77 2.9 使Bean感知容器 ...

    项目申报系统(Struts2+Spring+Hibernate+Jsp+Mysql5)130223.rar.tar.gz

    JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签...

    在Java Web应用中如何实现任务有效调度

    让我们从一个数据库报表的例子来看看任务调度能如何帮助改善系统设计。报表可能是错综复杂的,这取决于用户所需数据的种类,...这个示例还使用了Struts Action framework插件,以便在web应用启动时初始化任务调度机制。

    java web技术开发大全(最全最新)

    《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》重点讲解了Struts 2、Speing和HIbernate框架的基础知识和高级技术,如Sruts 2中的*、类型转换、国际化和标签等,HIbe rna{e的会话、0/R映射和...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.7.3 Web应用初始化参数的配置 3.7.4 application对象应用示例 3.8 其他内置对象的应用 3.8.1 应答与请求的page对象 3.8.2 页面上下文的page Context对象 3.8.3 获取web.xml配置信息的config对象 3.8.4 获取异常...

Global site tag (gtag.js) - Google Analytics