Struts2 在 HTTP 请求中直接返回文本

0x0 工欲善其事,必先利其器

安装配置 Tomcat 9,集成环境用 IntelliJ IDEA,这样可以避免很多繁琐的步骤。

0x1 建立项目

注意还需要勾选 Web Application,完成之后 IDEA 会自动下载 Struts2 依赖库:

create_project

程序发布后,Struts2 作为依赖库也需要部署到线上环境中,在 Project Structure 中可以设置 Struts2 类库随程序发布:

deploy_struts2_library

0x3 实现

为了简化程序,只实现上传页面,Action 的执行执行结果直接使用字符串返回。

在 src 目录下新建包,开始编写实现类:

package com.soxfmr.fileupload;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;


public class FileUploadAction extends ActionSupport {

    private static final String PATH_UPLOAD = "uploads";

    private InputStream inputStream;

    private File entity;
    private String entityFileName;
    private String entityContentType;

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public String getEntityContentType() {
        return entityContentType;
    }

    public void setEntityContentType(String entityContentType) {
        this.entityContentType = entityContentType;
    }

    public String getEntityFileName() {
        return entityFileName;
    }

    public void setEntityFileName(String entityFileName) {
        this.entityFileName = entityFileName;
    }

    public File getEntity() {
        return entity;
    }

    public void setEntity(File entity) {
        this.entity = entity;
    }

    public String httpFileUpload() {
        String ret = "error.";

        if (entity != null) {
            // 因为实际 Action 返回类型是流,所以写法是如此之蛋疼
            // 注意这里没对文件进行任何判断
            try {
                File dstFile = new File(PATH_UPLOAD, entityFileName);
                FileUtils.copyFile(entity, dstFile);

                ret = "success!";
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            ret = "No file represent";
        }

        inputStream = new ByteArrayInputStream(ret.getBytes());
        return SUCCESS;
    }
}

上传页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Home</title>
  </head>
  <body>
    <form action="httpFileUpload.action" method="POST" enctype="multipart/form-data">
        <label>File: </label>
        <input type="file" name="entity">
        <input type="submit" value="Upload">
    </form>
  </body>
</html>

上传页面里并没有 FileName 和 ContentType 等字段,这些字段由 Struts2 框架自动获取,并通过 set 方法自动赋值给 Action 对象。

等等为啥 Struts2 会知道应该设置哪个变量?

其规则是通过 File 变量名定义,例如;

private File image;

则文件信息会设置到 xxFileName 和 xxContentType:

private String imageFileName;
private String imageContentType;

struts.xml 配置文件:

<struts>
    <package name="fileManager" extends="struts-default"  namespace="/">
        <action name="httpFileUpload" class="com.soxfmr.fileupload.FileUploadAction" method="httpFileUpload">
            <result type="stream">
                <param name="contentType">text/plain</param>
                 <param name="inputName">inputStream</param>
            </result>
        </action>
    </package>
</struts>

package 中 extends 字段需要设置为 struts-default,才能正常引用返回类型。struts-default 中定义了各种 Result Type:

struts-default-result-type

0x4 完成

上传测试:

upload-page

返回结果:

upload-result

相关参考资料:

Struts 2 - File Uploads
Return a string from Struts2 action to jQuery

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值