struts2框架

struts2

1.简单介绍一下struts2

	Struts2 框架是一个按照 MVC 设计模式设计的 WEB 层框架,是在 struts 1 和 WebWork 的技术基础上进行
了合并的全新的框架。其全新的 Struts 2 的体系结构与 Struts 1 的体 系结构差别巨大。Struts 2 以 WebWork 为
核心,采用拦截器的机制来处理用户的请求, 这样的设计也使得业务逻辑控制器能够与 ServletAPI 完全脱离开。
我们可以把 struts2 理解为一个大大的 servlet,而这个 servlet 就是 ActionServlet。struts2 在处理客户端请求时,
会先读取 web.xml 配置文件,根据前端控制器将符合条件的请求 分给各个不同的 Action 处理。 在此之前,会把
ActionServlet 会把数据封装成一个 javaBean。
	Struts2 框架提供了许多的拦截器,在封装数据的过程中,我们可以对数据进行一些操 作,例如:数据校验等等。
当 Action 执行完后要返回一个结果视图,这个结果视图可以跟据 struts2 的配置文件中 配置,选择转发或者重定
向。

2.Struts2 的执行流程

关于图中的 Key:
	Servlet Filters:过滤器链,客户端的所有请求都要经过 Filter 链的处理。
	Struts Core:Struts2 的核心部分,但是 Struts2 已经帮我们做好了,我们不需要去做这
	个Interceptors,Struts2 的拦截器。Struts2 提供了很多默认的拦截器,可以完成日常开
发的绝大部分工作;而我	们自定义的拦截器,用来实现实际的客户业务需要的功能。
		User Created,由开发人员创建的,包括 struts.xml、Action、Template,这些是每个使
用 Struts2 来进行开发的人员都必须会的。
	 1. FilterDispatcher 是整个 Struts2 的调度中心,也就是 MVC 中的 C(控制中心),根
据 ActionMapper 的结果来决定是否处理请求,如果 ActionMapper 指出该 URL 应该被 Stru
ts2 处理,那么它将会执行 Action 处理,并停止过滤器链上还没有执行的过滤器。
	 3. ActionMapper 会判断这个请求是否应该被 Struts2 处理,如果需要 Struts2 处理,A 		 
ctionMapper 会返回一个对象来描述请求对应的 ActionInvocation 的信息。
	 3. ActionProxy,它会创建一个 ActionInvocation 实例,位于 Action 和 xwork 之间 ,使得
我们在将来有机会引入更多的实现方式,比如通过 WebService 来实现等。
	 4. ConfigurationManager 是 xwork 配置的管理中心,可以把它看做 struts.xml 这个配置
	文件在内存中的对应。
	 5. struts.xml,是开发人员必须光顾的地方。是 Stuts2 的应用配置文件,负责诸如 URL
与 Action 之间映射关系的配置、以及执行后页面跳转的 Result 配置等。
	 6.ActionInvocation:真正调用并执行 Action,它拥有一个 Action 实例和这个 Action 所
依赖的拦截器实例。ActionInvocation 会按照指定的顺序去执行这些拦截器、Action 以及
相应的 Result。Interceptor(拦截器):是 Struts2 的基石,类似于 JavaWeb 的 Filter,拦
截器是一些无状态的类,拦截器可以自动拦截 Action,它们给开发者提供了在 Action 运行
之前或 Result 运行之后来执行一些功能代码的机
	 7.Action:用来处理请求,封装数据。

Struts2 的官方文档附带了 Struts2 的架构图。从这张图可以很好的去理解 Struts2
struts2框架

3.Struts2 中 Action 配置的注意事项有

	1. name 包名称,在 struts2 的配置文件中,包名不能重复,name 并不是真正包名,只是为
了管理 Action
	2. namespace 和 <action>的 name 属性,决定 Action 的访问路径 (以/开始 ) 
	3. extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default 包 在 struts-default.
xml 中定义 )【可以使用包中默认的拦截器和结果集】

4.拦截器和过滤器有哪些区别

* 拦截器是基于 java 的反射机制的,而过滤器是基于函数回调
* 拦截器不依赖与 servlet 容器,而过滤器依赖与 servlet 容器
* 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用
* 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能
* 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一 次

5.Struts2 的封装方式有哪些

一、属性封装

1. 在 action 中设置成员变量,变量与表单中的 name 属性值
2. 生成变量的 set方法

二、模型驱动

