一.Struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.
二.常见WEB层框架
Struts2
Struts1
Webwork
SpringMVC
三.使用Struts2的优点
1.提高效率
2.struts2框架将web中很多功能都封装了,我们之前很多需要自己来完成的事情,struts2就帮我们代劳了.
3.优秀的架构,可扩展性,aop,mvc思想
四.Struts2能做什么?
1.处理乱码
2.接受参数
3.转发|重定向(常用)
4.校验
5.异常处理机制
6.标签
五.struts2与struts1
struts1和struts2 架构是不同的.甚至可以说是完全不同的框架.
struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)
六.搭建Struts2框架
1.官网下载Struts2开发包
https://struts.apache.org/ (好像最近访问不了)
2.解压后的目录结构
apps:该文件夹用于存放官方提供的Struts2示例程序,这些程序可以作为学习者的学习资料,可以提供很好的参照.各示例都为war文件,可以通过zip方式进行解压.
docs:该文件夹用于存放官方提供的Struts2文档,包括Struts2的快速入门,Struts2的文档,以及API文档等内容.
lib:该文件夹用于存放身Struts2的核心类库,以及Struts2的第三方插件类库.
src:该文件夹用于存放该版本Struts2框架对应的源代码.
3.创建一个web工程引入相关的jar包
可以使用apps中的例子中的jar包
4.书写Action类
5.配置struts2主配置文件
6.配置过滤器
7.访问测试
七.Struts2架构
上面绿色部分属于开发人员需要自己书写的代码部分.
简单介绍Struts2架构图的工作流程:
1、客户端初始化一个指向Servlet容器(例如Tomcat,如:http:localhost:8080/struts2/hello.action)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。
八.Struts2配置文件加载顺序
对应产生文件依次如下:
init_DefaultProperties(); // [1]---- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] --- 自定义struts.properties
init_CustomConfigurationProviders(); // [5] ----- 自定义配置提供
init_FilterInitParameters() ; // [6] ----- web.xml
init_AliasStandardObjects() ; // [7] ---- Bean加载