Struts2 知识点梳理
一、Struts2简介
1.概念:轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。
2.与Servlet对比
优点:业务代码解耦,提高开发效率
缺点:执行效率偏低,需要使用反射、解析XML等技术手段,结构复杂
3.不同框架实现MVC的方式
Servlet:

Spring:

Struts2:

二、Struts2使用
1.使用步骤
导入Struts2核心jar包
在web.xml配置前端控制器filter
<filter>
<filter-name>Struts2</fileter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
<filter-mapping>
创建struts.xml(格式可以参考核心包根路径下的DTD文件,struts-default.xml)
编写控制器Action
- 方法是public的
- 返回值为String类型(返回值与struts.xml->action->result的name属性匹配,即根据此返回值找到对应result)
- 参数列表为空
创建JSP页面
配置struts.xml
<struts>
<!--
package:包,用于对Action进行封装
name:包名,根元素下可以有多个包,彼此不能重名
extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到当前包
namespace:命名空间,用于规定Action的访问路径,必须“/”开头 -->
<package name="test01" namespace="/test01" extends="struts-default">
<!--action:业务控制器,用于注册业务控制器组件
name:action名称,用于规定Action的访问路径
class:业务控制器组件,用于指定业务控制器对应的类
method:方法,用于指定访问当前action时要调用的方法
*请求URL:http://ip:port/projectName/namespace/ActionName.action
-->
<action name="hello" class="test01.konrad.action.HelloAction" method="execute">
<!--result:输出组件,用于转发、重定向、直接输出
name:名称,一个action下可以有多个result,彼此不能重名
默认值转发,元素内设置转发的页面
-->
<result name="success">
/hello.jsp
</result>
</action>
</package>
</struts>
三、参数传递
1.Action从页面取值
a)基本属性注入(页面,Action)

b)域模型注入(页面,Action)

2.页面从Action取值
a)使用EL表达式

b)OGNL
四、OGNL
1.概念:Object Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。Strut2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问Action。
2.用法:在Struts2中,OGNL表达式要结合Struts2标签来访问数据
EL:${user.userName} <==> OGNL:<s:property value="user.userName">
*a)访问基本属性 <s:property value="属性名"/>
*b)访问实体对象 <s:property value="对象名.属性名"/>
c)访问数组/集合 <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>
d)访问Map <s:property value="someMap.key" />
e)运算 <s:property value="'My name is' + name" />
f)调用方法 <s:property value="name.toUpperCase()" />
g)创建集合 <s:property value="{'a','b','c'}" /> ArrayList
h)创建Map <s:property value="#{'mm':'MM','nn':'NN'}" /> LinkedHashMap
五、ValueStack
1.概念:是Struts2中,Action向页面传递数据的媒介,封装了Action的数据,并允许JSP通过OGNL来对其访问
2.原理

3.访问ValueStack
a)通过<s:debug>观察其结构
b)输出栈顶:<s:property />
c)访问Context对象:
- OGNL表达式以"#"开头
- 以key来访问context对象的值,即"#key"得到context中某属性值
d)迭代集合

e)按数字迭代


4.ValueStack栈顶的变化
- 默认情况下栈顶为Action
- 循环过程中,栈顶为循环变量(集合迭代时,循环变量是集合中的对象,即栈顶为实体对象,可以以实体对象为root来写OGNL表达式;数字迭代时,循环变量是数字,不能以数字为实体对象,需要通过var声明变量名,以"#变量名"来引用,此情况下,是从context对象中取出值)
- 循环结束后,栈顶变回Action
5.EL表达式访问ValueStack
a)EL也是从ValueStack中取的值
b)EL默认的取值范围是page,request,session,application
c)Struts2重写的request的getAttribute方法,先试图从原始request中取值,如果没取到再从ValueStack中取值
六、Action基本原理
1.6大核心组件

