十二、Struts2中的拦截器

1、拦截器的重要性

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

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

2、拦截器的执行时机:

\

3、自定义拦截器

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

3.2、编写步骤:

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

 public class MyInterceptorDemo1 extends AbstractInterceptor {

     public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptorDemo1拦截了:访问动作之前");
//放行的含义:如果有下一个拦截器,则执行下一个拦截器。如果该拦截器是最后一个,则执行动作方法。
String rtValue = invocation.invoke();//此行是放行的方法
System.out.println("MyInterceptorDemo1拦截器"+rtValue);
System.out.println("MyInterceptorDemo1拦截了:访问动作之后");
return rtValue;
} }

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

             a、声明拦截器
<interceptors>
<interceptor name="myInterceptor1" class="cn.itcast.web.interceptors.MyInterceptorDemo1"></interceptor>
</interceptors>
b、使用拦截器
<action name="action1" class="cn.itcast.web.action.Demo1Action" method="demo1">
<!-- 使用拦截器。当我们配置了一个拦截器之后,默认的拦截器栈就失效了-->
<interceptor-ref name="myInterceptor1"></interceptor-ref>
<result name="success">/success.jsp</result>
</action>

3.3、执行顺序

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

3.5、intercept方法的返回值

4、拦截器的应用:

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

配置文件:

 <package name="myDefault" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="checkLoginInterceptorDemo2" class="cn.itcast.web.interceptors.CheckLoginInterceptorDemo2"></interceptor>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="checkLoginInterceptorDemo2"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
</package>
<package name="bbs" extends="myDefault">
<action name="showMain" class="cn.itcast.web.action.BBSAction" method="showMain">
<result name="success">/main.jsp</result>
</action>
<action name="showOther" class="cn.itcast.web.action.BBSAction" method="showOther">
<result name="success">/other.jsp</result>
</action>
<action name="login" class="cn.itcast.web.action.BBSAction" method="login">
<interceptor-ref name="myDefaultStack">
<!-- 为拦截器注入参数,告知拦截器要排除的方法 -->
<param name="checkLoginInterceptorDemo2.excludeMethods">login</param>
</interceptor-ref>
<result name="success" type="redirectAction">showMain</result>
</action>
</package>

动作类:

 public class Demo1Action extends ActionSupport {

     public String demo1(){
System.out.println("Demo1Action的demo1方法执行了");
return SUCCESS;
}
}

拦截器:

 public class CheckLoginInterceptorDemo1 extends AbstractInterceptor {

     public String intercept(ActionInvocation invocation) throws Exception {
Object obj = ServletActionContext.getRequest().getSession().getAttribute("userinfo");
if(obj == null){
return "login";
}
return invocation.invoke();//放行
} }

页面:

 <html>
<head>
<title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login.action">
用户名:<input type="text" name="username"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>

4.2、案例中的问题

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

解决办法:

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

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

 public class CheckLoginInterceptorDemo2 extends MethodFilterInterceptor {

     public String doIntercept(ActionInvocation invocation) throws Exception {
Object obj = ServletActionContext.getRequest().getSession().getAttribute("userinfo");
if(obj == null){
return "login";
}
return invocation.invoke();//放行
} }

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

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

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

1、文件上传

必要前提:

a.表单method必须是post;

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

c.提供文件选择域。

动作类:

 public class UploadAction extends ActionSupport {

     private String username;
private File photo;
//struts2框架会为我们提供一个变量,用于保存文件名。
private String photoFileName;//该变量的命名规则有要求:必须是文件变量的名称+FileName。严格区分大小写。 public String upload()throws Exception{
//1.获取文件要写到服务器的位置
String basePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/uploads");
//2.判断目录是否存在
File file = new File(basePath);
if(!file.exists()){
file.mkdirs();
}
//3.写文件
/*
* 拷贝:是使用临时文件,复制一份到指定目录
* FileUtils
* 它是apache提供commons-io的jar包中一个类。
* copyFile方法:
* 把参数1复制到指定位置,指定位置是由参数2决定的
* 参数:
* 第一个:源文件
* 第二个:目标文件
*
* 弊端:
* 会保存两份文件,一份是临时文件,一份是实际写的文件
*/
//FileUtils.copyFile(photo, new File(file,photoFileName));
/*
* 剪切:是把临时文件重命名后,存到指定目录(一般采用此种方式)
* 比复制的好处就是:只会保留一份文件
*/
photo.renameTo(new File(file,photoFileName));
return SUCCESS;
}

