Struts2提供了基于MVC应用程序的开发模式,从而使应用程序结构更加清晰,同时也简化了Web应用程序的开发。

Struts2的组成结构


主要包括控制器组件(包括核心控制器StrutsPrepareAndExecuteFilter、业务控制器Action)、模型组件(包括业务逻辑组件和数据库访问组件)和视图组件。

  • 模型组件:实现业务逻辑的模块,由JavaBean或EJB构成。
  • 视图组件:主要有HTML、JSP和Struts2标签等视图技术。
  • 控制器组件:控制器组件主要由核心控制器和业务控制器Action组成。

Struts2框架结构


  1. StrutsPrepareAndExecuteFilter是整个Struts2的核心控制器,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,就执行Action处理,并停止过滤器链上还没有执行的过滤器。
  2. ActionMapper提供了HTTP请求与Action执行之间的映射,即ActionMapper判断请求是否应该被Struts处理。若需要Struts2处理,ActionMapper返回一个对象来描述请求对应的ActionInvocation的信息。(注意不是返回ActionInvocation的对象)
  3. ActionProxy是一个特别的中间层,位于Action和xwork之间,可以根据需求引入更多的实现方式,比如通过WebService来实现等。
  4. ConfigurationManager是xwork配置的管理中心,可以理解为struts.xml配置文件在内存中的对应。
  5. struts.xml是Struts2的应用配置文件,负责URL与Action之间映射的配置,以及执行后页面跳转的Result配置等。
  6. ActionInvocation:调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。
  7. Interceptor(拦截器):自动拦截Action,提供了在Action运行之前或Result运行之后可能需要执行的某功能代码。类似javax.servlet.Filter。
  8. Action:是Struts2中的动作执行单元(执行类),用来处理用户请求,并封装业务所需要的数据。
  9. Result:是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如JSP、FreeMarker等。
  10. Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
  11. TagSubsystem:Struts2的标签库,它抽象了3种不同的视图技术:JSP、velocity和freemarker,可以在不同的视图技术中直接使用这些标签。

工作流程


Struts2框架的核心控制器负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。Struts2对用户的每一次请求都会创建一个Action并运行,根据其运行返回的值,按Result配置信息,跳转到新的服务(进入视图或Action)。

具体流程:

  1. 客户发送请求给StrutsPrepareAndExecuteFilter。
  2. StrutsPrepareAndExecuteFilter询问ActionMapper,该请求是否是一个Struts2请求(即是否返回一个非空的ActionMapping对象)。
  3. 若ActionMapper认为该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求交给ActionProxy处理。
  4. ActionProxy通过Configuration Manager询问框架的配置文件,确定需要调用的Action类及Action方法。
  5. ActionProxy创建一个ActionInvocation的实例,并进行初始化。
  6. ActionInvocation实例在调用Action的过程前后,涉及相关拦截器(Interceptor)的调用。
  7. Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。调用结果的execute()方法(或配置指定的方法),渲染结果。
  8. 执行各个拦截器Invocation.invoke()之后的代码。
  9. 把结果发送到客户端。

在开发基于Struts2的Web应用程序,开发者主要的任务就是设计Action、在配置文件内配置Action信息,以及编写视图的工作。

必须的配置信息


1)在配置文件web.xml中配置Struts2的启动信息

Struts2通过StrutsPrepareAndExecuteFilter过滤器来启动,即需要在web.xml文件中添加Struts2的启动配置信息。

<!--定义Struts2的核心控制器Filter-->
<!--这里是用过滤器作为控制器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsAndexecuteFilter
</filter-class>
</filter> <!--配置Struts2可以处理的Action请求-->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2)在当前Web应用的classpath下添加struts2的配置文件struts.xml。

<?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>
<!--各种配置信息-->
</struts>

struts2.xml配置举例:

<struts>
<package name="default" namespace="/" extends="struts-default">
<!--opadd是配置调用Action方法executeAdd的名称-->
<action name="opadd" class="com.action.AddAction" method="executeAdd">
<!--根据方法executeAdd()的返回值,确定所要转向的页面-->
<result name="+">positive.jsp</result>
<result name="-">negative.jsp</result>
</action>
</package>
</struts>

struts2的配置


1)web.xml配置文件

在使用Struts2框架时,必须在web.xml中配置支持Struts2的主控制器。目前所使用的主控制器是StrutsPrepareAndExecuteFilter类,主要负责接收所有请求,并按规定的过滤器要求执行相应的请求,在web.xml配置文件中配置,系统启动时,自动创建该控制器。

2)struts-default.xml配置文件

