目录
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的计算结果向用户提供相应的响应
② 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包
2)default.properties
struts2中default.properties文件中存放了大量的key-value信息,这些信息主要是配置struts2中的详细的配置信息,其中修改这个文件的值,在struts.xml配置文件中,即使用
其中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'属性:该属性值可以任意取名,但必须唯一。其与 Java 的类包间无对应关系。若其他包要继承该包,则必须通过该属性进行引用。
'namespace'属性:包的 namespace 属性用于定义该包的命名空间。命名空间是访问该包下 Action 的路径的一部分。此属性是必须的,且不能为空值。但命名空间可以为“/”。
'extends'属性:通常情况下,包需要继承 struts-default 包。因为 Struts2 的 11 个返回类型、35 个拦截器、默认拦截器栈等 Struts2 的主要功能,都定义在这个包中。继承了这个包,也就拥有了这些功能。
'abstract'属性:包还可以通过 abstract=“true”定义为抽象包。抽象包中是不能包含 Action 的。抽象包一般就是用于被继承的。
②.配置
‘name’属性:在 struts2 中,访问 struts2 中的 action 的 URL 路径由两部份组成:包的命名空间+action的 name 属性值。
‘method’属性:该属性用于指定所要执行的 Action 类的哪个 Action 方法 。若没有指定该属性值,则默认值为“execute”,即执行指定 Action 类的 execute 方法
‘class’属性:class 属性用于指定该 Action 所要执行的 Action 类。
③.配置
‘name’属性:result 标签用于指定 Action 执行完毕后所要转向的视图资源。其值用于Action类的execute()方法的返回值进行比较,在来决定跳转到哪个视图
‘type’属性:Struts2 中共提供了 11 种视图转向类型,类型由 result 标签的 type 属性指定。
④.其他的标签
更多的标签信息看: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()方法。也就是说它可以向栈一样进行入栈,出栈等操作。