笔记目录 


  1. 概述

  2. 学习思路布局

  3. 基本的MVC框架

  4. Struts2的主要特征

  5. Struts2的MVC结构 和Struts2的具体运行流程

  6. Struts2的核心组件






概述

      Struts2是一个用于创建企业级Java Web应用的优雅的、可扩展的MVC框架(了解即可)。

     【欢迎大家针对我的笔记提出修改意见!】



学习思路布局:

      一、设计Struts2的初衷: 简化整个开发周期,从创建到部署,再到后面整个过程中对应用的维护。

      二、Struts2是一个MVC框架(Struts2、SpringMVC都属于MVC框架,单纯的Spring不仅仅是MVC框架,Hibernate、MyBatis是ORM框架),知道这点后就应当在学习Struts2的过程中在内心问自己:这部分知识属于M还是V还是C?

      三、Struts2核心是WebWork2(想继续深入研究Struts2,就研究WebWork2)。

      四、预备知识:1、Java编程语言;

                    2、对MVC框架、JSP或Servlet的基本了解。

      五、笔记策略:先一览Struts2的全貌,了解大致的运行过程,再深入了解细节。

***知识结构躯干(请联想树干):struts2的目的是简化,MVC才是其灵魂所在(信息躯干地位,就如同我们可以将SQL知识分为四层:数据库、表、列、记录值,所有的知识基本上都是围绕这四层展开的)。



   这里引入MVC框架的介绍有两个目的:其一,介绍MVC框架(要掌握);其二,在后面将Struts2(这一MVC)框架与传统的MVC框架进行对比。

    基本的MVC框架

    MVC是一种用于开发Web应用的软件设计模式,包含以下三层:

    1M(Model):该模式的底层就是M层,用于维护数据。(M层是一个POJO类,该类和数据库中的表相     对应,该类生成的对象和数据库表的一行记录也就是元组相对应,只有getXxx方法和setXxx方法)

    2V(View):负责呈现全部或者部分数据给用户。

    3、C(Controller):用于控制M层和V层之间的互动的软件代码。

       MVC之所以流行,是因为它使应用逻辑和用户界面层独立开来,并且支持关注点(concerns)的分     离。在MVC中,C层接收用户对应用的所有请求,并协同M层为V层准备要显示的数据。V层利用C层准     备好的数据来生成一个可视化的响应。

    MVC设计模式的抽象图如下:

                                struts-mvc.jpg

    M层:负责管理应用的数据,它响应来自V的请求,也响应来自C的命令并更新自己。

    V层:数据的特定格式的呈现,由C的决定(说白了C层就是进行判断控制)来呈现数据。它们是基于模板系统如JSP、ASP或PHP的脚本,并且容易和AJAX技术进行整合

    C层负责响应用户的输入,和数据模型对象(就是M生成的对象,比如“一个用户的注册信息”就是“用户类”这个“数据模型”生成的“对象”)进行交互。它接收用户输入,验证用户输入,然后实现更改数据模型状态的业务操作。 


   


(有关本段笔记,看一遍即可,熟悉框架后可再复习)        

Struts2的十大特征(请联系其设计初衷:简化):

    1、POJO表单(forms)和POJO动作(actions):Struts2废除了Action Forms作为Struts 框架的必须的一部分的规定。在Struts2里你可以使用任何POJO来接收表单输入。类似的,你现在可以把任何POJO类看做一个Action类。

    2、标签支持:Struts2改善了表单标签,并且新的标签允许开发者写更少的代码。

    3、支持AJAX:Struts2承认了Web2.0技术的地位,并通过创造AJAX标签来支持AJAX技术,这些标签和标准的struts2标签很类似。

    4、容易整合:整合其他框架如Spring。

    5、模板支持:支持通过使用模板来生成V。

    6、插件支持:可以通过使用插件来增强和扩展Struts2的核心运行状况。Struts2有很多插件可以使用。

    7、程序分析信息:Struts2提供整合的程序分析信息来调试和剖析应用。此外,它也支持在内置调试工具的帮助下进行综合调试。

    8、容易修改标签:Struts2的标签标记可以通过使用Freemarker模板来进行微调。这不需要JSP或JAVA知识。基本的HTML、XML和CSS知识就足以用来修改标签。

    9、促进更少的配置:struts2通过使用各种设置的默认值来促进更少的配置。你不需要配置信息除非它偏离了Struts2设置的默认设置。

    10、视图技术:支持各种视图技术(JSP、Freemarker、Velocity和XSLT)。


环境配置:JDK、Tomcat、IDE




Struts2的MVC结构和Struts2的具体运行流程(认识Struts2的全貌)


 一、MVC结构:Struts2实现MVC的运行结构图:

    struts_2_architecture.gif

   

    Struts2和MVC的对比:Struts2和传统的MVC框架不同的是,Action扮演了M层的角色而不是C层(传统的没用框架的MVC中的Action也就是form表单中的Action,对应提交页面是servlet或JSP),尽管两者之间有重合(Action中如果带有execute()方法,则Action扮演了C的角色)。

   


    单从Struts 2角度:Struts 2运行的框架结构图