struts-default.xml配置文件是Struts2框架默认加载的配置文件,该文件存放在struts2-core.jar中,可以从中查找Struts2默认的各种配置信息。

该配置文件提供了一些标准的核心配置,Struts2的很多核心功能都是通过拦截器来实现的,例如,从请求中把请求参数封装到Action、文件上传和数据验证等都是通过拦截器实现的。struts-deful.xmlt定义了这些拦截器和result类型。

Struts2每次启动都会自动加载struts-default.xml文件,需要在配置文件struts.xml中继承在struts-default.xml中配置的包struts-default即可。

3)struts.xml配置文件

struts.xml配置文件是Struts2默认的核心配置文件。Struts2应用的各个组件及其关系均在该文件中声明并配置。

主要配置有:常量配置、导入(包含)配置文件、包配置及包配置下的Action配置。

  1. 常量配置:在开发阶段或运行阶段,可以设置一些常量(属性)值,设置Struts2运行或者开发时的环境,从而满足需求。

    <!--指定应用的编码集,相当于调用HttpServletRequest.setCharacterEncoding方法-->
    <constant name="struts.il8n.encoding" value="UTF-8"/>
  2. 包配置:Struts2框架的核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器或拦截器引用的集合。在实际应用中,应该把一组业务功能相关的Action和拦截器放在同一个包下面。
    <package name="default" namespace="/" extends="struts-default">
    • name属性:配置包时必须指定name属性,该name属性值可以任意取名,但是必须唯一。如果其他包要继承该包,必须通过该属性进行引用。

    • namespace属性:包的namespace属性用于定义该包的命名空间,命名空间做为访问该包下Action的路径的一部分。默认命名空间为“/”(空字符串)。
    • extends属性:通常每个包都应该继承struts-default包,该包是在struts2-core.jar文件中的struts-default.xml中定义的,给出了Struts2框架的核心配置信息。
  3. Action配置:Struts2种Action类的配置能够让Struts2知道Action的存在,并可以通过调用该Action来处理用户请求。Struts2使用包来组织和管理Action。(Action类必须配置在“包”下,在一个“包”下可以配置多个Action)
    <action name="opadd" class="com.action.AddAction" method="executeAdd">
    <!--根据方法executeAdd()的返回值,确定所要转向的页面-->
    <result name="+">positive.jsp</result>
    <result name="-">negative.jsp</result>
    </action>

    <action>元素的常见属性:

  • name;指定客户端发送请求的地址映射名称,是必选项
  • class:指定Action对应的实现类,默认值为ActionSupport类
  • method:指定Action类中的处理方法名,默认值为Action中的execute方法

    <result>标签中的常见属性:

  • name:指定Action逻辑视图名称,默认值为success。
  • type:指定结果类型所定向的文件类型:JSP文件、Action类等,默认为JSP页面。

Struts2的控制层及Action设计与配置


开发基于Struts2的Web应用程序时,Action是程序的核心。

开发人员需要根据业务逻辑实现特定的Action类,并在struts.xml文件中配置Action。Action类中包含了对用户请求的处理逻辑,因此,也把Action称为Action业务控制器。

一般来说,每个Action类都有一个或多个方法来实现用户请求的处理,其中每个方法都会返回一个String类型的处理结果,该String值用于决定需要跳转(转向或重定向)到哪个视图的或者另一个Action。对于一个Action,需要传入值和传出值,即由请求传值给Action,Action处理加工后传值给视图(或另一个Action)。

  • 普通的Java类作为Action类与属性驱动传参。
  • 继承ActionSupport实现Action与属性驱动传参
  • 领域对象属性驱动的Action设计与属性传参
  • 模型驱动(Model-Driven)的Action类与模型驱动传参

无论使用什么方式,设计Action类都必须满足一下条件:

  1. Action类,每个属性都有setter/getter方法,必须具有无参构造方法;
  2. 该类除所必需的属性外,通常有一个execute()方法(或自定义方法),该方法无任何参数且返回字符串类型的值。
  3. JSP页面与Action参数传递:JSP页面中使用的输入域属性(name属性值、EL表达式中的属性名)必须与Action类定义中的属性名称相同。

(使用第3种的方式向Action中传值)

Action访问Web资源


在Struts2中,Action类和Web对象之间没有任何直接关系,但是Action作为业务逻辑控制器,经常要访问Web资源。

Struts2提供了ActionContext类与ServletActionContext类用于Action访问Web资源,并且ServletActionContext类直接继承了ActionContext类。

