Struts2 Part6

原作者:尚硅谷-佟刚


多文件的上传


struts.xml


 <!-- 配置国际化资源文件 --> 
    <constant name="struts.custom.i18n.resources" value="i18n"/>
    <!-- 配置上传文件总的大小 -->
    <constant name="struts.multipart.maxSize" value="1024000"/>

 <interceptors>
       <interceptor name="hello" class="com.atguigu.struts2.interceptors.MyInterceptor"/>
          <interceptor-stack name="atguigustack">
             <interceptor-ref name="defaultStack">
                 <!-- 上传文件单个大小 -->
                 <param name="fileUpload.maximumSize">10240</param>
                 <param name="fileUpload.allowedTypes">text/html,text/xml,text/plain</param>
                 <param name="fileUpload.allowedExtensions">html,dtd,xml,txt</param>
             </interceptor-ref>
          </interceptor-stack>
       </interceptors>

       <default-interceptor-ref name="atguigustack"/>

       <action name="testUpload" class="com.atguigu.struts2.upload.app.UploadAction">
           <result>/success.jsp</result>
           <result name="input">/upload.jsp</result>
       </action> 

i18n.properties(struts2-core-2.3.30.jar 包下
org/apache/struts2/struts-messages.properties)


struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File {0} is too large to be uploaded. Maximum allowed size is {4} bytes!
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed\: {0} "{1}" "{2}" {3}

upload.jsp


 <s:form action="testUpload" method="post" enctype="multipart/form-data" theme="simple">

         <s:fielderror name="uploads"/>
         <s:actionerror/>

         uploadsFile:<s:file name="uploads" label="uploadsFile"/>
         uploadsDesc:<s:textfield name="uploadsDesc[0]" label="uploadsDesc"/>
         <br><br>

         uploadsFile:<s:file name="uploads" label="uploadsFile"/>
         uploadsDesc:<s:textfield name="uploadsDesc[1]" label="uploadsDesc"/>
         <br><br>

         uploadsFile:<s:file name="uploads" label="uploadsFile"/>
         uploadsDesc:<s:textfield name="uploadsDesc[2]" label="uploadsDesc"/>
         <br><br>

         <s:submit/>

      </s:form>

success.jsp

 <body>

     <h4>Success Page</h4>

  </body>

uploadAction.java


package com.atguigu.struts2.upload.app;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private List<File> uploads;
    private List<String> uploadsContentType;
    private List<String> uploadsFileName;
    private List<String> uploadsDesc;

    @Override
    public String execute() throws Exception {
         System.out.println(uploads);
        System.out.println(uploadsContentType);
        System.out.println(uploadsFileName);
        System.out.println(uploadsDesc);

        ServletContext servletContext = ServletActionContext.getServletContext();
        String dir = servletContext.getRealPath("\\files");

        BufferedOutputStream bos=null;
        BufferedInputStream bis=null;

        int len=0;
        byte[] buffer=new byte[1024];

        if(uploads!=null&&uploads.size()>0){

            for(File upload:uploads){

                bis=new BufferedInputStream(new FileInputStream(upload));
                bos=new BufferedOutputStream(new FileOutputStream(dir+"\\"+upload.getName()));
                while((len=bis.read(buffer))!=-1){
                    bos.write(buffer, 0, len);
                }

                bis.close();
                bos.close();

            }


        }

        return SUCCESS;
    }

    public List<File> getUploads() {
        return uploads;
    }

    public void setUploads(List<File> uploads) {
        this.uploads = uploads;
    }

    public List<String> getUploadsContentType() {
        return uploadsContentType;
    }

    public void setUploadsContentType(List<String> uploadsContentType) {
        this.uploadsContentType = uploadsContentType;
    }

    public List<String> getUploadsFileName() {
        return uploadsFileName;
    }

    public void setUploadsFileName(List<String> uploadsFileName) {
        this.uploadsFileName = uploadsFileName;
    }

    public List<String> getUploadsDesc() {
        return uploadsDesc;
    }

    public void setUploadsDesc(List<String> uploadsDesc) {
        this.uploadsDesc = uploadsDesc;
    }

}

页面运行效果


文件类型不符

这里写图片描述

文件超出范围

这里写图片描述

文件上传成功

这里写图片描述

这里写图片描述


文件下载


struts.xml


 <action name="testDownload" class="com.atguigu.struts2.download.app.DownLoadAction">
           <result type="stream">
              <param name="bufferSize">2048</param>
           </result>
       </action>

DownLoadAction.java


package com.atguigu.struts2.download.app;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.servlet.ServletContext;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownLoadAction extends ActionSupport{

    private String contentType;
    private long contentLength;
    private String contentDisposition;
    private InputStream inputStream;

    public String getContentType() {
        return contentType;
    }

    public long getContentLength() {
        return contentLength;
    }

    public String getContentDisposition() {
        return contentDisposition;
    }


    public InputStream getInputStream() {
        return inputStream;
    }

    @Override
    public String execute() throws Exception {
        //确定各个成员变量的值
        contentType="text/html";
        contentDisposition="attachment;filename=hidden.html";

        ServletContext servletContext=
                ServletActionContext.getServletContext();
        String fileName=servletContext.getRealPath("/files/hidden.html");



        inputStream=new FileInputStream(fileName);
        contentLength=inputStream.available();

        return SUCCESS;
    }

}

download.jsp

  <body>

    <a href="testDownload">Down load</a>

  </body>

服务器上的文件

这里写图片描述


页面运行效果
download.jsp


这里写图片描述


防止表单的重复提交(token&tokenSession拦截器)

i18n.properties(struts2-core-2.3.30.jar 包下
org/apache/struts2/struts-messages.properties)

struts.messages.invalid.token=\u8868\u5355\u91CD\u590D\u63D0\u4EA4\u4E86\!

struts.xml

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

TokenAction.java


package com.atguigu.struts2.token.app;

import com.opensymphony.xwork2.ActionSupport;

public class TokenAction extends ActionSupport {

    private String username;
    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    @Override
    public String execute() throws Exception {
        //模拟网络延时
        Thread.sleep(3000);
        System.out.println(username);
        return super.execute();
    }
}

token.jsp

<s:form  action="testToken">
        <s:token/>
        <s:textfield name="username" label="Username"/>
        <s:submit/>
     </s:form>

token-error.jsp

 <s:debug/>
 <h4>Token Error Page</h4>
 <s:actionerror/>

success.jsp


  <body>

     <h4>Success Page</h4>

  </body>

页面运行效果

这里写图片描述

tokenSession拦截器

与token拦截器最大的不同,当表单重复提交时会跳过请求的Action
而直接响应成功页面


struts.xml

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

页面运行效果
这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值