Struts2-Architecture.png

      

     Struts 2通过以下五大核心组件实现MVC模式:

     Actions

     Interceptors

     Value Stack/OGNL

     Results/Results Types

     View Technologies

     

     

   

    

    

    

    Action介绍

    关键词:映射  数据类型转换  Result

    Action是Struts2框架的核心,每一个URL都会被映射到一个具体的Action(URL是从V层,如一个登录界面发过来的,Action是M层,所以这种映射就是实现V层和M层的映射),这个具体的Action提供了服务来自客户端的Request的必要的处理逻辑(即处理方法,如execute)。


    Action提供了另外两个重要的功能:数据类型转换和决定哪一个视图作为响应返回给客户端。

    数据类型转换是指:来自Request的数据类型,转换成响应的那个视图的数据类型,也就是判断是JSP类型还是其他的Result Types。

    决定哪一个视图作为响应返回给客户端就是:Result是什么。和URL有映射关系的那个Action中有一个execute方法,方法里有一个选择条件语句——用以判断返回的视图是哪一个,execute方法执行完后会返回一个result。这个Result对应于struts.xml文件中的result元素,这个元素的值就就是要返回给客户端的视图。注意:Action中的方法有一个返回的结果(result),配置文件struts.xml有一个result标签。

    PS:这三个要点很集中。但需要把它们细分出来。

    

    

    

    Interceptors介绍:

    拦截器从概念上讲,就像Servlet过滤器或者JDK里的代理类(设计模式里有一个模式叫代理模式)。

    Interceptor可以独立于Action实现交叉功能。用Interceptor可以实现:

    Action调用前提供预处理逻辑;

    Action调用后提供后处理逻辑;

    捕捉异常从而实现交替处理。

    

    Struts2提供的许多特点都是由拦截器实现的:比如异常处理,文件上传,生命周期回收,验证器。Struts2的许多功能都基于拦截器,所以一个Action分配有7、8个拦截器是很常见的。

    Struts2提供了一系列配置好了的拆箱即可使用的拦截器,以下是其中一部分:

    alias

    checkbox

    conversionError

    creatSession

    debuggin

    execAndWait

    exception

    fileUpload

    ……

    

    拦截器的使用:只需将拦截器配置在struts.xml文件中的action元素下。

    

    

    

    Result Types介绍

    在Struts MVC框架中,struts.xml文件中的Result标签代表着V层。动作负责执行业务逻辑,之后便是使用Result标签展示V。Result标签是Action标签的子标签,对应着的是Action类有返回的result。

    result标签通常带有一些导航规则。比如用户登录有三种结果,1.登陆成功;2.登录失败——用户名或密码不正确;;3.账号锁定。这种情况下,Action的方法就会有三种可能的字符串输出,result有三种对应的值——也就是三种V,来实现响应。

    Result中我们不一定要用JSP类型的文件作为响应发送给客户端。MVC范式的目的是实现层与层之间的分离和高度可配置的。Result标签的默认Type是dipatcher,用来分发JSP页面,当然你也可以用其他的标记语言来作为result type。

    


    

     Value Stack值栈介绍:

     值栈,是一些对象构成的集合,它按照以下顺序保存了以下对象:

     1、临时对象。页面执行期间会有很多临时的对象。比如通过JSP标签循环的集合的当前迭代值。

     2、模型对象。如果你在Struts2中使用模型对象Model Objects,action出现在值栈之前模型对象就会被放置在这里。

     3、Action对象。就是正在被执行的当前的action对象。

     4、指定的对象。比如#application,#session,#request,#attr和与servlet scope相应的#parameters。

 

     如第二张图所示:可以通过提供给JSP、Velocity、FreeMarker的标签来set值栈。而Action可以通过get方法来获取值栈对象。值栈提供了一些方法来操作值栈对象。


     OGNL对象图形导航语言介绍:

     这种强大的表达语言用于引用和操作值栈里的数据。它还可以帮助数据传输类型转换

     OGNL和JSP的EL很相似。OGNL基于上下文有一个根或者一个默认对象的思想。根对象的属性可以通过#这个标记符号来引用。


     struts2为OGNL的使用建立了一张ActionContext图,这张ActionContext图包括以下部分:

     application:application范围内的变量

     session: session范围内的对象

     root/value stack: 所有的action对象的变量都存储在这里

     request: request范围内地变量

     parameters:request参数

     attributes:属性存储在page、request、session和application范围内。


     理解action对象始终在value stack中这一点是很重要的。所以,如果你的action对象有属性x、y,那么它们就准备好可以被你使用了。

    ActionContext里的对象可以通过#标记符号来访问,而值栈中的对象可以直接访问。

    OGNL同样支持处理集合——Map,Set,List。