在Action中访问Web对象有4种方式:

  • 通过ServletActionContext直接访问Web对象——Servlet依赖容器方式;
  • 通过ActionContext访问——Map依赖容器方式;
  • 通过IoC访问Servlet对象——Map IoC方式;
  • 通过IoC访问Servlet对象——Servlet IoC方式。

Struts2框架视图与拦截器技术


Struts2框架专门提供了自己的标签库、OGNL表达式和国际化处理方式;

另外,Struts2框架的重要特定是采用拦截器技术实现对各类请求的拦截和过滤。

1)Struts2的拦截器

拦截器(Interceptor)是Struts2的核心组成部分。拦截器动态拦截Action调用的对象,它提供一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行前或者执行后运行,也可以在一个Action执行之前阻止Action执行。

拦截器分为两类:

  • Struts2提供的内建拦截器;
  • 用户自定义的拦截器。

1.自定义实现拦截器:

Struts2提供了Interceptor接口,以及对该接口实现的一个抽象拦截器类(AbstractInterceptor)。创建拦截器类可以实现Interceptor接口,也可以直接继承AbstractInterceptor类。

Struts2还提供了一个MethodFilterInterceptor类,该类是AbstractInterceptor类的子类,若要实现方法过滤,就需要继承MethodFilterInterceptor,设计方法拦截器。

拦截器创建之后,需要在Struts.xml中注册声明;并在Action的配置中引用该拦截器,还要引用系统默认的拦截器栈(因为一旦某个Action引用了自定义的拦截器,Struts2默认的拦截器就不会在起作用了)。

<package>

<interceptors>

<!--注册声明拦截器-->
<interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="test_interceptor" class="com.Action.Test_InterceptorAction"> <!--在Action中引入自定义拦截器-->
<interceptor-ref name="myInterceptor"/>
<!--在Action中引入默认拦截器栈-->
<interceptor-ref name="defaultStack"/> </action> </package>

Struts2框架原理的更多相关文章

  1. 谈谈springMVC和Strut2的理解

    关于struts2框架原理 执行流程 struts2框架的核心是一个过滤器,我们编写的action类都继承ActionSupport的接口(顶层是一个过滤器filter),用户发送请求,经过核心过滤器 ...

  2. 【一】SpringMVC框架原理

    springmvc基础知识 1.什么是springMVC 2.springMVC框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.springmvc入门程序 目的:对前端控制器 ...

  3. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  4. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  5. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  6. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  7. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  8. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  9. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

随机推荐

  1. GIT的初级使用

    安装git [root@localhost ~]# yum -y install git [root@localhost ~]# git --version git version 1.8.3.1 初 ...

  2. stc15f104w模拟串口使用

    stc15f104w单片机体积小,全8个引脚完全够一般的控制使用,最小系统也就是个电路滤波----加上一个47uf电容和一个103电容即可,但因为其是一个5V单片机,供电需要使用5V左右电源. 该款单 ...

  3. 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 虚 ...

  4. Too many connections

    在一次启动项目的过程中报了如下一个错误信息: [ERROR] [2019-03-20 13:14:43] com.alibaba.druid.pool.DruidDataSource.init(629 ...

  5. [学习笔记]利用e-debug和GetWindowTextA破解CM课件

    本课是针对注册时候的报错弹窗不是信息框MessageBox,而是窗体的情况 首先打开课件看一下 既然课件是个易语言程序,那使用E-DEBUG试试 E-DEBUG打开课件,点击“start”,课件弹出登 ...

  6. android用OkHttp和okio包通信的坑--气死我了

    今天新建了个项目,想要用用okhttp包来实现Android和tomcat的通信, 于是就根据记忆,把以前可以用的代码复制过来了,然后呢,出现这个.... 图有点大,不知到怎么调小 很莫名其妙,我看了 ...

  7. 第二次作业:分布式版本控制系统Git的安装与使用

    本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 第一个git仓库地址:https://github.com/ ...

  8. 开发-封闭原则(OCP)

    1.什么是“开放-封闭” 随着软件系统规模的不断增大,软件系统的维护和修改的复杂性不断提高,这种困境促使法国工程院士Bertrand Meyer在1998年提出了“开放-封闭”(Open-Close ...

  9. jdk中的简单并发,需要掌握

    前言 开心一刻 小时候有一次爸爸带我去偷村头别人家的梨子,我上树摘,爸爸在下面放风,正摘着主人来了,爸爸指着我破口大骂:臭小子,赶紧给我滚下来,敢偷吃别人家梨子,看我不打死你.主人家赶紧说:没事没事, ...

  10. cobbler单台服务器实现批量自动化安装不同版本系统-技术流ken

    前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...