MVC模式
Struts1实现MVC
Struts的体系结构包括模型,视图和控制器三部分。下面我们就从MVC角度来分析Struts的体系结构。
1.模型(Model)在Struts体系结构中,模型主要由JavaBean或EJB构成。模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。
2.视图(View)
视图主要由一组JSP文件构成,在视图中不存在业务逻辑与模型信息,只包含有标签。
3.控制器(Controller)
在Struts中,基本的控制器组件是ActionServlet类中的实例Servlet,实际使用的Servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。
Struts 1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts 1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。ActionForm必须实现ActionForm的基类,设计上并不是真正的POJO
ActionForward就是一个逻辑视图,通过在配置文件中定义ActionFoward的映射,完成逻辑视图名和实际视图资源之间的映射
struts1的缺陷:
(1).只支持JSP作为表现层技术,不能与Velocity,FreeMarker等技术整合
(2).与Servlet API严重耦合,难于测试
一个exute有四个参数ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化困难.
(3).侵入式设计,严重依赖于Struts1API,如如ActionMapping、ActionForm和ActionForward类.一旦系统需要重构时,这些类完全没有利用价值,导致较低的代码复用.
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度上来讲,Struts2没有继承Struts 1的血统,而是继承WebWork的血统。或者说,WebWork衍生出了Struts2,而不是Struts 1衍生了Struts2。
Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性、性能等各方面都有很好的保证:而且吸收了Struts 1和WebWork两者的优势。在经历了几年的各自发展后,WebWork和Struts社区决定合二为一,也即是Struts 2优雅的请求参数封装灵活的视图技术丰富的表达式语言机动,灵活,简单的配置线程安全的控制器(Action)霸气的插件
基于Struts2创建一个简单登录项目。导入struts核心支持包在web.xml中配置FilterDispatcher开发DAO开发action编写前台显示页面创建struts.xmlStruts 2的核心Filter配置的web.xml配置文件的代码:
<filter>
<!-- 定义核心Filter的名字 -->
<filter-name>struts2</filter-name>
<!-- 定义核心Filter的实现类 -->
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
控制器
Struts2有两个重要的控制器:StrutsPrepareAndExecuteFilter: 核心控制器,负责接收所有请求Action: 负责处理单个特定请求Action是一个普通的类, 不需要实现任何接口或继承任何类.
public class SimpleAction {
public String execute() throws Exception{
return "to-index";
}
}
说明:
无需实现任何接口或继承任何类,但有时为了简化某些功能必须继承ActionSupport类execute()方法会被自动调用,该方法用于处理用户请求,返回类型为String,是跳转路径的逻辑名称.向上抛出Exception表示能够处理所有异常.“to-index”是跳转路径的逻辑名称.Action必须配置在struts.xml文件中,该文件默认放在classpath下.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="MyStruts2" extends="struts-default">
<action name="hello" class="com.fit.struts2.HelloWorld">
<result name="error">/error.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
struts.xml配置说明package:用于组织Action的一个逻辑概念,必须通过extends继承自struts-default包, struts-default包在struts-default.xml文件中定义,该文件配置了很多有用的功能.action: 所有的Action都必须通过action标签配置name: 访问action 逻辑名称class: Action类的全限定名result子标签: 定义跳转路径, execute()方法的返回值在此定义.默认情况下为转发,如果是重定向,必须按下面的格式:<result type="redirect" name="xx">/xx.jsp</result>simple.action是访问Action的实际路径.格式:action的逻辑名称+后缀后缀的默认名称为:action在struts.properties文件中可以配置后缀,如下:struts.action.extension=actionStruts版本比较在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。— 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全,Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。— Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,。Struts 2 Action不再依赖于Servlet API。— 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language)— 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。— 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。— Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理。Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。