struts2 文件的上传下载 表单的重复提交 自定义拦截器

时间:2022-01-23 15:30:03

文件上传中表单的准备

要想使用 HTML 表单上传一个或多个文件

  须把 HTML 表单的 enctype 属性设置为 multipart/form-data

  须把 HTML 表单的method 属性设置为 post

  需添加 <input type=“file”> 字段.

Struts 对文件上传的支持

  在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.

  步骤:1. 在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的

     2. 在 Action 中新添加 3 个和文件上传相关的属性. 这 3 个属性的名字必须是以下格式
      [File Name] : File -被上传的文件。例如:data
      [File Name]ContentType : String -上传文件的文件类型。例如:dataContentType
      [File Name]FileName : String -上传文件的文件名。例如:dataFileName

    如果上上传多个文件, 可以使用 List

配置 FileUpload 拦截器

FileUpload 拦截器有 3 个属性可以设置.

  maximumSize: 上传单个文件的最大长度(以字节为单位), 默认值为 2 MB

  allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔

  allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔

可以在 struts.xml 文件中覆盖这 3 个属性

aaarticlea/png;base64,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" alt="" />

Commons FileUpload 组件默认接受上传文件总的最大值为 2M, 可以通过在 struts 配置文件中配置常量的方式修改

与文件上传有关的出错消息在org.apache.struts2 下的 struts-messages.properties 文件里预定义.  可以在文件上传 Action 相对应的资源文件中重新定义错误消息

文件的下载

1). Struts2 中使用 type="stream" 的 result 进行下载即可

2). 具体使用细节参看 struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html

3). 可以为 stream 的 result 设定如下参数

  contentType:被下载的文件的 MIME 类型。默认值为 text/plain
  contentLength:被下载的文件的大小,以字节为单位
  contentDisposition: 可以设置下载文件名的ContentDispositon 响应头,默认值为 inline,通常设置为如下格式: attachment;filename="document.pdf".
  inputName:Action 中提供的文件的输入流。默认值为 inputStream
  bufferSize:文件下载时缓冲区的大小。默认值为 1024
  allowCaching :文件下载时是否允许使用缓存。默认值为 true
  contentCharSet:文件下载时的字符编码。

Stream 结果类型的参数可以在 Action 以属性的方式覆盖

表单的重复提交问题

1). 什么是表单的重复提交

  > 在不刷新表单页面的前提下:
          >> 多次点击提交按钮
          >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
          >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)"

  > 注意:
          >> 若刷新表单页面, 再提交表单不算重复提交
          >> 若使用的是 redirect 的响应类型, 已经提交成功后, 再点击 "刷新", 不是表单的重复提交

2). 重复提交的缺点: 加重了服务器的负担;  可能导致错误操作.

3). Struts2 解决表单的重复提交问题:

I. 在 s:form 中添加 s:token 子标签. 它将在表单里插入一个隐藏字段并把标记值(隐藏域的字段的值)保存在HttpSession 对象里.

II. 使用 Token 或 TokenSession 拦截器.

  > 这两个拦截器均不在默认的拦截器栈中, 所以需要手工配置一下
     > 若使用 Token 拦截器, 则需要配置一个 token.valid 的 result
     > 若使用 TokenSession 拦截器, 则不需要配置任何其它的 result

III. Token VS TokenSession

  > 都是解决表单重复提交问题的
     > 使用 token 拦截器会转到 token.valid 这个 result
     > 使用 tokenSession 拦截器则还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器. 就像什么都没发生过一样!

IV. 可以使用 s:actionerror 标签来显示重复提交的错误消息.

该错误消息可以在国际化资源文件中覆盖. 该消息可以在 struts-messages.properties 文件中找到

自定义拦截器

1). 具体步骤

I. 定义一个拦截器的类

  > 可以实现 Interceptor 接口
     > 继承 AbstractInterceptor 抽象类

II. 在 struts.xml 文件配置.

    <interceptors>

        <interceptor name="hello" class="com.atguigu.struts2.interceptors.MyInterceptor"></interceptor>

    </interceptors>

    <action name="testToken" class="com.atguigu.struts2.token.app.TokenAction">
<interceptor-ref name="hello"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result>
</action>

III. 注意: 在自定义的拦截器中可以选择不调用 ActionInvocation 的 invoke() 方法. 那么后续的拦截器和 Action 方法将不会被调用.Struts 会渲染自定义拦截器 intercept 方法返回值对应的 result