初学Struts2,对其工作机制的一点猜测与总结:
首先在不使用struts的情况下,一般采用jsp+servlet+javabean的模式来进行开发
这种开发也可以形成MVC模式,但当servlet的数量比较多的时候,web.xml的配置就会非常的复杂
需要为每一个servlet进行配置操作。
struts的使用简化了servlet的配置操作,只需要在web.xml中加入一个过滤器对用户所输入的路径进行过滤处理
找到合适的Action来响应用户的请求。
其次struts如何通过url来找到合适的Action呢?从struts的配置文件中,可以猜测其处理机制。
一般框架的编写最后都会抽象到一个配置文件中去,这样会使框架的使用和配置变得更加灵活,
Struts也不例外,将配置信息写到struts.xml文件中,然后通过解析器对配置文件进行解析,
获取信息后在利用java的反射机制进行处理操作。
struts配置文件的层级结构和每个标签的主要属性大致如下大致如下:
其中struts可以定义多个package,每个package也可以定以多个action
在每一个package中,action的name属性可以作为该包中action的唯一标识;
而package的namespace属性,我们也可理解为是表示每一个包的标识.
这样通过namespace+actionName就可以定位到每一个Action的配置
而用户所输入的url请求格式就是/namespace/actionName.action
没有看过struts2的源代码,如果单独参照它的配置文件自己实现的话,我会选择用一个HashMap来存储每个Action的信息。
其中的key值就是刚才提到的namespace+actionName;
value值是一个Object,该Object封装了所有有关该Action的信息,
包括该Action的具体实现类(class属性),调用实现类中的哪一个方法(method属性),
执行method方法前的拦截操作(interceptor-ref标签)以及执行后可能跳转的页面集合(result标签)。
这样通过namespace+actionname的key值获取到Action信息的封装对象之后
首先取出其class属性,利用java的反射机制实例化这个Action的具体实现类;
然后将所实例化的对象作为参数传递到<interceptor-ref>所定义的拦截器链中进行指定方法执行前的拦截处理操作
比较常用的拦截操作如:Field赋值(paramatersInteceptor),表单验证(ValidationInterceptor)等等;
其次获取Action封装对象的method属性,如果为空默认为execute方法,利用反射机制执行这个方法。
执行完该方法后会返回一个String字符串,该字符串会作为key值找到合适的返回页面(返回页面的定义是通过Map实现的,key值是<result>的name属性值),
最后通过request.dispatcher的形式跳转到指定页面完成一次请求-响应操作。
欢迎大虾们给与指正,骂人的闪。