1,struts1的mvc实现:
Struts1是世界上最古老的mvc框架,出现于2001年。由ActionServlet作为核心API。
Struts1使用ActionForm接受请求参数。
2,WebWork
WebWork以ServletDispatcher为核心。使用ServletDispatcher处理用户的所有请求,它是整个WebWork框架的核心控制器。
WebWork的Action与Struts2类似,都可以继承基类ActionSupport,以便于实现一些功能。WebWork的Action就是一个普通的POJO。
WebWork以xwork.xml为配置文件。在配置xwork.xml之前,要先在web.xml中配置核心控制器ServletDispatcher(与struts2的核心Filter类似)。
配置如下:
配置后,web应用会自动加载webwork框架。并加载WEB-INF/classes下的xwork.xml文件
Xwork.xml配置文件配置:
实际上webwork可以包含两个配置文件,还有一个webwork.properties配置文件,这个文件是标准的属性文件,有一系列的key/value组成,通常配置一些常量,与struts2的struts.properties类似。以下是webwork.properties文件的配置示例:
Webwork同样也支持通过在Action的同一目录下放校验文件进行校验,这些都与struts2非常类似。
3,struts2的三大组成部分:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。这三个组件里,struts2提供了核心控制器FilterDispatcher,用户需要实现业务控制器和业务逻辑组件。
4,FilterDispatcher:运行在WEB应用中,拦截所有的用户请求,如果用户请求以action结尾,该请求将被转入struts2框架处理。获取*.action后,根据前面*的部分确定使用哪个业务逻辑组件。
Struts2的Action都被定义在struts.xml中。
5,struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理,因为用户实现的业务控制器没有与Servlet API耦合,显然无法处理用户请求。
Struts2通过拦截器将用户的请求参数解析出来,传入到Action中,并回调Action的execute方法处理用户的请求。这时AOP面向切面编程思想的体现。
我理解的Struts2 AOP模型:可以将Action AOP整体看成一个类,其实类似于环绕增强,拦截器就是增强的方法。类似于InvocationHandler中的invoke方法,invoke方法可以在目标方法的前后实现增强功能。这里的Action的业务逻辑方法就相当于目标类的需要实现增强的方法,拦截器就相当于环绕增强的代码。
6,JavaEE里的模型组件,通常是指系统的业务逻辑组件。
7,struts2改变了struts1只能使用JSP作为视图组件的现状,struts2可以使用模板技术,如FreeMarker,Velocity作为视图技术。
Action返回的仅仅是视图名称,并未与视图技术产生关联,需要在struts.xml中配置result来与视图技术产生关联。如果不指定type属性,则默认使用JSP视图资源。
如果需要使用其他视图技术,可以在配置result时指定响应的type属性,例如:如果使用FreeMarker,则指定type为freemarker的type属性。
8,struts2框架的运行流程非常类似于webwork的运行流程。Struts2其实就是webwork2.2的升级版。
9,给struts2配置核心控制器,在web.xml中配置。
可以为filter配置初始化参数。通过<init-param>指定。有特殊意义的三个初始化参数:
l Config:是一个以英文逗号隔开的字符串,每个字符串都是一个xml配置文件的位置,struts2框架将自动加载指定的配置文件。
l actionPackage:是一个以英文逗号隔开的字符串,每个字符串都是一个包空间,struts2将扫描这些包空间下的Action类。
l configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号隔开。
也可以通过这个<init-param>指定struts2常量。
10,如果servlet是2.3以前的规范,则web应用不会自动加载struts2框架的标签文件,因此必须在web.xml中手动配置加载struts2标签库。
通过<taglib-location>定义了struts2标签库配置文件的物理位置,因此必须手动复制struts2的标签库定义文件,复制到web应用的WEB-INF目录下。
11,struts.xml的配置一旦多起来,就不容易管理,最好将其分开管理,可以设置一个中心配置文件,在中心配置文件中导入从配置文件,通过<include>标签可以完成。
12,struts-default.xml文件中的定义。
定义了默认包空间:struts-default.
定义引用的默认拦截器栈:defaultStack.
13,struts2框架提供了一种类似Eclipse的扩展方式,允许用可插拔的方式来安装插件。例如spring插件,提供了一个类似struts2-xxx-plugin.jar的文件,这个文件就是插件安装文件。只要将该文件放在WEB-INF的lib目录下,struts2框架将会自动加载该框架。
由此可知,如果我们要开发自己的struts2插件,只需要将开发的插件放到命名为struts2-xxx-plugin.jar的jar包中,将这个jar包放到WEB-INF/lib下即可。Struts2框架就会自动去加载这个插件。
14,在struts.properties中可以定义一些struts2的常量属性,但一般我们在struts.xml中定义即可,通过<constant>标签即可实现。示例:
15,struts.xml文档结构:
16,strtus.xml的dtd约束: