struts控制器actionServlet

SSH-Struts(二)—控制器(ActionServlet)

分类: java SSH   233人阅读  评论(2)  收藏  举报

目录(?)[+]

    上篇博客介绍了Struts的架构,接下来将详细的介绍其中的组件,这篇博客要写的是Struts的控制器ActionServlet。

扮演的角色

    ActionServlet类是Struts的控制中心,所有来自于浏览器的请求的地址映射、ActionForm的匹配、视图的流转都需要通过控制中心来调度。也就是说,它所充当的是总入口的角色,无论是进或者出都需要经过它。

继承关系


    Struts框架是一个实现,因此有一个默认的实现类ActionServlet。一般直接不做自己的实现,直接调用即可,或者是继承ActionServlet类对其做一些扩展。需要注意的是,扩展时只是重写其中的某些方法,所以需要使用super来调用默认ActionServlet类中的其他方法。当然配置文件中的对应配置也要修改为扩展的类。

ActionServlet的主要功能

  • 读取配置文件

    ActionServlet类实现的是调度功能,而调度所需要的映射信息都保存在Struts-config.xml文件中。因此在ActionServlet加载的时候首先会把配置信息读取到内存中。
    这些配置信息会根据不同的配置内容存储在ModuleConfig对象中。这里看一下源码的两个代码段:
    第一个来自ActionServlet默认实现类。表明初始化了三类配置信息:        
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">            ModuleConfig moduleConfig = initModuleConfig("", config);  
  2.             initModuleMessageResources(moduleConfig);  
  3.             initModuleDataSources(moduleConfig);  
  4.             initModulePlugIns(moduleConfig);  
  5.             moduleConfig.freeze();</span>  
    第二个代码段来自ModulConfig实现类,是该类的一些变量。表明配置信息根据不同的内容存储在该类对应的HashMap中。
     
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">        this.dataSources = new HashMap();  
  2.         this.exceptions = new HashMap();  
  3.         this.formBeans = new HashMap();  
  4.         this.forwards = new HashMap();  
  5.         this.messageResources = new HashMap();  
  6.         this.plugIns = new ArrayList();</span>  
    这两个的关系就相当于路由和路由表的关系,Struts-config.xml保存的就是转向、调度所需要的映射关系。
  • 截取客户端http请求,分发到相应的Action
    ActionServlet本质上还是一个Servlet类,所以它有Servlet的一般方法。只不过它对请求的处理都是调度到请求对应的Action。当然,这其中还做了相应的很多其他操作如填充ActionForm。
    ActionServlet类收到get或者post请求时,doGet()或者doPost()都会调用process()方法来处理。这里源码里很明显不贴代码了。主要看一下process()方法吧:
 
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">    protected void process(HttpServletRequest request, HttpServletResponse response)  
  2.         throws IOException, ServletException {  
  3.   
  4.         ModuleUtils.getInstance().selectModule(request, getServletContext());  
  5.         ModuleConfig config = getModuleConfig(request);  
  6.   
  7.         RequestProcessor processor = getProcessorForModule(config);  
  8.         if (processor == null) {  
  9.            processor = getRequestProcessor(config);  
  10.         }  
  11.         processor.process(request, response);  
  12.     }  
  13. </span>  

    在process()方法中,首先调用org.apache.struts.util.ModuleUtils类的selectModule()方法,这个方法选择负责处理当前请求的子应用模块,然后把与子应用模块相关的ModuleConfig和MessageResources对象存储倒request范围中,这使得框架的其余组件可以方便地从request范围中读取这些对象,从而获取应用配置信息和消息资源。
process()方法的第二步操作为获得RequestProcessor类的实例,然后调用RequestProcessor类的process()方法,来完成预处理请求操作。
    总结: 关于源码的一些东西,不是全部都能看的很明白。但是源码里面包含了很多东西值得一看,有助于更深刻细致的了解Struts框架的实现。ActionServlet类的调度功能的实现主要是配置信息的读取和存储,以及之后如何使用这些配置信息。即从文件——内存——使用这个过程。ActionServlet就先这样了,它的功能还好多不一一讲了。下篇博客再见!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值