2、文件上传的配置

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

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

改变上传文件大小限制:

 <!-- 改变上传文件大小限制的方式:只能用修改常量的方式 -->
<constant name="struts.multipart.maxSize" value="10485760"></constant>

2.2、限制文件上传的类型

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

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

 <action name="upload" class="cn.itcast.web.action.UploadAction" method="upload">
<!-- 给上传文件的拦截器注入参数,限制上传文件的大小
此种方式无法限制上传文件的大小
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">10485760</param>
</interceptor-ref> -->
<interceptor-ref name="defaultStack">
<!-- 限制文件的扩展名 -->
<param name="fileUpload.allowedExtensions">.jpg,.png,.jpeg,.bmp</param>
<!-- 限制文件的MIME类型 -->
<param name="fileUpload.allowedTypes">image/jpeg,image/png,image/pjpeg</param>
</interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>

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

动作类:

 public String download() throws Exception{
//3.找到要下载文件的路径
String basePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/uploads");
//4.使用文件路径+文件名称,构建字节输入流
fileName = "4O5A3624.jpg";//实际开发中是从数据库中查出来的
inputStream = new FileInputStream(basePath+File.separator+fileName);
//5、返回一个成功
return SUCCESS;
/*
* 6.剩下的事,都交给struts2框架。是框架的stream的结果类型为我们实现的
* 我们需要给stream结果类型提供参数
* <result name="success" type="stream">
<!-- 给结果类型注入参数:两个头 一个流 -->
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">attachment;filename=1.jpg</param>
<param name="inputStream">inputStream</param>
</result>
*/
}

配置文件:

 <action name="download" class="cn.itcast.web.action.DownLoadAction" method="download">
<result name="success" type="stream">
<!-- 给结果类型注入参数:两个头 一个流 -->
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">attachment;filename=1.jpg</param>
<param name="inputStream">inputStream</param>
</result>
</action>

十四、OGNL简介

1、什么是OGNL

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

2、OGNL的功能

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

2.1、支持普通方法的调用

   <body>
<%--s:property标签
作用:把该标签中value属性的值所对应的内容输出到浏览器上。
属性:
value:取值不是一个普通的字符串,而是一个OGNL表达式。
它是去一个位置查找数据去了,把找到的结果显示出来。
--%>
<s:property value="OGNL-Expression"/><br/>
<%--使用引号,把value的值括起来,取值将变成一个普通的字符串 --%>
<s:property value="'OGNL-Expression'"/><br/>
<%--支持普通方法调用 --%>
<s:property value="'OGNL-Expression'.length()"/><br/>
<s:property value="'OGNL-Expression'.toUpperCase()"/><br/>
<s:property value="'OGNL-Expression'.split('-')[0]"/><hr/>
<%--OGNL还可以访问静态属性
@包名.包名.类名@属性名称
例如:
@java.lang.Integer@MAX_VALUE
--%>
<s:property value="@java.lang.Integer@MAX_VALUE"/>
<hr/>
<%--OGNL还可以调用静态方法
@包名.包名.类名@方法名称
例如:
@java.lang.Math@random()
--%>
<s:property value="@java.lang.Math@random()"/>
<hr/>
<%--OGNL操作集合对象
s:radio标签的list属性取值是一个OGNL表达式。
{'男','女'}就相当于创建了一个List集合,里面包含了两个元素
--%>
<s:radio list="{'男','女'}" name="gender" label="性别"></s:radio>
<hr size="50px" color="gray"/>
<%--OGNL操作map对象
#{'male':'男','female':'女'}就相当于创建了一个map。冒号左侧的作为key,冒号右侧的作为value。
在生成浏览器认识的html标签时:
会把map的key给html标签的value赋值
把map的value作为文本显示在页面上 例如:
<input type="radio" value="male">男
<input type="radio" value="female">女
--%>
<s:radio list="#{'male':'男','female':'女'}" name="gender" label="性别"></s:radio> </body>

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

