一、Struts2中的拦截器(特殊主要)

1、拦截器的主要性

Struts2中的很多功能都是由拦截器完成的。
比如:servletConfig,staticParam,params,modelDriven等等。

jsp取map的key值Java开辟框架必会Struts2第三天 HTML

是AOP编程思想的一种运用形式。

2、拦截器的实行机遇:

3、自定义拦截器

3.1、拦截器的类试图(低级版本):

3.2、编写步骤:

a、编写一个类,继续AbstractInterceptor类或者实现Interceptor接口。
重写intercept方法。

b、配置拦截器:把稳拦截器必须先声明再利用

3.3、实行顺序

3.4、多个拦截器的实行顺序

3.5、intercept方法的返回值

4、拦截器的运用:

4.1、检讨登录的拦截器案例

配置文件:

动作类:

拦截器:

页面:

4.2、案例中的问题

问题:由于我们写了自己的拦截器,默认的拦截器不起浸染了。

办理办法:

a、把默认拦截器加入到配置文件中

b、a中暴露的问题:当有多个拦截器时,须要改写的地方非常多。

办理办法:抽取公共的包,把全局配置放入公共包中。

c、b中的问题:还要再每个动作方法中引入拦截器。
能不能不写呢?

思路:我们在设置【开拓模式】时,覆盖掉了一个default.properties中的常量,能不能把struts-default.xml中的默认拦截器栈的设置给覆盖掉呢?答案是可以的。

办理办法:

d、c中涌现的问题:当利用了默认拦截器栈,这时候三个动作login,showIndex和show1Action都将被检讨登录的拦截器拦截。

办理办法:

须要通过AbstractInterceptor类的子类入手,通过查看创造,该类还有一个子类是抽象的:

以是我们在自定义拦截器时,还可以继续MethodFilterInterceptor并且重写doIntercept方法。

并且在struts的配置文件中,配置须要拦截哪些方法,和须要放过哪些方法。

e、d中遗留的问题:我们在声明时配置了哪些方法须要拦截,哪些方法不须要拦截。
但是在没有写动作类和动作方法之前,不愿定方法名叫什么。

办理办法:我们须要在利用拦截器的时候给它注入参数。

4.3、拦截器类视图(全):

二、文件的上传(拦截器)和下载(stream结果类型)(须要练一遍)

1、文件上传

必要条件:

a.表单method必须是post;

b.enctype取值必须是multipart/form-data;

c.供应文件选择域。

动作类:

2、文件上传的配置

2.1、文件上传大小限定(默认是2MB)

如果上传文件超过了默认大小,upload拦截器会转向一个input的逻辑视图。

a、改变上传文件大小限定:

思路1:给Struts2的拦截器注入参数:(行不通)

思路2:在struts.xml中改变default.properties文件中的常量。

2.2、限定文件上传的类型

a、通过限定上传文件的扩展名

思路:给fileUpload拦截器注入参数

当上传非限定扩展名时:有如下缺点提示

b、通过限定上传文件的MIME类型

当上传非限定MIME类型时:有如下缺点提示

3、出错后的缺点信息中文提示(Struts2中的所有文本提示都是基于国际化的)

默认信息提示在:struts2-core.jar\org.apache.struts2\struts-message.properties

办理办法:用国际化资源包,把对应的key取值改为中文即可。

常用的key值:

4、多文件上传

jsp页面:

配置文件:

动作类:

运行结果:

5、文件下载:实在便是一种结果类型(Stream)

动作类:

配置文件:

运行结果:

问题:文件名不能在配置文件中写去世,须要根据实际情形获取。

办理办法:

动作类:

配置文件:

运行结果:

三、OGNL简介(非常主要)

1、什么是OGNL

OGNL是Object Graphic Navigation Language(工具图导航措辞)的缩写,它是一个单独的开源项目。
Struts2框架利用OGNL作为默认的表达式措辞。

2、OGNL的功能

条件:OGNL是struts2整合的一个开源项目,以是在struts2中,要想利用OGNL表达式,必须利用Struts2标签库

