Struts 03

来源:互联网 发布:安装Linux命令行模 编辑:程序博客网 时间:2024/06/06 19:09

Struts2中的拦截器(特别重要)
1、拦截器的重要性
Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
是AOP编程思想的一种应用形式
2、拦截器的执行时机:

这里写图片描述

3、自定义拦截器
3.1、拦截器的类试图(初级版本):

这里写图片描述

3.2、编写步骤:
a、编写一个类,继承AbstractInterceptor类或者实现Interceptor接口。重写intercept方法。

这里写图片描述

b、配置拦截器:注意拦截器必须先声明再使用

这里写图片描述

运行后action1后控制台显示拦截了

3.3、执行顺序

这里写图片描述
这里写图片描述
这里写图片描述

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

这里写图片描述

这里写图片描述

3.5、intercept方法的返回值

这里写图片描述

4、拦截器的应用:
4.1、检查登录的拦截器案例
配置文件:

这里写图片描述

动作类:

这里写图片描述

拦截器:

这里写图片描述

页面:

这里写图片描述

这里写图片描述

这里写图片描述

4.2、案例中的问题

暴露的问题:
由于我们写了自己的拦截器,默认的拦截器不起作用了。 解决办法: 把默认拦截器加入到配置文件中

当有多个拦截器时,需要改写的地方非常多。 解决办法:抽取公共的包,把全局配置放入公共包中。
还要再每个动作方法中引入拦截器。能不能不写呢? 思路:我们在设置【开发模式】时,覆盖掉了一个default.properties中的常量,能不能把struts-default.xml中的默认拦截器栈的设置给覆盖掉呢?答案是可以的。

当使用了默认拦截器栈,这时候三个动作login,showIndex和show1Action都将被检查登录的拦截器拦截。 解决办法:
需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的:
所以我们在自定义拦截器时,还可以继承MethodFilterInterceptor并且重写doIntercept方法。并且在struts的配置文件中,配置需要拦截哪些方法,和需要放过哪些方法。

我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。
解决办法:我们需要在使用拦截器的时候给它注入参数。

这里写图片描述

这里写图片描述

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

这里写图片描述

四、文件的上传(拦截器)和下载(stream结果类型)(需要练一遍)
1、文件上传
必要前提:
a.表单method必须是post;
b.enctype取值必须是multipart/form-data;

这里写图片描述

动作类:

这里写图片描述

2、文件上传的配置
2.1、文件上传大小限制(默认是2MB)
如果上传文件超过了默认大小,upload拦截器会转向一个input的逻辑视图。

这里写图片描述

a、改变上传文件大小限制:
思路:在struts.xml中改变default.properties文件中的常量。

这里写图片描述

2.2、限制文件上传的类型
a、通过限制上传文件的扩展名
思路:给fileUpload拦截器注入参数

b、通过限制上传文件的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中存放的主要内容
Key Value 说明
value stack (root) java.util.List 没有root这个key。它是一个list。
application java.util.Map String,Object ServletContext中的所有属性。
session java.util.Map String,Object HttpSession中的所有属性。
request java.util.Map String,Object ServletRequest中的所有属性。
parameters java.util.Map 参数
attr java.util.Map 把页面、请求、会话、应用范围内的所有属性放到一起。

这里写图片描述

注意:
除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)
查看contextMap中的数据:
在页面上使用s:debug

这里写图片描述

测试存入数据:

这里写图片描述

0 0