1. action 实现 ModeDriven 接口
2. 在 action 里创建实体类对象
3. 实现接口的 getModel 方法并返回所创建的对象

三、表达式封装

1. 在 action 中声明实体类 
2. 生成实体类的 set 和 get 方法
3. 在表单输入项的 name 属性值里面写表

6.简单介绍一下 Struts2 的值栈

	值栈是对应每一个请求对象的数据存储中心。Struts2 的一个很重要的特点就是引入了值栈。
之前我们通过缓存或者模型驱动在 action 和页面之间传递数据,数据混乱,并且难以管理,
缓存还有时间和数量限制,使用起来非常的困难。值栈的引入解决了这个问题,它可以统一
管理页面和action 之间的数据,供 action、result、interceptor 等使用。我们大多数情况下不
需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据就可以了,大大的降低了开
发人员的工作量和逻辑复杂性。

7.SpringMVC 和 Struts2 的区别

	1、Struts2 是类级别的拦截, 一个类对应一个 request 上下文,SpringMVC 是方法级别的拦
截,一个方法对应一个request上下文,而方法	同时又跟一个url对应,所以说从架构本身上Spr
ingMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为 Struts2 中  Action 的一个
方法可以对应一个 url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所
属方法了。
	2、由上边原因,	SpringMVC 的方法之间基本上独立的,独享 request response 数
据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量,而
Struts2 搞的就比较乱,虽然方法之间也是独立的,但其所有 Action 变量是共享的,这不会影
响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个 Action
对象对应一个 request 上下文。
	  3、由于 Struts2 需要针对每个 request 进行封装,把 request
,session 等 servlet 生命周期的变量封装成一个 Map,供给每个 Action 使用,并保证线程安
 全 ,所以在原则上,是比较耗费内存的。
	  4、 拦截器实现机制上,Struts2 有以自己的 interceptor 机制,SpringMVC 用的是独立的 AO
P 方式,这样导致Struts2 的配置文件量还是比 SpringMVC 大。
	  5、SpringMVC 的入口是 servlet,而 Struts2 是 filter(这里要指出,filter 和 servlet 是不同的。
),这就导致了二者的机制不同,这里就牵涉到 servlet 和 filter 的区别了。
		6、SpringMVC 集成了 Ajax,使用非常方便,只需一个注解@ResponseBody 就可以实现,
然后直接返回响应文
本即可,而 Struts2 拦截器集成了 Ajax,在 Action 中处理时一般必须安装插件或者自己写代码集
成进去,使用起来也相对不方便。
	7、SpringMVC 验证支持 JSR303,处理起来相对更加灵活方便,而 Struts2 验证比较繁琐,感
觉太烦乱。
	8、Spring MVC 和 Spring 是无缝的。从这个项目的管理和安全上也比 Struts2 高(当然 Struts2
也可以通过不同的目录结构和相关配置做到 SpringMVC 一样的效果,但是需要 xml 配置的地方不少)。
	9、 设计思想上,Struts2 更加符合 OOP 的编程思想, SpringMVC 就比较谨慎,在 servlet 上扩展。
	10、SpringMVC 开发效率和性能高于 Struts2。
	11、SpringMVC 可以认为已经 100%零配置。

8.Struts2 中的 # 和 % 分别是做什么的

	(1)使用#获取 context 里面数据
<s:iterator value = “list” var=”user”>
<s:property value = “#user.username”>
</s:iterator>
	(2)向 request 域放值(获取 context 里面数据,写 ognl 时候,首先添加符号#context 的 key 名称.域对象名称)
	(3)在页面中使用 ognl 获取
<s:property value = “#request.req”>
(4)%在 struts2 标签中表单标签在 struts2 标签里面使用 ognl 表达式,如果直接在 struts2 表单标签里面使用 
ognl 表达式不识别,只	有%之后才会识别。
<s:textfield name=”username” value=”%{#request.req}

9.Struts2 中有哪些常用结果类型

1)dispatcher :默认的请求转发的结果类型,Action 转发给 JSP
2) chain :Action 转发到另一个 Action (同一次请求)
3) redirect : 重定向,重定向到一个路径信息,路径信息没有限制(不在一个请求中),Action 重定向到 JSP
4) redirectAction :Action 重定向到另一个 Action 
5)stream :将原始数据作为流传递回浏览器端,该结果类型对下载的内容和图片非常有用。
6)freemarker :呈现 freemarker 模板。
7)plaintext :返回普通文本内