第一部分介绍的博客Struts架构,下一节介绍中特定成分,这个博客是写Struts控制器ActionServlet。

扮演的角色

ActionServlet类是Struts的控制中心,全部来自于浏览器的请求的地址映射、ActionForm的匹配、视图的流转都须要通过控制中心来调度。

也就是说。它所充当的是总入口的角色,不管是进或者出都须要经过它。

继承关系


Struts框架是一个实现,因此有一个默认的实现类ActionServlet。一般直接不做自己的实现。直接调用就可以,或者是继承ActionServlet类对其做一些扩展。

须要注意的是,扩展时仅仅是重写当中的某些方法,所以须要使用super来调用默认ActionServlet类中的其它方法。

当然配置文件里的相应配置也要改动为扩展的类。

ActionServlet的主要功能

  • 读取配置文件

ActionServlet类实现的是调度功能。而调度所须要的映射信息都保存在Struts-config.xml文件里。因此在ActionServlet载入的时候首先会把配置信息读取到内存中。

    这些配置信息会依据不同的配置内容存储在ModuleConfig对象中。

这里看一下源代码的两个代码段:

    第一个来自ActionServlet默认实现类。

表明初始化了三类配置信息:        

<span style="font-family:FangSong_GB2312;font-size:18px;">            ModuleConfig moduleConfig = initModuleConfig("", config);
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
moduleConfig.freeze();</span>

第二个代码段来自ModulConfig实现类,是该类的一些变量。表明配置信息依据不同的内容存储在该类相应的HashMap中。

<span style="font-family:FangSong_GB2312;font-size:18px;">        this.dataSources = new HashMap();
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();</span>

这两个的关系就相当于路由和路由表的关系,Struts-config.xml保存的就是转向、调度所须要的映射关系。

  • 截取clienthttp请求,分发到对应的Action

ActionServlet本质上还是一个Servlet类。所以它有Servlet的一般方法。仅仅只是它对请求的处理都是调度到请求相应的Action。当然,这当中还做了相应的非常多其它操作如填充ActionForm。

    ActionServlet类收到get或者post请求时。doGet()或者doPost()都会调用process()方法来处理。这里源代码里非常明显不贴代码了。主要看一下process()方法吧:

 

<span style="font-family:FangSong_GB2312;font-size:18px;">    protected void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException { ModuleUtils.getInstance().selectModule(request, getServletContext());
ModuleConfig config = getModuleConfig(request); RequestProcessor processor = getProcessorForModule(config);
if (processor == null) {
processor = getRequestProcessor(config);
}
processor.process(request, response);
}
</span>

在process()方法中。首先调用org.apache.struts.util.ModuleUtils类的selectModule()方法,这种方法选择负责处理当前请求的子应用模块,然后把与子应用模块相关的ModuleConfig和MessageResources对象存储倒request范围中。这使得框架的其余组件能够方便地从request范围中读取这些对象,从而获取应用配置信息和消息资源。

process()方法的第二步操作为获得RequestProcessor类的实例,然后调用RequestProcessor类的process()方法,来完毕预处理请求操作。

    总结: 关于源代码的一些东西,不是所有都能看的非常明确。可是源代码里面包括了非常多东西值得一看,有助于更深刻仔细的了解Struts框架的实现。ActionServlet类的调度功能的实现主要是配置信息的读取和存储,以及之后怎样使用这些配置信息。

即从文件——内存——使用这个过程。ActionServlet上的第一个这样的一个,它拥有很多谈论没有一。

下一步博客再见!

版权声明:本文博主原创文章。博客,未经同意不得转载。

SSH-Struts(两)—调节器(ActionServlet)的更多相关文章

  1. ssh的两个小知识

    ssh的两个小知识 1. 在ssh客户端启动远程服务器的图形界面程序. 如果你试图在ssh客户端运行远程服务器的一个图形界面程序,比如说执行firefox,此时可能会提示,can not connec ...

  2. SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  3. SSH—Struts(三)—跑步者(Action)

    如已经描述Struts其基本原理和控制器ActionServlet,根据一个请求通过流ActionServlet之后就要到达Action类中做详细的处理了.ActionServlet通过ActionM ...

  4. 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓

    hibernate工作原理 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提 ...

  5. SSH(Struts、Spring、Hibernate)三大框架整合

    1. 新建数据库ssh_db -> 新建表user_tb(id为主键,自动递增) 2. 导入jar包(struts.hibernate 和 spring) 3. 注册页面reg.jsp,将表单的 ...

  6. [转] 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓

      hibernate工作原理 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6 ...

  7. 局域网内使用ssh连接两台计算机总结

    因为家里有两台电脑,一个centos7 系统,一个Mac,都是笔记本,感觉两个拿来拿去的用太麻烦了,所以就想用ssh连接cenots7 的电脑,这样就没那么麻烦了.欢迎大家指正 配置静态ip cent ...

  8. ssh的两种连接方法(包括无密码访问)

    一.正常连接方法:ssh root@10.0.0.20 二.无密码连接方法(有两台机器:此处我把被连接的称为服务器,另一台则称为客户端): 1.先在服务器添加目录 .ssh: mkdir  .ssh ...

  9. SSH的两种登录方式

    ssh客户端使用的是Xshell,windows环境. 第一种方式,用户名密码方式 原理如下: 客户端发起ssh请求之后,服务器把自己的公钥传给客户端 客户端输入服务器密码通过公钥加密之后传给服务器 ...

随机推荐

  1. C语言 cgi(2)

    1Columbia Universitycs3157 – Advanced ProgrammingSummer 2014, Lab #3, 40 pointsJune 10, 2014This lab ...

  2. GUI & Event例子

    Student No.: _______________ Name: ________________________________________1TK2934 Object-Oriented P ...

  3. IM设计与实现的系统模块的聊天记录

    到非常多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供须要的朋友參考下. 一.整体设计 1.存储位 ...

  4. Spark的分布式计算

    Spark,Spark是什么,如何使用Spark 1.Spark基于什么算法的分布式计算(很简单) 2.Spark与MapReduce不同在什么地方 3.Spark为什么比Hadoop灵活 4.Spa ...

  5. facade pattern

    外观模式是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便.外观模式并不给系 ...

  6. Akka FSM 源代码分析

    Akka FSM 源代码分析 萧猛 <simonxiao@qq.com> 啰嗦几句 有限状态机本身不是啥新奇东西,在GoF的设计模式一书中就有状态模式, 也给出了实现的建议.各种语言对状态 ...

  7. HDU-4689 Derangement

    太洗脑了: 题目意思:初始队列是1,2, 3.......n :在打乱这个队列切保证每个数字都不在原来的位置上的情况下给出一个具有+,- 的队列: 被打乱的队列 和 原来队列 对应位置的大小的关系是那 ...

  8. Android 随着输入框控件的清除功能ClearEditText,抄IOS输入框

    今天给大家带来一个非常有用的小控件ClearEditText,就是在Android系统的输入框右边增加一个小图标,点击小图标能够清除输入框里面的内容,IOS上面直接设置某个属性就能够实现这一功能.可是 ...

  9. Shell在大数据的魅力时代:从一点点思路百度大数据面试题

    供Linux开发中的同学们,Shell这可以说是一个基本功. 对于同学们的操作和维护.Shell也可以说是一种必要的技能,Shell.对于Release Team,软件配置管理的同学来说.Shell也 ...

  10. [LeetCode234]Palindrome Linked List

    题目: Given a singly linked list, determine if it is a palindrome. 判断一个单链表是不是回文 思路: 1.遍历整个链表,将链表每个节点的值 ...