Java实战之01Struts2-04拦截器、上传下载、OGNL表达式的更多相关文章

  1. Java Web 项目的文件/文件夹上传下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  2. 「小程序JAVA实战」小程序头像图片上传(下)(45)

    转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/ 接下来,我们应 ...

  3. 「小程序JAVA实战」小程序头像图片上传(上)(43)

    转自:https://idig8.com/2018/09/08/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan40/ 在微信小程序中 ...

  4. 「小程序JAVA实战」小程序头像图片上传(中)(44)

    转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan43/ 用户可以上传了 ...

  5. java做的比较完善的FTP上传下载文件服务器源码

    Filename: ftp.java Author: leetsing(elove) Create date: 2004-08-30 Use: connect to FTP server,then u ...

  6. Java基础——Servlet(八)文件上传下载

    一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...

  7. java/struts/Servlet文件下载与ftp文件上传下载

    1.前端代码 使用超链接到Struts的Action或Servlet <a target="_blank" href="ftpFileAction!download ...

  8. Ubuntu 16.04利用SecureCRT上传/下载文件(sz/rz命令)

    说明:XShell同样也是支持的. 一.安装软件 sudo apt-get install lrzsz 二.sz下载文件用法: #下载一个文件 sz filename #下载多个文件 sz filen ...

  9. SprintBoot 实现上传下载

    本人在 .NET 转JAVA 的路上 ,也在学习SpringBoot相关知识,这里记录一下在Springboot中实现文件上传下载的核心代码 package com.file.demo.springb ...

随机推荐

  1. 微软Azure运营方世纪互联遭做空后强劲反弹

    http://www.cnblogs.com/sennly/p/4135594.html 最近几天微软Azure的运营方世纪互联被Trinity做空,股价震荡巨大,先让我们回顾下整个事件: 9月11日 ...

  2. YUV转灰度

    转载自:http://blog.csdn.net/sxjk1987/article/details/7470545 标准的V4L2 API http://v4l.videotechnology.com ...

  3. 应用引擎BAE3.0介绍及百度BAE3.0支持并发多少

    百度云BAE3.0的特点:1.支持本地程序迁移百度云应用引擎BAE3.0做了很多的改进,其实就是一句话,百度云开发在不断的进步.为了节省开发者的学习成本,百度云BAE3.0增加了轻量级虚拟机,使开发环 ...

  4. scrollTop 值为 0

    由scrollTop兼容问题引起: 在 Firefox 和 IE 中,使用 document.documentElement.scrollTop 获取: 在 Chrome 中,使用 document. ...

  5. SEAndroid安全机制对Binder IPC的保护分析

    在SEAndroid安全机制中,除了文件和属性,还有Binder IPC须要保护.Binder IPC是Android系统的灵魂,使用得相当广泛又频繁.比如,应用程序都是Binder IPC请求訪问系 ...

  6. HDU--1533--Going Home--KM算法

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. 解决windows server 2003不认U盘或移动硬盘

    解决windows server 2003不认U盘或移动硬盘1.进入命令提示符环境(也就是DOS) 2.进入DISKPART程序 3.输入AUTOMOUNT ENABLE指令 4.OK,下次USB硬盘 ...

  8. Ajax之旅(一)--什么是Ajax

    本来在学习DRP,但是无意中发现所附资料中有一些參考书籍,当中就有一个关于Ajax的,看了看,挺好的,于是决定暂停一下DRP,再次学习一下Ajax.记得第一遍学习Ajax的时候认为真的是一团雾水,看了 ...

  9. Python重写C语言程序100例--Part1

    ''' [程序1] 题目:有1.2.3.4个数字,能组成多少个互不同样且无反复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成全部的排列后再去 掉不满足条件 ...

  10. Python 基础【第二篇】python操作模式

    一.交互模式 #python Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4 ...