struts2重新梳理---入门

 MVC模式

 

 

MVC是Model-View-Controller的简称,即模型-视图-控制器。
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

   虽然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
无需与Servlet API整合,更容易测试
优雅的请求参数封装
灵活的视图技术
丰富的表达式语言
机动,灵活,简单的配置
线程安全的控制器(Action)
霸气的插件
 
struts2框架结构
             Struts2内建了多个拦截器和拦截栈,将用户的web请求进行处理,从而提供了更加丰富的功能,如数据类型转换、国际化、文件上传等
 
struts2流程
 
一个请求在Struts2框架中的处理大概分为以下几个步骤:
客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
ActionProxy创建一个ActionInvocation的实例。
ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。
 
基于Struts2创建一个简单登录项目。
导入struts核心支持包
在web.xml中配置FilterDispatcher
开发DAO
开发action
编写前台显示页面
创建struts.xml

Struts 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是一个普通的类, 不需要实现任何接口或继承任何类.

 

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=action 
 
Struts版本比较
 
在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创建不同的生命周期。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章