java的ognl写文件_Java实战之01Struts2-04拦截器、上传下载、OGNL表达式

十二、Struts2中的拦截器

1、拦截器的重要性

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

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

2、拦截器的执行时机:

\

321ea9866739ef1d3a00a3083fb5e469.png

3、自定义拦截器

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

f877d9d0176cfc8db070deb709cca640.png

3.2、编写步骤:

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

1 public class MyInterceptorDemo1 extendsAbstractInterceptor {2

3 public String intercept(ActionInvocation invocation) throwsException {4 System.out.println("MyInterceptorDemo1拦截了:访问动作之前");5 //放行的含义:如果有下一个拦截器,则执行下一个拦截器。如果该拦截器是最后一个,则执行动作方法。

6 String rtValue = invocation.invoke();//此行是放行的方法

7 System.out.println("MyInterceptorDemo1拦截器"+rtValue);8 System.out.println("MyInterceptorDemo1拦截了:访问动作之后");9 returnrtValue;10 }11

12 }

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

1 a、声明拦截器2

3

4

5 b、使用拦截器6

7

8

9 /success.jsp

10

3.3、执行顺序

8da04c4023346d15c8ea39a2ddeaadd4.png

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

40e0284e37f1eafe00e969e643d88640.png

3.5、intercept方法的返回值

ec32aa6eb5e9d665a76618fcb821fa7d.png

4、拦截器的应用:

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

配置文件:

1

2

3

4

5

6

7

8

9

10

11 /login.jsp

12

13

14

15

16 /main.jsp

17

18

19 /other.jsp

20

21

22

23

24 login

25

26 showMain

27

28

动作类:

1 public class Demo1Action extendsActionSupport {2

3 publicString demo1(){4 System.out.println("Demo1Action的demo1方法执行了");5 returnSUCCESS;6 }7 }

拦截器:

1 public class CheckLoginInterceptorDemo1 extendsAbstractInterceptor {2

3 public String intercept(ActionInvocation invocation) throwsException {4 Object obj = ServletActionContext.getRequest().getSession().getAttribute("userinfo");5 if(obj == null){6 return "login";7 }8 return invocation.invoke();//放行

9 }10

11 }

页面:

1

2

3

用户登录

4

5

6

7 用户名:

8

9

10

11

4.2、案例中的问题

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

解决办法:

需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的:

cd12150d3186469b51dd314905d6cd6e.png

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

1 public class CheckLoginInterceptorDemo2 extendsMethodFilterInterceptor {2

3 public String doIntercept(ActionInvocation invocation) throwsException {4 Object obj = ServletActionContext.getRequest().getSession().getAttribute("userinfo");5 if(obj == null){6 return "login";7 }8 return invocation.invoke();//放行

9 }10

11 }

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

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

9fd4ff60ee950459ffefdf5080b5b4ad.png

十三、文件的上传(拦截器)和下载(stream结果类型)

1、文件上传

必要前提:

a.表单method必须是post;

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

c.提供文件选择域。

ed5638b33fbb9cd6a4219e075c0467f6.png

动作类:

1 public class UploadAction extendsActionSupport {2

3 privateString username;4 privateFile photo;5 //struts2框架会为我们提供一个变量,用于保存文件名。

6 private String photoFileName;//该变量的命名规则有要求:必须是文件变量的名称+FileName。严格区分大小写。

7

8

9 public String upload()throwsException{10 //1.获取文件要写到服务器的位置

11 String basePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/uploads");12 //2.判断目录是否存在

13 File file = newFile(basePath);14 if(!file.exists()){15 file.mkdirs();16 }17 //3.写文件

18 /*

19 * 拷贝:是使用临时文件,复制一份到指定目录20 * FileUtils21 * 它是apache提供commons-io的jar包中一个类。22 * copyFile方法:23 * 把参数1复制到指定位置,指定位置是由参数2决定的24 * 参数:25 * 第一个:源文件26 * 第二个:目标文件27 *28 * 弊端:29 * 会保存两份文件,一份是临时文件,一份是实际写的文件30 */

31 //FileUtils.copyFile(photo, new File(file,photoFileName));

32 /*

33 * 剪切:是把临时文件重命名后,存到指定目录(一般采用此种方式)34 * 比复制的好处就是:只会保留一份文件35 */

36 photo.renameTo(newFile(file,photoFileName));37 returnSUCCESS;38 }

2、文件上传的配置

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

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

改变上传文件大小限制:

1

2

2.2、限制文件上传的类型

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

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

1

2

7

8

9 .jpg,.png,.jpeg,.bmp

10

11 image/jpeg,image/png,image/pjpeg

12

13 /success.jsp

14 /index.jsp

15

3、文件下载:其实就是一种结果类型(Stream)

动作类:

1 public String download() throwsException{2 //3.找到要下载文件的路径

3 String basePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/uploads");4 //4.使用文件路径+文件名称,构建字节输入流

5 fileName = "4O5A3624.jpg";//实际开发中是从数据库中查出来的

6 inputStream = new FileInputStream(basePath+File.separator+fileName);7 //5、返回一个成功

8 returnSUCCESS;9 /*

10 * 6.剩下的事,都交给struts2框架。是框架的stream的结果类型为我们实现的11 * 我们需要给stream结果类型提供参数12 * 13 14 application/octet-stream15 attachment;filename=1.jpg16 inputStream17 18 */

19 }

配置文件:

1

2

3

4 application/octet-stream

5 attachment;filename=1.jpg

6 inputStream

7

8

十四、OGNL简介

1、什么是OGNL

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。Struts2框架使用OGNL作为默认的表达式语言。

2、OGNL的功能

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

2.1、支持普通方法的调用

1

2

8

9

10

11

12

13

14


15

20

21


22

27

28


29

32 --%>

33

34

35

37 在生成浏览器认识的html标签时:38 会把map的key给html标签的value赋值39 把map的value作为文本显示在页面上40

41 例如:42 男43 女44 --%>

45

46

47

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值