FC:前端控制器,负责统一的分发请求
Action:业务控制器,负责处理某一类业务
ValueStack:Action与JSP数据交互的媒介
Interceptor:拦截器,负责扩展Action,处理Action的共通事务
Result:负责输出的组件
Tags:标签,负责显示数据、生成框体
2.获取Session的方式
a)ActionContext
- ActionContext.getContext().getSesion(),返回Map<String, Object>
b)ServletActionContext
- ServletActionContext.getRequest().getSession(),返回HttpSession
c)SessionAware(推荐使用)
- 让Action实现SessionAware接口
- 实现setSession(Map<String, Object> session)方法,Struts2会在实例化Action后调用方法,通过方法参数将Session对象注入进来
- 定义成员变量,接收注入进来的Session对象
七、Result原理
1.介绍:用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方式的输出。每一个Result实际上是一个类,这些类都实现了共同的接口Result。Struts2预置了10种类型的Result,定义在strtus-default.xml
2.Result类型
a)dispatcher:用于转发的result,可以将请求转发给JSP,这种类型的Result对应的类为ServletDispacherResult,通过default="true"指定该Result为Struts2默认的Result类型。
b)stream:用于向页面输出二进制数据,此种类型的Result可以将二进制数据输出到请求发起端,对应类为StreamResult
<result name="success" type="stream">
<!--codeStream 为定义在Action的输入流InputStream -->
<param name="inputName">codeStream</param>
</result>
c)redirectAction:用于将请求重定向给另外一个Action,对应类为ServletActionRedirectResult
<result name="login" type="redirectAction">
<!--若重定向的Action与当前Action在同一个namespace下,可以省略namespace-->
<param name="namespace">
/命名空间
</param>
<param name="actionName">
action名
</param>
</result>
d)json:用于向页面输出json格式的数据,可以将json字符串输出到请求发起端。对应类为JSONResult
<result name="success" type="json">
<!--输出一个Action属性
指定属性为基本类型,则直接返回该属性值
如果指定属性为实体对象,则返回格式{"code":"as1","name":"hk"}
-->
<param name="root">属性名</param>
<!--输出多个Action属性-->
<param name="includeProperties">属性名1,属性名2...</param>
<!--输出所有属性,不需要param标签--> </result>
json需要导包,修改package继承关系为json-default
八、UI标签
1.表单 <s:form action="" method="" theme="simple" ></s:form>
2.文本框 <s:textfield name="userName" />
3.布尔框 <s:checkbox name="marry" />
4.单选框 <s:radio name="sex" list="#{'M':'男','F':'女'}"/> 静态初始化
<s:radio name="favoriteCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
5.多选框 <s:checkboxlist name="travelCities" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化
<s:checkboxlist name="travelCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
6.下拉选 <s:select name="home" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化
<s:select name="home" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
九、拦截器
1.用途:拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志的记录,权限检查,事务处理等。拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展。
2.使用步骤
创建拦截器组件(创建一个类,实现Interceptor接口,并实现intercept方法;也可以继承MethodFilterInterceptor,这种方式可以使action中某个方法不进行拦截)
public String intercept(ActionInvocation invocation){
//拦截器--前部分处理
invocation.invoke();
//拦截器--后续处理
}
注册拦截器
<package>
<interceptors>
<interceptor name="别名" class="实现类"/>
<!--其他拦截器-->
</interceptors>
</package>
引用拦截器(哪个Action希望被拦截器扩展,需要在此action配置下,引用拦截器)
<action>
<!--手动的使用一次系统默认的拦截器-->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="拦截器别名"/>
<!--可以写多个-->
<!--可以使用excludeMethods参数属性,设置不过滤的方法-->
</action>
3.拦截器栈
<interceptor-stack name="myStack">
<interceptor-ref name="拦截器别名1"/>
<interceptor-ref name="拦截器别名2"/>
</interceptor-stack>
4.FileUpload拦截器
a)原理:首先FileUpload拦截器将表单中提交的文件,以临时文件的形式保存到服务器临时路径下。之后FileUpload拦截器将该临时文件对象注入给Action,Action自主处理该临时文件。最后FileUpload拦截器删除临时文件。
b)使用步骤
导包 commons-io.jar
Action:定义File类型属性(如some),接受拦截器注入的临时文件对象。若想要获取原始文件名,要定义String类型属性,属性名为File类型属性+FileName(如someFileName)
表单设置:method="post", enctype="multipart/form-data"
c)设置限制(Struts2文件上传默认最大值为2097152B,即2M)
在struts.xml中重置默认限制值 <constant name="struts.multipart.maxSize" value="5000000" />
Struts2 知识点梳理的更多相关文章
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...
- [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(九)数据库常用对象之package
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(八)常见Exception
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
随机推荐
- 201621123012 《Java程序设计》第14次学习总结
作业14-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截 ...
- Ubuntu的中文乱码问题
目标:使系统/服务器支持中文,能够正常显示. 1.首先,安装中文支持包language-pack-zh-hans: $ sudo apt-get install language-pack-zh-ha ...
- bzoj1050旅行
题目链接 其实没有辣么难, 暴力枚举最小边是哪条边,然后每次跑一边最小生成树, 当$s,t$刚好联通时最后加的边的权值就是当前的最大边最小的情况 然后判断一下,更新答案就好 /************ ...
- css里面鼠标的形状-----》easyui哪点事
用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...
- XPath语法使用的一些心得
XPath语法还是很强大的,支持一些函数和操作符,方便操作,但是因为版本的原因可能有的函数只能在XPath2(2007)里使用,而不能在XPath1(1999)中使用,比如函数 ends-with(s ...
- UITableView定制左滑效果
UITableViewRowAction类 object defines a single action to present when the user swipes horizontally in ...
- todocmvc的安装
安装依赖 官网 安装依赖的css,js $npm install 引入vue <script src="js/vue.js"></script> 定义初始化 ...
- [原创]SSH密钥访问Git仓库配置
SSH密钥并非为了解决拉取git仓库代码时,需要频繁输入密码的问题. SSH是一种比较安全的协议,可以用来免去远程登录Linux等服务器时需要输入密码的繁琐过程. 命令: ssh user@serve ...
- Python用于http/https接口自动化
本接口自动化框架主要用到的类: 1. unittest:组织测试用例 2. requests:http/https请求 3. HTMLTestRunner:生成测试报告 4. Dingtalkchat ...
- unity+Helios制作360°全景VR视频
unity版本 unity2017.2.0 Helios版本:Helios 1.3.6 ffmpeg:ffmpeg-20180909-404d21f-win64-static(地址:https:// ...