1. struts系统中的拦截器介绍

过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截。

拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候

对方法的调用进行拦截,对拦截到的方法可以进行扩展,增强

Struts2中的拦截器主要针对Action中方法的调用进行拦截

 <interceptors>
<!—声明n个拦截器-->
<interceptor name="fileUpload"
class="org.apache.struts2.interceptor.FileUploadInterceptor" />
<interceptor name="i18n"
class="com.opensymphony.xwork2.interceptor.I18nInterceptor" />
<interceptor name="logger"
class="com.opensymphony.xwork2.interceptor.LoggingInterceptor" />
<interceptor name="modelDriven"
class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
<interceptor name="params"
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" />
<interceptor name="staticParams"
class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor" />
<interceptor name="token"
class="org.apache.struts2.interceptor.TokenInterceptor" />
<interceptor name="tokenSession"
class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
<!—由已经声明的n个拦截器,组成拦截器栈-->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="i18n" />
<interceptor-ref name="prepare" />
<interceptor-ref name="chain" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="fileUpload" />
<interceptor-ref name="checkbox" />
<interceptor-ref name="multiselect" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="actionMappingParams" />
<interceptor-ref name="params">
<param name="excludeParams">^class\..*,^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*
</param>
</interceptor-ref>
<interceptor-ref name="conversionError" />
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging" />
<interceptor-ref name="deprecation" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack" />
</package>

拦截器栈:

a --> b --> c --> execute() --> c --> b --> a

2.文件上传

2.1 Action

 /*** 处理文件上传的请求 **/
public class FileAction
{
// org.apache.struts2.interceptor.FileUploadInterceptor
// 1 定义文件上传需要的特定属性
private File img; // 上传的文件对象
private String imgContentType;// 上传的文件的内容的类型
private String imgFileName;// 上传的文件名称
private String path; // 文件保存到服务器上的目录 public String getPath()
{
return path;
} public void setPath(String path)
{
this.path = path;
} public File getImg()
{
return img;
} public void setImg(File img)
{
this.img = img;
} public String getImgContentType()
{
return imgContentType;
} public void setImgContentType(String imgContentType)
{
this.imgContentType = imgContentType;
} public String getImgFileName()
{
return imgFileName;
} public void setImgFileName(String imgFileName)
{
this.imgFileName = imgFileName;
} /*** 处理文件上传的请求 ****/
public String uploadFile()
{
System.out.println(img);
System.out.println(imgContentType);
System.out.println(imgFileName);
// 修改文件名
String fname = UUID.randomUUID()
+ imgFileName.substring(imgFileName.lastIndexOf("."));
// 将上传的文件对象img保存到服务器的指定目录
// 1获得path的绝对路径
String pth = ServletActionContext.getServletContext().getRealPath(path);
// 2在pth下创建文件
File file = new File(pth, fname);
// 3将img内容拷贝file中
try
{
FileUtils.copyFile(img, file);
}
catch (IOException e)
{
e.printStackTrace();
}
return Action.SUCCESS;
}
}

2.2 struts.xml 配置 1 <?xml version="1.0" encoding="UTF-8"?>

  <!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="file" namespace="/" extends="struts-default">
<interceptors>
<!-- 自定义拦截器栈 -->
<interceptor-stack name="mystack">
<!-- 引用系统文件上传的拦截器 -->
<interceptor-ref name="fileUpload">
<param name="allowedExtensions">txt,jpg,doc</param>
<!-- 其他属性的赋值同理 -->
</interceptor-ref>
      <interceptor-ref name="staticParams"></interceptor-ref>
<!-- 引用系统基本拦截器栈 -->
<interceptor-ref name="basicStack" />
</interceptor-stack>
</interceptors>
<action name="fileAction_*" class="com.guangsoft.action.FileAction"
method="{1}">
<!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="mystack"></interceptor-ref>
<!-- 给path属性赋值 -->
<param name="path">filedir</param>
<result>/index.jsp</result>
</action>
</package>
</struts>

2.3实现UI页面

 <form action="fileAction_uploadFile.action" method="post"
enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" />
</form>

3.文件下载

3.1 Action

 //org.apache.struts2.dispatcher.StreamResult
public class DownloadAction
{
private InputStream inputStream;
private String fname;// 需要下载的文件的名字 public InputStream getInputStream()
{
System.out.println("----------getInputStream");
return inputStream;
} public String getFname()
{
return fname;
} public void setFname(String fname)
{
this.fname = fname;
} /*** 实现文件下载 ***/
public String download()
{
System.out.println("----------download");
// 获得附件的保存目录
String path = ServletActionContext.getServletContext().getRealPath(
"filedir");
// 将下载的文件封装为InputStream的对象
try
{
inputStream = new FileInputStream(path + "/" + fname);
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return Action.SUCCESS;
}
}

3.2 struts.xml 配置:

 <package name="down" namespace="/down" extends="struts-default">
<action name="downloadAction_*" class="com.guangsoft.action.DownloadAction"
method="{1}">
<result type="stream">
<param name="inputName">inputStream</param>
<!-- 指定下载的附件的类型 -->
<param name="contentType">application/octet-stream</param>
<!-- 指定下载的附件的名称 -->
<param name="contentDisposition">attachment;filename=${fname}</param>
</result>
</action>
</package>

struts2文件上传和下载的更多相关文章

  1. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  2. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  3. 【SSH2(实用文章)】--Struts2文件上传和下载的例子

    回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...

  4. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  5. struts2 文件上传和下载,以及部分源代码解析

    struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...

  6. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  7. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  8. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

  9. 笔记:Struts2 文件上传和下载

    为了上传文件必须将表单的method设置为POST,将 enctype 设置为 muiltipart/form-data,只有设置为这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器. 上传 ...

随机推荐

  1. 浅谈checkpoint与内存缓存

    事务日志存在检查点checkpoint,把内存中脏数据库写入磁盘,以减少故障恢复的时间,在此之前有必要提下SQL Server内存到底存放了哪些数据? SQL Server内存使用 对SQL Serv ...

  2. Windows下几个常用的和进程有关的命令

    在windows下,进入cmd,有几个常用的和进程有关的命令: netstat -ano:查看所有进程 netstat -ano|findstr  “端口号”:查看端口号对应的进程PID taskli ...

  3. Mysql BLOB和TEXT类型

      BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. A binary la ...

  4. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  5. HTML5的新特性及技巧分享总结

    原文链接:http://www.aseoe.com/show-10-645-1.html?utm_source=tuicool&utm_medium=referral 1. 新的Doctype ...

  6. ORA-14402: 更新分区关键字列将导致分区的更改

    默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改.這種情況可以通過開啟表 ...

  7. 跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()

    __set() 在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法) __get() 方法用于获取私有属性值.(在设置私 ...

  8. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  9. Codeforces Gym 101138 D. Strange Queries

    Description 给你一下长度为 \(n\) 的序列. \(a_i=a_j\) \(l_1 \leqslant i \leqslant r_1\) \(l_2 \leqslant i \leqs ...

  10. flask 链接 url_for()

    通常html的文件都放在template里面,那么静态的文件放在哪呢?staitc里面 调用 url_for('static', filename='css/styles.css', _externa ...