`
liuxiang123
  • 浏览: 30603 次
  • 性别: Icon_minigender_1
  • 来自: 四川
社区版块
存档分类
最新评论

struts源码分析(一)

阅读更多
第一次写这种技术性的东西,可能写得比较凌乱不易阅读,请大家多多见谅。

首先浅谈下struts的优点,主要表现在两个方面,封装的struts标签库和页面导航。
才有struts标签库能够大大的提高开发效率与提高代码复用。struts在页面跳转方面并不直接转发一个实际的页面而是转发给在strus-config.xml中已经配置的对象。这意味着,在不改变Action代码的情况下就可以更换其转发的页面,便以系统的维护。可想而知如果我们系统中有上百个页面要修改转发路径我们不必找出每个页面对应的action直接在配置文件中修改又不用重新编译即可完成。

接下来开始分析strtus的源码。
struts 核心部分 ServletAction是一个继承HttpServlet的一个普通select类。进入该类将会调用init()方法。
public void init()
  throws ServletException
{
initInternal();
    initOther();
    initServlet();
    getServletContext().
    setAttribute"org.apache.struts.action.ACTION_SERVLET", this);
    ModuleConfig moduleConfig = initModuleConfig("", this.config);
    initModuleMessageResources(moduleConfig);
    initModuleDataSources(moduleConfig);   
    initModulePlugIns(moduleConfig);
    moduleConfig.freeze(); 
    Enumeration names = getServletConfig().getInitParameterNames();
    while (names.hasMoreElements()) {
    String name = (String)names.nextElement();
    if (!name.startsWith("config/")) {
      continue;
   }
     String prefix = name.substring(6);
     moduleConfig = initModuleConfig(prefix, getServletConfig   ().getInitParameter(name));
     initModuleMessageResources(moduleConfig);
     initModuleDataSources(moduleConfig);
     initModulePlugIns(moduleConfig);
     moduleConfig.freeze();
    }
    destroyConfigDigester();
}

initInternal()方法主要对资源文件进行初始化
initOther()方法主要是加载struts配置文件的路径debug级别以及参数为convertNull时设置数据类型为空是返回null不为数据类型的默认值。
简单介绍下加载struts的配置文件默认情况下struts加载
         <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts</param-value>
        </init-param>
读取init参数为config的这里也可以支持param-value以“,”分割的文件
如果系统偏大struts-*.xml文件过多不便于书写我们可以采用另一种形式来加载
可以继承一个ActionServlet类的一个子类来处理struts文件的加载重写initOther方法
如下面类
public class ActionServletDirectory extends  ActionServlet {

/**
*
*/
private static final long serialVersionUID = 1L;
private static final String STRUTS_CONFIG_DIRECTORY = "directory";
private static final Log log = LogFactory.getLog(ActionServletDirectory.class);

protected void initOther () {
super.initOther();
                  //父类的config
this.config = getStrutsConfigFiles();

}

//文件筛选配置
private final static FilenameFilter STRUTS_CONFIG_FILE_FILTER = new FilenameFilter() {

public boolean accept(File dir, String fileName) {
String name = fileName.toLowerCase();
boolean isStrutsFile = name.indexOf("struts")!=-1;
boolean isXmlFile = name.indexOf(".xml")!=-1;
return isStrutsFile && isXmlFile;
}
};
private String getStrutsConfigFiles()
{
String directory = getServletConfig().getInitParameter(STRUTS_CONFIG_DIRECTORY);
String path = getServletContext().getRealPath(directory);
File strutsConfigDir = new File(path);
if(!strutsConfigDir.isDirectory())
{
throw new IllegalArgumentException(" >>>>>>>>>>>>>> 无效的Struts文件目录 [" + strutsConfigDir.getPath()
+ strutsConfigDir.getAbsolutePath() + "]");
}
File[] files = strutsConfigDir.listFiles(STRUTS_CONFIG_FILE_FILTER);
StringBuffer config = new StringBuffer();
log.info("start Load struts config file !");
for(int i = 0;i<files.length;i++)
{
String configFileName = directory + "/" + files[i].getName();
config.append(configFileName);
config.append(",");
log.info("[" + configFileName + "]");
}
log.info("end Load struts config file !");
return config.toString();
}

}
配置文件改成这种形式
<init-param>
            <param-name>directory</param-name>
            <param-value>/WEB-INF/struts</param-value>
        </init-param>
直接加载directory目录下的struts-*.xml文件
分享到:
评论

相关推荐

    struts2 源码分析

    Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图主要包括 Filter chain...

    struts2源码分析

    struts2源码详细解析51CTO下载-struts2源代码分析(个人觉得非常经典)

    struts2源码分析总结

    本文将深入探讨Struts2的源码分析,特别是关于StrutsPrepareAndExecuteFilter的初始化过程,这是Struts2的核心组件之一,负责处理HTTP请求。 首先,我们来看`StrutsPrepareAndExecuteFilter`的初始化。这个过滤器...

    Struts2源码分析

    在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...

    struts2部分源码分析

    本篇文章将深入探讨Struts2的运行原理,通过源码分析来揭示其内部工作机制。 首先,我们从核心组件开始。Struts2的核心组件包括Action、FilterDispatcher、Interceptor和Result。Action是业务逻辑的载体,它接收...

    Struts2源码阅读

    Struts2是一个流行的Java Web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。源码阅读对于理解其工作原理至关重要。本文将深入探讨Struts2的核心概念、类和请求处理流程。 首先,我们来看Struts2的架构...

    struts源码分析

    struts的源码分析,整个流程,ActionServlet开始创建formbean开始

    struts 1 源码分析

    下面我们将深入探讨Struts 1的源码分析,特别是针对Struts 1.2版本。 1. **架构概述** - **DispatcherServlet**:作为Struts的核心,DispatcherServlet负责接收HTTP请求并分发到相应的Action。 - **ActionMapping...

    struts1.2源码研究

    Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache...通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。

    struts源码struts源码struts源码

    源码分析对于理解Struts的工作原理至关重要,特别是对于开发者来说,能够深入研究源码可以帮助他们更好地调试、优化应用,甚至为框架贡献自己的代码。下面,我们将深入探讨Struts的核心组件和关键知识点。 1. **...

    struts2 源码解读

    源码分析是提升编程技能和解决问题的关键,特别是对于复杂的框架如Struts2,理解其内部工作原理能够帮助我们优化应用性能,修复潜在问题,并进行定制化开发。 首先,Struts2的核心组件包括Action、Result、...

    struts2 源码

    源码分析是深入理解一个框架工作原理的关键步骤,对于提升开发技能和解决问题有着不可估量的价值。下面将详细讨论Struts2.1.8版本中的核心概念和关键组件。 1. **Action类与拦截器(Interceptor)**: Struts2的核心是...

    struts2框架源码

    了解这些基本概念后,深入源码分析可以发现以下关键技术点: 1. **Dispatcher Servlet**:Struts2的核心控制器,负责接收HTTP请求,通过ActionMapper找到对应的Action,然后调用ActionInvocation进行拦截器链的执行...

    struts-1.2.9源码

    源码分析可以帮助我们深入理解其工作原理,从而更好地利用和定制框架,提升开发效率。 1. **Struts框架概述** - MVC模式:Struts将应用逻辑、数据展示和用户交互分离开来,使得开发者可以独立地修改各部分,降低...

    Struts+Spring源码分析(喜欢分析源码的有福了)

    Struts源码分析: 1. **ActionServlet**:Struts的核心控制器,负责接收HTTP请求,解析请求参数,并调用相应的Action来处理业务逻辑。 2. **ActionMapping**:用于映射请求URL到特定的Action,它包含了Action的配置...

    struts2框架源码分析及问题汇总

    Struts2是一个强大的Java web应用程序开发框架,它基于MVC(Model-View-Controller)设计模式,极大地简化了创建功能丰富的、交互式的Web应用的过程。本文将深入剖析Struts2的源码,揭示其工作原理,并汇总常见问题...

    struts-1.3.9 源码

    通过分析Struts 1.3.9的源码,开发者可以学习到如何设计一个MVC框架,了解其请求处理流程、视图渲染机制以及如何通过配置文件定制行为。此外,这也有助于开发者在遇到问题时能够追溯源代码,找到问题的根源,或者为...

    struts2深入详解源码1-5章

    本资料包包含的是《Struts2深入详解》一书的源码分析,涵盖了从第一章到第五章的内容,并附带了相关的jar包,方便读者结合理论与实践进行学习。 首先,让我们从第一章开始,Struts2的基础知识。这一章通常会介绍...

Global site tag (gtag.js) - Google Analytics