2.1、支持普通方法的调用

(EL表达式只能调用静态方法)

2.2、访问静态成员(静态属性,静态方法)

OGNL改写文件下载:

2.3、操作凑集工具

a、创建List工具:

b、创建Map工具:

四、contextMap(非常主要)

1、动作类的生命周期

明确:动作类是多例的,每次动作访问,动作类都会实例化。
所以是线程安全的。
与Struts1的差异是,struts1的动作类是单例的。

2、要求动作的数据存放

问题:

每次要求时,都会产生一些要求数据,这些数据存放到哪里去了?

明确:

在每次动作实行前,核心掌握器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack工具。
且每次动作访问都会创建。

这两个工具存储了全体动作访问期间用到的数据。
并且把数据绑定到了线程局部变量(ThreadLocal)上了。
所以是线程安全的。

3、contextMap:存储数据

Struts2的官方文档对contextMap的解释:

contextMap中存放的紧张内容KeyValue解释value stack (root)java.util.List没有root这个key。
它是一个list。
applicationjava.util.Map<String,Object>ServletContext中的所有属性。
sessionjava.util.Map<String,Object>HttpSession中的所有属性。
requestjava.util.Map<String,Object>ServletRequest中的所有属性。
parametersjava.util.Map参数attrjava.util.Map把页面、要求、会话、运用范围内的所有属性放到一起。

把稳:

除了value stack之外,全是map,而contextMap也是一个map。
实在便是Map中又封装的Map。
(很像dbutils中KeyedHandler封装数据的构造,只是封装数据的构造)

查看contextMap中的数据:

在页面上利用<s:debug/>

测试存入数据:

五、contextMap中的数据操作

root根:List

元素1元素2元素3元素4元素5

ActionContext:Map

keyvalueapplicationMapsessionMaprequestMapattrMap

1、存数据:

须要熟习ActionContext和valueStack的API。
框架为我们存数据。

1.1、利用ActionContext存数据

1.2、利用ValueStack存数据

a、如何获取ValueStack:

b、ValueStack中的getRoot()方法:

c、CompoundRoot是什么:

d、栈操作:

2、取数据:用Struts2的标签(OGNL表达式)在JSP上(用的最多)

利用OGNL表达式来去,struts2的OGNL表达式必须写在struts2标签中。

2.1、利用s:property取数据

a、取contextMap中的数据,需利用#

b、取contextMap里面ValueStack中工具的属性:直接写属性名

如果遇有工具属性重名,可以通过OGNL表达式,选择查找的起始位置

分外解释:当s:property不给定value属性时,默认取栈顶工具。

OGNL的利用总结:

1.取根中工具的属性,不该用#。

2.取contextMap中key的值,要利用#。

2.2、ValueStack的其他方法:

a、setValue方法

在Jsp页面上获取【李四】

b、set方法

细节问题:

当按照如下办法,往根中存放数据时,根中元素是什么顺序?

利用<s:debug/>标签查看:

c、findValue:我们在Jsp上调用的都是findValue

六、Struts2对EL的改变

1、Struts2中利用EL的问题:

条件:

我们该当知道,如果我们没有往值栈(根)中放入数据的话,那么我们的动作类默认是在值栈的栈顶。

问题:

我们放到要求域中的属性,利用EL表达式取出来了。
但是放到运用域中的属性,利用EL表达式没取出来。

2、关于EL问题的剖析:

剖析:

我们知道EL表达式是从四大域工具中依次查找属性。
搜索范围是由小到大。
page Scope————>request Scope————>sessionScope————>application Scope

但是通过测试创造,搜索完request范围后就没有连续搜索,而是返回了ValueStack中栈顶工具name属性的值。

3、Struts2中EL查找顺序改变总结:

EL表达式: page Scope————>request Scope————>sessionScope————>application Scope

OGNL表达式:page Scope————>request Scope————>valueStack(根中)————>contextMap————>sessionScope————>application Scope

4、OGNL的分外解释:

把稳:以下内容知道即可。