SSH框架学习(一)--Struts2

目录

    1.总述

    2.原理

    3.配置文件

    4.OGNL与值栈

    5.拦截器

    6.类型转换器

 

1.总述

    1)什么是框架

        计算机的框架和建筑学的框架概念很相似,设计好整体,大的结构,内部细节取决你做什么。比如说:你想开商铺,则可以进行商铺的装修,修改它的内部细节,这样你需要依赖于它的房间的设计,进行设计家具的大小,或者其摆放的位置

        所以说,框架是一整个系统可重用设计构件,它规定了应用的体系结构,阐明了整个系统设计、协作构件之间的依赖关系、负责分配和控制流程。变现为一组抽象类以及其实例之间协作的方法、它为构件复用提供了上下文关系

        简单说,框架就是我们对某一个具体应用的整体设计结构,其里面的子构件应与整体设计相匹配,具有依赖关系。也即我们真正操作的目标

    2)struts2

        struts2是一个基于MVC设计模式设计的Web应用框架。它本质上是一个Servlet,在MVC设计模式中,struts2作为控制器(Controller)来建立模型与视图关系。struts2以WebWork为核心,采用拦截器的机制来处理用户的请求。

    3)MVC设计模式与三层架构的关系

        ① MVC设计模式:

            Model:模型,承载数据与数据库打交道,并对用户提交请求进行计算的模块。其分为两类,一类称为数据承载Bean,一类称为业务处理Bean。所谓数据承载Bean是指实体类,专门用来承载业务数据。而业务处理Bean专门用于处理用户提交的请求

            View:视图,为用户提供可视化界面,即前端内容。与用户直接进行交互

            Controller:控制器,用于将用户请求转发给相应的Model进行处理(可以是提交存储数据请求,也可是获取数据库请),并根据Model的计算结果向用户提供相应的响应

                                 SSH框架学习(一)--Struts2_第1张图片

           MVC的工作流程

               用户通过View视图向服务器提出请求,可以是表单请求,超链接请求,客户端请求等。

               服务器端的Controller控制器接受到请求后,首先解析请求。根据请求然后找到相应的Model对用户的请求进行处理

               经Model处理后,在将结果返回给Controller

               Controller在接收到处理结果后,根据处理结果找到要发回给服务器的View视图。

           三层架构

              User Interface Layer 界面层(UIL):主要对客户的请求接受,以及请求数据的返回。即界面的显示

              Business Logic Layew 业务逻辑层(BLL):主要负责对数据层的操作,进行数据的传递。

              Data Access Layer 数据访问层(DAL):直接对数据库操作

           ④ 三层架构与MVC之间的关系

              简单来说,使用三层架构或者MVC其主要目的都是为了解除不同层级间的耦合度。正因为耦合度降低,各个层级可以实施同时工作。并且对于整个项目是易于维护。

              三层架构中UI层对应MVC中V和C,为什么?UI层做了视图的显示和数据接受和返回这和MVC中View和Controller是一致的

              而MVC中Model进行数据的计算,和访问数据库等等内容。因此和三层架构中BLL和DAL做的功能是一致的。因此他们之间的关系可以用下面一张图表示

                       

 

    4)struts2位于三层架构中的位置      

           struts2作为三层架构中UI层出现,主要作用对客户请求的解析,和请求参数的传递。并根据BLL层和DAL层的返回结果到客户页面视图中

                                         这里写图片描述 


 

2.struts2原理

    1)思路

           在传统的jsp+serlvet中。通过页面发送请求,从web.xml中找到请求的servlet,在从这个servlet跳转到其他页面。

          但struts2使用filter对请求过滤,也就是说,在核心的filter中我们需要获取请求的所用信息,并且能关联到能响应请求的POJO类中。也就是说,我们要创建一个Map映射,在这个映射中'key'为所关联的请求,'value'为能响应请求的在通过POJO类。POJO类返回值返回所关联的页面,在通过使用重定向或者请求转发跳转到请求的的页面。

    2)思路的具体实现

          在struts2中这个filter叫做“StrutsPrepareAndExecuteFilter”或者“FilterDispatcher”前者是2.1.3版本后所使用的核心filter。后者则是2.1.3前使用的核心过滤器

          在struts2中POJO类为Action类,Action类被ActionMapper管理。

    3)实现流程

这里写图片描述

          ①.客户端发送请求到Tomcat服务器中个Servlet容器中。

          ②.Tomcat服务器根据请求比如说welcome.action请求,生成HttpServletRequest对象。此时Tomcat服务器到Web.xml中找是否含有welcome字段的servlet或者filter。但只是找到struts2,此时只能通过“StrutsPrepareAndExecuteFilter”过滤器进行处理请求。

          ③.此时tomcat服务器获取“StrutsPrepareAndExecuteFilter”实例,并将请求转发到ActionMapper中。

          ④.如果请求的welcome在ActionMapper中存在映射关系,此时ActionMapper在请求转发到StrutsPrepareAndExeuteFilter中,然后建立一个ActionProxy实例,并将请求转发到ActionProxy实例中,这个实例将代理Action类

        ⑤.当获取到ActionProxy实例后,由于只有从StrutsPrepareAndExeuteFilter中获取的请求Action类,所以此时他要从Configuration Manager中找到这个Action类是否存在

      ⑥.ConfigurationManager配置管理器将读取struts.xml文件,从中找是否含有请求的Action类。(在服务器启动的时候,ConfigurationManager就会把struts.xml中的所有信息读到内存里,并缓存。当ActionProxy带着url向他询问要运行哪个Action的时候,就可以直接找到是否含有)

          ⑦.当从ConfigurationMapper中找到了具体的Action类之后,ActionProxy带着Action和其中的interceptor stack以及所有可能的reslut信息传递给ActionInvocation对象中。ActionInvocation对象描述了整个Action运行的整个过程。

          ⑧.ActionInvocation对象根据ActionProxy所携带的信息,首先调用interceptor stack中的拦截器,struts2默认运行20个拦截器,然后进入到Action中的execute()方法中,获取Action类的execute()方法的返回值。随后匹配struts.xml中reslut标签的名字,跳转到jsp,或者另外一个Action类中。

        ⑨.此时生成了页面,但并没有给予客户端响应。当ActionInvocation从result标签返回后,倒序执行拦截器。并生成HttpServletResponse对象在次倒序执行StrutsPrepareAndExeuteFilter过滤器,把结果返回给客户端。

 


