概述:
Struts2框架由三部分构成:核心控制器、业务控制器和用户实现的业务逻辑组件。在这三部分中,struts2框架提供了核心控制器StrutsPrepareAndExecuteFilter,而用户需要实现业务控制层和业务逻辑层。
一、核心控制器 StrutsPrepareAndExecuteFilter
StrutsPrepareAndExecuteFilter与struts2以前版本中的FilterDispatcher一样。它是struts2框架的核心控制器,该控制器作为一个Filter运行在web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求,如果用户请求跟web.xml中配置的映射一致,该请求就会被转入struts2框架来处理。
Struts2框架获取请求后,将根据请求的前面部分决定调用那个业务逻辑组件,例如:对于login.action请求,Struts2调用名为login的Action来处理该请求。(struts2最新版本可以省略action)
Struts2处理请求的Action实例,并不是用户实现的业务控制器,而是Action代理--因为用户实现的业务控制器并没有与ServletAPI耦合,因此无法处理用户请求,而struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中数值解析出来,传入Action中,并回调action的execute方法来处理用户请求。
上面的处理过程是典型的AOP(面向切面编程)处理方式,如图所示的处理模型:
从图看出,用户实现的Action仅仅是struts2的Action代理的代理目标,用户实现的业务控制器Action则包含了对用户请求的处理,用户的请求数据包含在HttpServletRequest对象中, 而用户Action类无需访问HttpServletRequest对象,拦截器会将请求数据解析出来并传给业务逻辑组件Action实例
二、业务控制器
简述:左右项目开发中action控制层,用户接受数据,封装数据,调用业务逻辑层
业务控制器组件就是用户Action类的实例,Action类通常包含了一个excute方法,该方法返回一个字符串-----该字符串就是一个逻辑视图名,当业务控制器处理完用户请求后,根据处理结果不同,excute方法返回不同字符串。
每个字符串对应一个视图名
在写完控业务制器后,需要配置Action的如下三个部分定义
●Action所处理的URL
●Action组件所对应的实现类
●Action里包含的逻辑视图和物理资源之间的对应关系
每个Action都要处理一个用户请求,而用户请求总是包含了指定URL,当StrutsPrepareAndExecuteFilter拦截到用户请求后,根据请求的URL和Action处理URL之间的对应关系来处理转发
三、struts2的模型组件
Java EE 应用里的模型组件,通常指系统的业务逻辑组件,而隐藏在系统逻辑组件下面的,可能还包含了DAO,领域对象等组件。
MVC框架里的业务控制器会调用模型组件的方法来处理用户请求,也就是说,业务控制器不会对用户请求进行实际处理,用户请求最终由模型组件负责处理,业务控制器只是中间负责调度器,这也是称Action为控制器的原因
四、Struts2的视图组件
Struts2已经改变了struts1只能使用JSP作为视图技术的现状,允许使用其他模版技术。
当struts2的控制器返回逻辑视图名时,逻辑视图并未与任何的视图技术关联,仅仅是返回一个字符串,该字符串作为逻辑视图名。
当我们在struts.xml文件中配置Action时,要为Action元素指定系列result子元素,每个result子元素定义一个逻辑视图和物理视图之间的映射,如果没有指定type属性,默认使用JSP左右视图资源。也可以指定很多类型 chain 转发到指定action中,redircter,重定向。
五、运行流程
Struts2框架的运行流程非常相似于WebWork框架的流程,struts2其实就是WebWork2.2的升级版,因此,struts2的运行流程与WebWork运行流程完全相同,如图WebWork的运行流程:
当用户向Web应用发送请求时,该请求经过ActionContextCleanUp、SiteMesh等过滤器过滤。由Struts2的核心控制器拦截,如果用户请求需要struts2的业务逻辑控制器处理,该控制器则调用Action映射器,该映射器将用户请求转发到对应的业务逻辑控制器。(过滤器)也就是调用action的代理类。
业务逻辑控制器只是WebWork控制器的目标-----这就是为什么开发者自己实现的Action可以与servletAPI分离的原因,当Action处理完HTTP请求后,该结果只是一个普通的字符串,该字符串将对应到指定的视图资源。 指定的视图资源经过拦截器链处理后,生成对客户端的响应输出
1,当用户想web应用发送请求后,该请求经过一些预先设置的过滤器,如果请求与Struts2核心控制器配置的映射对应,那么由struts2的核心控制器拦截,进入struts2框架处理。
2,进入struts2之后,根据映射器(struts.xml中的配置)的对应映射,将请求转发到对应的action(业务逻辑控制器)去处理,其实这里的action并非用户所写的action,而是struts2生成的代理action,进入指定函数处理前,要先经过一些拦截器处理(比如获取请求对象,内容)
3,进入对应的函数处理请求,(这个过程是用户预定义的操作,其实呢这一步也主要是转发请求到对应的服务层,或者DAO层去处理)
4,执行完毕之后根据返回的字符串,调用对应的视图层显示结果。
5,再经过一些拦截器和过滤器的处理后,返回请求。