Struts2

来源:互联网 发布:高薪网络销售招聘 编辑:程序博客网 时间:2024/05/02 00:49

 《Struts2权威技术指南》

***虽然Struts1提供了与tiles框架的整合,但支持的表现层技术非常单一:既不吃醋FreeMarker,velocity的模板技术,也不支持JasperReport等报表技术。

 

***Struts1的缺点:

a。支持表现层技术单一。

b。与Servlet API重耦合,难以测试。(如Action的excute()方法,HttpServletRequest等参数是Servlet API,严重依赖于web容器,一旦脱离了web服务器就难以测试。

c。代码严重依赖于Struts1 API,属于侵入式设计。(如自定义Action必须继承于基类Action,还有ActionMapping等类,一旦系统重构,这些Action就无利用价值,降低了代码的复用。

 

***Struts1的Action:

是单例模式并且必须是线程安全,因为仅有一个Action实例来处理所有请求;而Struts2Action对象为每个请求产生一个实例,因此没有线程安全问题。

 

***Struts2 的流程:

a。浏览器发送请求

b。核心控制器FilterDispatcher根据请求决定调用合适Action

c。webwork的拦截器链自动对请求应用通用功能。

d。回调Action的excute方法,该方法先获取用户请求参数,然后执行某种数据操作,即可以是将数据保存到数据库,也可以是从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户请求。

e。Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面,图像等。也支持velocity,FreeMarker等模板。

 

***Struts2 的Action的优点:

Action类完全是一个POJO,因此具有很好的代码复用性。

Action类无需与Servlet API耦合,因此进行单元测试非常简单。

Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可以映射到任何的视图,甚至是另一个Action

 

***Struts2的Action类中的成员属性并不一定用于封装用户请求参数,也可以是封装了Action需要传入给下一个JSP页面中显示的属性值,实际上,这些值将被封装在ValueStack对象中。

 

***推荐使用Struts2的校验框架,即基于Xwork的validator框架。

 

***FilterDispatcher

                |

            Action

                |

         业务逻辑

          |             |

DAO组件      领域对象(业务对象BO)

 

***如果web应用使用Servlet2.4以上的规范,则无需在web.xml文件中配置标签库定义,因为Servlet2.4规范会自动加载标签库定义文件。

 

***默认情况下,Struts2框架将自动加载放在WEB-INF/classes路径下的Struts.xml文件,为了提高配置文件的可读性,可将Struts.xml分解成多个配置文件,然后在Struts.xml文件中包含其他配置文件。

 

第四章:

***在Struts.xml文件中可定义Bean(一般不需要),一般有两个功能:

创建该Bean的实例,作为Struts2框架的核心组件使用

Bean包含的静态方法需要一个值注入

 

***推荐在Struts.xml中配置Struts常量(属性),而不是在web.xml或struts.properties中配置,尽管这样也行得通。

 

***Struts2的命名空间的作用类似于Struts1的模块configmodul的作用,它允许模块化的方式来组织Action,命名空间只有一个级别。

 

***拦截器的作用:

权限控制

跟踪日志

跟踪系统的性能瓶颈(通过记录每个Action的开始执行与结束时间取得耗时最长的Action)

 

***Action继承ActionSupport类,会大大简化Action的开发。

 

***Struts2提供了一个ActionContext类,通过它可以间接访问Servlet API(如request等);还提供了ServletContextAware等接口,让实现这些接口的Action也能够访问Servlet API;还提供ServletActionContext直接访问ServletAPI(直接耦合)

 

***注:即使在Action中获得HttpServletRespone对象,也不要尝试直接在Action中生成对客户端的输出。

 

***注:配置Struts2的Action元素的name属性等同于Struts1的path

 

***Struts1提供DispathAction允许一个Action中包含多个处理逻辑,Struts2用的是DMI动态方法调用,或通过定义逻辑Action(对应相同的类,不同的名)并为action元素指定method属性。

 

***对于简单的超级连接请求,不让其直接连接到某个具体资源,可以通过定义name为*的Action(该Action放在最后定义)或配置默认Action。

 

***模型驱动不仅用于封装请求参数还用于封装请求结果。

 

***模型驱动使用单独的VO(值对象的javaBean)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果。

 

***Struts2允许通过stuts.xml文件来配置异常处理,Struts2的异常处理需要启动一个拦截器,在默认配置文件中已经启动。

 

第五章:

***通常情况下将类型转换器注册成全局类型转换器,让该转换器对该类型的所有属性起作用。

 

***表现层数据涉及的两个处理;数据校验和类型转换。它们是紧密相关的,只有当数据完成了有效的类型转换之后,下一步才去做数据验证。

 

***Struts2提供的conversionError拦截器实际上是一个Throws处理(advice)

 

***Struts2提供的ActionSupport类为完成类型转换,错误处理,数据校验实现了许多基础工作。

 

***当类型转换出现异常时,conversion拦截器会处理该异常,将转换错误封装铖fieldError,并将其放在ActionContext中,让后转入名为input的逻辑视图。

 

第六章:

***Action中的属性:

除了可以封装http请求参数外,也可以封装Action的处理结果。不仅如此,Action的属性还可以在Struts2配置文件中进行配置,接收Struts2框架的注入,允许在配置文件中为该属性动态指定值。

 

***Struts2实现文件上传的编程关键,就是使用了3个属性来封装文件域,其中一个用于封装该文件的文件名,一个用于封装该文件的文件类型,一个用于封装该文件的文件内容。

 

***Sturts2中虽然可以手动实现文件过滤,但更容易的方法是Struts2提供了一个文件上传拦截器,通过配置该拦截器可以轻松地实现文件过滤。

 

***Struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。