3.配置文件

    1)struts-default.xml

          struts-default.xml位于struts2-core核心包下,这个配置文件是struts2框架的基础配置,由框架自动加载。配置文件中定义了结果返回类型,拦截器,servlet转发和重定向以及默认的拦截器栈,每个包都应继承自struts-default包

          SSH框架学习(一)--Struts2_第2张图片

         SSH框架学习(一)--Struts2_第3张图片

               SSH框架学习(一)--Struts2_第4张图片

    2)default.properties

          struts2中default.properties文件中存放了大量的key-value信息,这些信息主要是配置struts2中的详细的配置信息,其中修改这个文件的值,在struts.xml配置文件中,即使用修改。其中name为配置信息名字,value为具体的值。

          其中defaut.properties查看https://blog.csdn.net/wzx735481897/article/details/72814521有具体说明

    3)struts.xml

         struts.xml是我们sturts2的核心配置文件,由我们自己书写。里面存放了响应请求的POJO类即Action类,上文已经说明struts2.xml文件由ConfigurationMapper对象读取,并把里面的Action类的信息,InterceptorStack,Result信息返回给ActionProxy对象,并传递给ActionInvocation对象,有该对象调用。

         struts.xml文件首先开头必须写明它的文档类型定义文件的位置,这样我们才能使用struts2的标签。下面是基本标签的说明

         ①.配置标签,里面含有'name','namespace','extends','abstract'属性。

                  'name'属性:该属性值可以任意取名,但必须唯一。其与 Java 的类包间无对应关系。若其他包要继承该包,则必须通过该属性进行引用。

                  'namespace'属性:包的 namespace 属性用于定义该包的命名空间。命名空间是访问该包下 Action 的路径的一部分。此属性是必须的,且不能为空值。但命名空间可以为“/”。

                  'extends'属性:通常情况下,包需要继承 struts-default 包。因为 Struts2 的 11 个返回类型、35 个拦截器、默认拦截器栈等 Struts2 的主要功能,都定义在这个包中。继承了这个包,也就拥有了这些功能。

                  'abstract'属性:包还可以通过 abstract=“true”定义为抽象包。抽象包中是不能包含 Action 的。抽象包一般就是用于被继承的。

         ②.配置标签:标签是的标签里面含有‘name’,‘method’,‘class’等属性

                  ‘name’属性:在 struts2 中,访问 struts2 中的 action 的 URL 路径由两部份组成:包的命名空间+action的 name 属性值。

                  ‘method’属性:该属性用于指定所要执行的 Action 类的哪个 Action 方法 。若没有指定该属性值,则默认值为“execute”,即执行指定 Action 类的 execute 方法

                  ‘class’属性:class 属性用于指定该 Action 所要执行的 Action 类。

         ③.配置标签:标签是的子标签,其里面含有‘name’,‘type’属性

                  ‘name’属性:result 标签用于指定 Action 执行完毕后所要转向的视图资源。其值用于Action类的execute()方法的返回值进行比较,在来决定跳转到哪个视图

                  ‘type’属性:Struts2 中共提供了 11 种视图转向类型,类型由 result 标签的 type 属性指定。

         ④.其他的标签

                  常量标签,为下,器里面有两个属性,‘name’,‘value’ 其主要是设置default.properties配置文件里的信息

                  更多的标签信息看:https://www.cnblogs.com/chenv/p/6180721.html


4.OGNL与值栈

    1)概念

        ①.OGNL(Object-Graph Navigation Language,对象图导航语句)是一种表达式语言,放在Jsp页面中使用,OGNL中具有上文下Map的概念,即Context,用于存放数据。这个Map主要是用于处理OGNL表达式,里面存放了很多JaveBean对象。它具有根对象和非根对象两类不同的操作。其中根对象可以直接访问,而非根对象不能直接访问,需要加#符号才能进行访问。在struts2中这个Map被叫做ActionContext。

                比如在Jsp页面中也这么一个表达式:#session.msg。它可以被解析成:ActionContext.getContext().getSession().getAttribute("msg");这么一个语句。其中session为这个Map(ActionContext)中的一个对象,它是一个非根对象。

        ②.值栈(ValueStack)在struts2中做为OGNLMap中根对象,它本质上一个ArrayList。被用做成栈操作,在源码中ValueStack含有peek()方法,pop()方法,push()方法。也就是说它可以向栈一样进行入栈,出栈等操作。

 

你可能感兴趣的:(SSH框架学习(一)--Struts2)