`

如何在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框架的原生类做啥呢?

相关推荐

    在Struts 2中实现CRUD

    ### Struts 2中实现CRUD操作详解 #### 一、引言 CRUD操作是软件开发中最常见的数据处理方式之一,它代表了对数据进行的四种...希望本文能帮助读者更好地理解Struts 2中的CRUD操作实现方法,并能在实际项目中灵活运用。

    基于struts2的简单购书管理系统

    6. **Action类**:在Struts2中,Action类是控制器的实现,它处理用户请求,调用业务逻辑,然后返回一个结果到视图。每个Action类通常对应一个特定的业务操作。 7. **配置文件**:包括struts.xml和web.xml。struts....

    struts2学生信息管理系统

    在开发过程中,Struts2还提供了强大的动作类和结果类型,支持国际化、主题样式等功能,使得开发过程更加灵活和高效。此外,结合其他技术,如Spring进行依赖注入,Hibernate进行对象关系映射,可以构建出更完整的Java...

    struts2 论坛系统

    2. **SessionFactory**:创建会话的工厂,通常在应用启动时初始化。 3. **Session**:与数据库交互的实例,负责CRUD(创建、读取、更新、删除)操作。 4. **Criteria API**:用于构建动态查询,提供了一种更面向对象...

    struts2问卷调查系统

    综上所述,Struts2问卷调查系统是一个集成了用户交互、数据库管理、权限控制的完整应用实例,展示了Struts2框架在实际项目中的应用和优势。开发者可以借此学习如何构建类似的应用,提升自己的Java EE开发技能。

    Struts2电子拍卖系统含数据库

    在描述中提到的“含数据库导入语句”,意味着此项目包含了数据库相关的脚本或文件,可能是一个SQL文件,用于创建和初始化电子拍卖系统的数据表结构。这通常包括用户表、拍卖品表、出价记录表等,以便存储用户信息、...

    struts2+spring+mybatis+easyui的实现

    在Struts2中,Action类是业务逻辑的载体,配置在struts.xml文件中,通过拦截器链来处理请求和响应。Struts2还提供了丰富的结果类型,如dispatcher(转发)和stream(流式下载),以及强大的OGNL表达式语言,用于在...

    用 struts2 实现的图书管理系统

    这通常意味着在系统初始化时,开发人员会运行SQL脚本来创建表结构、插入初始数据,如`bookmanage.sql`文件可能就包含了这些内容。在图书管理系统中,可能有书籍、作者、出版社等相关的表,以及用于存储进销存信息的...

    基于Struts2+Hibernate4实现报道管理系统

    【标题】"基于Struts2+Hibernate4实现报道管理系统"是一个使用Java技术栈构建的Web应用,它结合了Struts2框架、Hibernate4 ORM工具以及SQL Server数据库来管理和处理新闻报道相关的数据。这个系统旨在提供一个高效、...

    全套源码-论坛系统(Struts 2+Hibernate+Spring实现)

    【标题】:“全套源码-论坛系统(Struts 2+Hibernate+Spring实现)”揭示了一个基于Java技术栈开发的论坛系统,它整合了三个重要的框架:Struts 2、Hibernate和Spring。这个项目旨在提供一个完整的解决方案,帮助...

    Struts2 工作原理 Struts2框架 有图

    Struts2框架作为Java Web开发领域中的一款经典MVC(Model-View-Controller)框架,其工作原理涉及到了一系列复杂的组件交互与流程控制。本文将深入解析Struts2的工作流程,帮助开发者理解其核心机制。 ### 一、...

    基于Struts2+Spring+Hibernate+MySql的注册登录系统.zip

    在SSH系统中,Spring主要负责管理整个应用的组件,包括Struts2的Action、Hibernate的数据访问对象(DAO)等。通过Spring的IoC容器,我们可以实现松耦合和更好的测试性。同时,Spring还提供了与Hibernate的集成,简化...

    Struts2,Spring与Hibernate整合应用,学生成绩管理系统

    - **Hibernate配置**:配置Hibernate以适应Spring环境,包括在Spring配置文件中定义SessionFactorybean,使其能够读取Hibernate配置文件(如hibernate.cfg.xml),从而初始化Hibernate SessionFactory。 #### 四、...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    - **MVC设计模式**:在Struts2中,模型(Model)负责管理应用程序的数据逻辑;视图(View)负责展示数据;控制器(Controller)则处理用户的请求并将控制权交给合适的模型或视图。 - **拦截器机制**:Struts2中的...

    struts2源码分析总结

    在`Dispatcher`的初始化过程中,它会读取`web.xml`或其他配置文件,解析Struts2的配置信息,如Action、结果类型、拦截器等。这些配置信息被加载到内存中的容器中,供后续请求处理时使用。`Dispatcher`还负责初始化...

    一个运用了struts框架的学生请假系统

    在提供的压缩包文件中,"leave.sql"很可能是数据库脚本文件,包含了创建该请假系统所需的所有数据库表结构、初始化数据以及可能的触发器、存储过程等。开发者可以通过导入这个SQL脚本来快速设置好项目的数据库环境。...

    基于Struts2框架的名片管理系统

    在Struts2框架中,`Model`负责业务逻辑和数据管理,通常由JavaBeans或Entity Beans实现。`View`是用户看到的页面,通常使用JSP或FreeMarker模板技术来生成。`Controller`作为两者之间的桥梁,接收用户的请求,处理并...

    swfuplaod+struts2实现多文件上传

    2. **配置SWFUpload**:在HTML页面中,通过JavaScript调用SWFUpload初始化方法,配置文件选择、文件类型限制、上传URL等参数。 3. **创建Struts2 Action**:在Struts2框架中,创建一个处理文件上传的Action类,该类...

    struts实现的简单自动售货系统

    在“struts实现的简单自动售货系统”项目中,我们可以看到Struts框架被用来构建一个后台管理系统,这个系统可以处理自动售货机的相关操作,如商品管理、订单处理、库存控制等基本功能。下面将详细探讨Struts框架在...

    struts2_vip会员管理系统

    在这个会员管理系统中,Struts2负责接收用户请求,调度控制层的Action,进而与模型层交互,最后将结果传递给视图层进行展示。 SQL Server数据库在这里起到了数据持久化的作用,它是Microsoft公司推出的关系型数据库...

Global site tag (gtag.js) - Google Analytics