Java实战之01Struts2-04拦截器、上传下载、OGNL表达式
十二、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表达式的更多相关文章
- Java Web 项目的文件/文件夹上传下载
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- 「小程序JAVA实战」小程序头像图片上传(下)(45)
转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/ 接下来,我们应 ...
- 「小程序JAVA实战」小程序头像图片上传(上)(43)
转自:https://idig8.com/2018/09/08/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan40/ 在微信小程序中 ...
- 「小程序JAVA实战」小程序头像图片上传(中)(44)
转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan43/ 用户可以上传了 ...
- java做的比较完善的FTP上传下载文件服务器源码
Filename: ftp.java Author: leetsing(elove) Create date: 2004-08-30 Use: connect to FTP server,then u ...
- Java基础——Servlet(八)文件上传下载
一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...
- java/struts/Servlet文件下载与ftp文件上传下载
1.前端代码 使用超链接到Struts的Action或Servlet <a target="_blank" href="ftpFileAction!download ...
- Ubuntu 16.04利用SecureCRT上传/下载文件(sz/rz命令)
说明:XShell同样也是支持的. 一.安装软件 sudo apt-get install lrzsz 二.sz下载文件用法: #下载一个文件 sz filename #下载多个文件 sz filen ...
- SprintBoot 实现上传下载
本人在 .NET 转JAVA 的路上 ,也在学习SpringBoot相关知识,这里记录一下在Springboot中实现文件上传下载的核心代码 package com.file.demo.springb ...
随机推荐
- JavaScript性能优化:度量、监控与可视化1
HTTP事务所需要的步骤: 接下来,浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接,类似对讲机的Over(完毕) Roger(明白) TCP/IP模型 TCP即传输控制协议( ...
- 【Java基础】继承的一些总结
什么是继承 把一些类的具有共性的东西剥离出来形成一个新的类,然后各个其他类保留自己独有的特性,并用关键字extends继承这个剥离出来的新的类,可以最终达到各类原始相同效果,但是在每个类中,单用一个“ ...
- HDU-3622 Bomb Game 2sat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622 题意:一个平面上有很多的炸弹,每个炸弹的爆炸范围是一样的,求最大的爆炸范围使得炸弹之间不相互影响 ...
- Centos System Info
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...
- 事件demo
delegate void MoveEventHandle(object source,MoveEventArgs e); public class MoveEventArgs:EventArgs { ...
- Kooboo中怎么写Page Plugin -摘自官方文档
Page plugin development Page plugin is an add-on to Kooboo CMS, and is responsible for making data s ...
- Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法
Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynam ...
- 怎样做出通用的pos小票打印程序
POS小票打印机分为热敏和针式俩种. 打印纸的宽度分为58毫米.76毫米和80毫米三种. 打印接口分为:串口.并口.USB和网口(以太网). 热敏打印机速度较快,打印的时候噪音少,针打可以使用多联纸自 ...
- eclipse中的maven配置
1.下载最新版eclipse,包含maven版本 2.配置maven本地仓库(修改settings.xml)
- MINA之心跳协议运用
转自:http://my.oschina.net/yjwxh/blog/174633 摘要 心跳协议,对基于CS模式的系统开发来说是一种比较常见与有效的连接检测方式,最近在用MINA框架,原本自己写了 ...