Struts2struts2简介
struts2是apache组织的一个开源项目,是一个重量级web框架,由struts1和WebWork合并而成。
struts2对ServletAPI进行了全面的封装,提供了一整套自己的处理流程、处理方式和数据存取方式。在顶层设计
上和SpringMVC相似,但底层具体实现差别很大。
现今SpringMVC已经成为主流的web框架,struts2则由于学习成本高、性能相对较低等逐渐被淘汰。struts2结构:
StrutsPrepareAndExecuteFilter:struts2核心控制器,负责拦截请求、统一调用其他组件、按照固定步骤处理
请求、生成响应等
ActionInvocation:即action调用链,包含拦截器、action和ActionContext等
ParametersInterceptor:把请求参数取出来并进行类型转换后注入到action的字段上
ValidationInterceptor:进行数据校验
WorkflowInterceptor:如果有类型转换失败信息或数据校验失败信息,则跳过action直接返回input result
action:进行业务处理,根据执行结果返回不同的result

struts2处理流程:

struts.xml核心配置文件
根据需要可以在struts.xml中配置很多内容,如常量、包等。常量
常量用来指定struts2全局参数,使用<constant name="" value="">来配置,部分常量如下:
struts.i18n.encoding    默认:UTF-8  :指定处理post请求时的编码
struts.action.extension 默认:action :在核心过滤器拦截到请求后,只对具有指定后缀的请求使用action进
行处理
struts.objectFactory  :由谁创建action对象。在和Spring整合时需要指定为spring
struts.ui.theme 默认:xhtml :指定struts自定义标签的主题包
<package>用来把有关联的action分为一组,方便为此包下的action统一配置namespace、可用的拦截器、可用的
result种类等
namespace属性指定包的命名空间,也即是请求路径的前一部分,需要以斜线开头,如namespace="/user"。如果
没有指定此属性,则为默认命名空间"/"。
注意:struts2预先指定了/struts、/static等命名空间,用来在使用struts2标签时访问css等静态文件(在
struts2的jar包中),所以开发人员在指定自己的命名空间时不要使用/struts、/static
name属性指定包的名称,不可省略,继承父包时需要指定父包的name
extends属性指定继承的父包,一般继承struts2定义好的具有通用功能的父包struts-default
struts-default是struts2-core.jar中struts-default.xml定义好的一个通用的包,里面配置好了常用的拦截
器、常用的result种类等,开发人员自己定义的包应该继承此包action
在struts2中,处理请求的基本单位是action,action就相当于Servlet。开发人员除了声明action类外,还需要
配置URL-action映射、result-view映射等。action类
开发人员声明的action类应该继承struts2提供的ActionSupport父类(虽然不是必须的),因为该类已经实现了
多个有用的接口。
ActionSupport实现了Action、Validateable、ValidationAware、Serializable等接口,struts2提供的一些
功能特性需要这些接口。action的字段
在struts2的设计中,action的字段用来接收请求参数。struts2会使用拦截器把请求参数取出来,进行类型转换,
然后注入到action字段上。这就要求action对象的作用域是原型,即每次请求都要创建一个新的action对象,以
避免多线程安全问题。action的方法
action的方法主要有两方面作用:对数据进行校验和处理请求。一个请求要交给哪个action的哪个方法进行处理,
需要在URL-action(方法)映射中指定。
注意:URL=package_namespace+/+action_nameresult
处理请求的action方法的返回值类型需要是String,返回值称为result,不同的处理结果应该返回不同的result,
以便通过result-view映射让struts2生成不同的响应
<result>的name属性指定action方法的返回值
<result>的type属性指定result种类,默认为dispatcher,相当于
request.getRequestDispatcher().forward()。其他常用类型还有redirect,表示重定向,等
<result>标签体内容指定生成响应的view,可以是JSP页面,重定向时也可以是另一个action等
另外,action方法直接返回null表示开发人员已经使用ServletAPI自己生成了响应,struts2不再生成响应。action中访问ServletAPI
有两种方式在action中访问ServletAPI
1、使用ServletActionContext类的静态方法获得和当前请求相关的request、response等对象;
ServletActionContext.getRequest();
ServletActionContext.getResponse();
ServletActionContext.getServletContext();
2、通过实现特定接口,让struts2自动把需要的servlet对象注入到action中
org.apache.struts2.util.ServletContextAware
org.apache.struts2.interceptor.ServletRequestAware
org.apache.struts2.interceptor.ServletResponseAwarestruts2的数据存储、访问和展示
struts2对ServletAPI进行了完全的封装,提供了一套全新的数据存储、访问和展示方式
数据存放在ActionContext中,可以使用OGNL表达式取出数据,再使用struts2标签把数据展示出来数据访问——OGNL表达式语言
OGNL(Object Graph Navigation Language)——对象图导航语言,是一种独立的表达式语言,使用%{}表示一个表
达式,如%{1+2}。
由于JSP引擎不能识别OGNL表达式(可以识别EL表达式),所以需要配合使用struts2标签,把OGNL表达式写在标签
的属性值中,在执行时由struts2标签类调用OGNL引擎来计算OGNL表达式的值。struts2标签还负责把结果输出到
JSP页面。
除了具有表达式语言的一般功能外,因为struts2对ActionContext和OGNL进行了整合,所以在struts2中,OGNL
可以直接访问ActionContext中存储的各种数据。数据仓库——ActionContext
ActionContext是action的上下文对象,主要用来存储各种作用域的数据,和action一样每次请求都会创建一个新
的ActionContext对象。
ActionContext封装了一个Map,可以通过ActionContext.getContext().put(key,value)的方式存入键值对数
据,在JSP页面中可以使用OGNL表达式以%{#key}的方式访问value。
此外,ActionContext封装的Map中还预先存入了一下键值对数据:
key:parameters,value:Map  :包含了当前请求的请求参数
key:request,value:Map :封装了request域对象
key:session,value:Map :封装了session域对象
key:application,value:Map :封装了servletContext域对象
key:ValueStack,value:List :action对象默认对被放到栈顶,可以手动入栈和出栈
%{#parameters.xxx}:返回xxx请求参数的值
%{#request.xxx}:返回request域对象中xxx属性的值
%{xxx}:返回ValueStack中元素的xxx字段值,如果有多个元素,按照从上到下的顺序返回最先遇到的xxx字段值数据展示——struts2自定义标签
struts2提供的标签有两类:普通标签和UI标签普通标签
常用的普通标签有:<property>、<if>、<iterator>、<date>等
<if>和JSTL的<if>用法相同
<iterator>和JSTL的<forEach>用法相同
<date>把date对象转换为指定格式的字符串并输出到页面UI标签
常用的UI标签有:<form>、<textfield>、<password>、<submit>、<checkboxlist>、<radio>、<select>、
<textarea>、<file>、<hidden>、<actionerror>等。
这些标签会生成相应的HTML标签,除了支持相应HTML标签本来就有的属性外,还支持其他属性。大部分标签还可以
从值栈中取出数据进行回显,也会自动显示对应的类型转换失败信息或者数据校验失败信息
<form>会生成HTML的<form>,namespace属性指定要提交到的action的namespace,action属性指定要提交到的
action的name。
<textfield>会生成HTML的<input type="text">
<checkboxlist>会生成一组HTML的<checkbox>和<label>,value属性值可指定为Collection、Map、数组等,
listKey属性指定生成的<checkbox>的value属性的值,listValue属性指定生成的<label>的标签体内容(和
springMVC的<checkboxes>用法基本一致)。
<radio>、<select>的用法和<checkboxlist>相似
<actionerror>可以输出调用addActionError()添加到action中的错误信息UI主题
UI主题即标签的显示风格和样式,struts2自定义标签的默认UI主题是xhtml,这个主题会对UI标签进行简单的布局
排版。
对于对页面样式要求不高的项目,可以直接使用默认主题,简单方便。但如果对页面样式要求较高,通常都是由前端
开发人员专门设计样式,这时候就不能再使用默认主题了,应该使用simple简单主题,以便前端开发人员完全控制标
签的显示样式。
修改UI主题方式:在struts.xml中指定<constant name="struts.ui.theme" value="simple" />interceptor拦截器
拦截器可以在请求到达action之前进行拦截,以便对请求进行预处理和后处理。struts2预定义了众多拦截器,
struts的很多功能都是由拦截器实现的。ParametersInterceptor
ParametersInterceptor会根据action字段名尝试取出相应的请求参数,并根据字段类型进行类型转换,如果类型
转换失败,则把失败信息保存起来,如果转换成功,则把值注入到action的字段上,其实是把值注入到值栈的栈顶
元素的字段上(此时action对象就在栈顶)。
另外,struts2内置的类型转换器以满足绝大部分需求,一般不需要自定义类型转换器。
类型转换失败信息默认是英文的,要自定义这些错误信息可以在action类所在的包下创建一个properties文件,
文件名和action类名一致,内容格式如:invalid.fieldvalue.age=请输入正确的年龄值。ModelDrivenInterceptor
ModelDrivenInterceptor会把实现了ModelDriven接口的action类中的model(pojo)对象放在值栈的栈顶,这样
ModelDrivenInterceptor在注入的时候就会把请求参数注入到model中,这样开发者就不用手动数据封装到
model中了。ValidationInterceptor
ValidationInterceptor会对action字段值进行校验,校验方式有手动校验和XML校验
手动校验即在action中声明validateXxx()方法(xxx指处理请求的action方法名),在此方法中手动写代码进行
校验。ValidationInterceptor会自动调用此方法。XML校验
struts预定义了很多检验规则,常用的有:required、requiredstring、int、email、url、stringlength、
regex等,可以在名称为action类名-actionName-validation.xml的文件(需要放在和action类相同的包下)中
使用这些规则对栈顶对象的字段进行校验。
这些校验规则大部分都有参数,可以使用<param>指定,具体可参考
com.opensymphony.xwork2.validator.validators包下的校验器实现类。WorkflowInterceor
在类型转换和数据校验后,如果有错误信息,WorkflowInterceptor就会跳过action方法直接返回input result。
由于一般只在表单提交时才需要对参数进行类型转换和数据校验,所以应该在action配置中把input result导航回
含有该表单的页面。
注意:对于修改等需要提前从数据库中查询数据的操作,在表单提交后校验失败时,如果直接转发回jsp页面就会因
缺少必要数据而出错,解决方法是让action类实现Preparable接口或者使用<s:action>标签,但都比较麻烦,建议
在工作时真正遇到了再做研究。FileUploadInterceptor
FileUploadInterceptor会在ParametersInterceptor执行前判断请求是否是文件上传,如果是,则使用
fileupload.jar工具包处理请求,把上传的文件数据保存在临时文件中,这样ParametersInterceptor就可以直接
把该临时文件注入到action中File字段上。
开发者只需要在action中定义File类型的字段,并在action方法中把文件复制到想要的地方即可,非常方便。可以通过下面方式限制上传文件的大小和文件类型
使用常量限制所有文件上传请求的文件大小,默认3M。特别注意如果上传文件超出此处设置的大小,浏览器和服务器
的连接就可能会中断,这是由于tomcat服务器本身对上传文件的大小限制造成的。
在action中单独配置此action文件上传的大小限制和文件类型,大小不能高于常量配置的大小。自定义拦截器
自定义拦截器需要实现Interceptor接口,然后配置拦截哪些action
struts2的拦截机制是由多个拦截器组成拦截器栈,然后再和action组成调用链实现的。拦截器栈在包下定义,会
拦截此包下的所有action,如果别的包继承此包,也会继承此包定义的拦截器栈。
<interceptor>用来定义单个拦截器
<interceptor-stack>用来定义拦截器栈
<interceptor-ref>用来引用自己定义的或者从父包继承的拦截器或者拦截器栈defaultStack是struts-default包下定义的默认拦截器栈
<default-interceptor-ref>用来指定此包默认使用的拦截器栈(包下可以定义多个拦截器栈)通配符
随着项目规模的增长需要配置的内容增长很快,struts.xml很快就很庞大和臃肿,可以使用<include>把
struts.xml切分成若干个小文件,还可以使用通配符一次性配置多个action。
在<action>的name属性中可以使用通配符 * 表示除 / 外的任意多个字符,并且可以使用{n}的方式引用第n个 * 匹
配到的内容(n >= 1)。
新版本的struts需要在包中配置<global-allowed-methods>后通配符才好用。在使用通配符时action方法名、
result、jsp页面命名等需要预先制定好命名规则。Spring整合struts2
需要做的有:
1 在pom.xml中再加入Spring依赖以及struts-spring整合插件依赖
2 在web.xml配置初始化Spring容器的监听器
3 提供beans.xml配置文件,并配置扫描action类所在的包
4 在action类上标注@Controller和@Scope("prototype")
5 在struts.xml中通过常量指定使用Spring创建action类,并且<action>标签的class属性值为Spring bean的name

Struts2的概念及工作原理相关推荐

  1. OSPF路由协议概念及工作原理

    随着Internet技术在全球范围内的飞速发展,IP网络作为一种最有前景的网络技术,受到了人们的普遍关注.而作为IP网络生存.运作.组织的核心--IP路由技术提供了解决IP网络动态可变性.实时性.Qo ...

  2. 轻松认识HTTP协议的概念和工作原理

    轻松认识HTTP协议的概念和工作原理 当我们想浏览一个网站的时候,只要在浏览器的地址栏里输入网站的地址就可以了,例如:www.microsoft.com,但是在浏览器的地址栏里面出现的却是:http: ...

  3. 区块链的基本概念和工作原理

    区块链的基本概念和工作原理 1.基本概念 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.所谓共识机制是区块链系统中实现不同节点之间建立信任.获取权益的数学算法. 区 ...

  4. 代理服务器的概念及其工作原理

    一.代理服务器的概念及工作原理 (一)代理服务器的概念 随着Internet技术的迅速发展,越来越多的计算机连入了Internet.很多公司也将自己公司的局域网接入了Internet.如何快速地访问I ...

  5. Linux | PCIe Hotplug | 概念及工作原理的不完全总结

    本文对 PCIe 热插拔的概念及工作原理进行不完全总结. 更新: 2022 / 12 / 31 Linux | PCIe Hotplug | 概念及工作原理的不完全总结 热插拔 组成部件 实现代码 通 ...

  6. 一文搞懂GPU的概念、工作原理,以及与CPU的区别

    近几个月,几乎每个行业的小伙伴都了解到了ChatGPT的可怕能力.你知道么,ChatGPT之所以如此厉害,是因为它用到了几万张NVIDA Tesla A100显卡做AI推理和图形计算. 本文就简单分享 ...

  7. struts2的核心和工作原理

    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...

  8. 浅析堡垒机概念及工作原理(转)

    摘 要:在信息化社会,企事业单位业务对信息系统高度依赖,而信息系统维护人员往往拥有系统最高管理权限,其操作行为必须得到有效监管与审计.作为运维操作审计最佳解决方案的堡垒机通常会给人一种神秘莫测的感觉, ...

  9. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

最新文章

  1. c 多线程运行混乱_一篇文章读懂 Python 多线程
  2. 【下载】支持中文的 jspSmartUpload jar 包
  3. C51汇编伪指令 CSEG DSEG
  4. 2013-12-7 在超市给思杨买东西-思杨踢球
  5. 5kyu k-Primes
  6. 设计一代码,逆置带头结点的动态单链表L
  7. .NET通用基本权限系统
  8. html css模仿实例,HTML+CSS模仿大学网站主页
  9. thinkphp5 两个控制器传参数_Thinkphp5代码执行学习
  10. 服装PDM产品数据管理
  11. 计算机一级报名照片是几寸的,法考报名照片要求几寸
  12. [团队项目]英语学习助手之 NABC 模型
  13. 三星真机云测平台可能是最好的云测平台,因为他免费。
  14. android模拟器横屏显示,安卓模拟器bluestacks怎么横屏显示
  15. 【小家Spring】Spring AOP之Advisor、PointcutAdvisor、IntroductionAdvisor、IntroductionInterceptor(引介增强)
  16. 今年的第几天?(p16)模拟
  17. SOCKET实现广播(BoardCast)的发送和接收 (转)
  18. 关于texlive2021安装,一直卡在安装界面怎么回事?
  19. python qrcode 中文乱码_Python qrcode不一致
  20. 2021 年最新的个人录制的前后端真正的免费编程学习视频

热门文章

  1. 大专学计算机专业学得到不,大专学计算机真的没用吗
  2. USB HID接口芯片
  3. 樊登读书赋能读后感_樊登即兴演讲读后感,脱稿演讲与即兴演讲读后感,即兴演讲读后感...
  4. 2019海康威视软件开发工程师(C/C++)面试问题
  5. js获取php时间戳,JS怎么获取当前时间戳
  6. el-table 按照某种规则 进行自定义升序降序的排序
  7. PS制作爆破效果教程
  8. 如何用Excel设置合同到期提醒?
  9. [转]u盘读不出来怎么办大汇总
  10. .ds_store是什么文件