【问题标题】:Spring MVC Model within POST Method is emptyPOST 方法中的 Spring MVC 模型为空
【发布时间】:2018-04-01 11:04:51
【问题描述】:

我正在使用 Spring MVC 开发一个 WebApp。问题是我在控制器的 POST 方法中使用@ModelAttribute 传递的模型似乎是空的,尽管我已经在网页上填写了表格。

这是我的控制器的 GET 方法:

@RequestMapping(value = "/CircleUp", method = RequestMethod.GET)
public ModelAndView circleUpGet(Model _model) {
    ModelAndView modelAndView = new ModelAndView("CircleUp");

    CircleUpModel circleUpModel = new CircleUpModel();
    _model.addAttribute("circleUpModel", circleUpModel);

    return modelAndView;
}

这是我的控制器的 POST 方法:

@RequestMapping(value = "/CircleUp", method = RequestMethod.POST)
public ModelAndView circleUpPost(HttpServletRequest _request, Model _model, @ModelAttribute("circleUpModel") CircleUpModel _circleUpModel) {

    return this.doCircleUp(_request, _model, _circleUpModel);
}

这里的“_circleUpModel”没有任何值。

这是我在相关 .jsp 文件中的表单,其中包含所需的脚本:

<form:form method="post" modelAttribute="circleUpModel" id="circle_form" action="" enctype="multipart/form-data" >


    <form:input path="file" id="upload" type="file" />

    <form:checkbox path="mergeSameTickmarks" checked="true" />

    <form:checkbox path="deleteHighlights" checked="true" />

    <form:checkbox path="generateFigureLog" checked="true" />

    ...

    <input type="button" onclick="javascript:submitForm()"
        value="Start Circle Up">

function submitForm() {
    if (checkIfPdf() && checkSettings()) {
        $("#circle_form").submit()
        setTimeout(progress, 100);
    }
}

当然会显示 CircleUpModel 的默认值,但是如果我以网页的形式输入一些其他值,则在 POST 方法中不会考虑这些条目,尽管我在我的表单中添加了 modelAttribute="circleUpForm"

CircleUpModel:

import org.pdfclown.files.File;


public class CircleUpModel {

    // File
    private File    file;

    // FileName
    private String  fileName;

    private boolean mergeSameTickmarks;
    private boolean deleteHighlights;
    private boolean generateFigureLog;

    // Settings
    private double  circleBorderWidth;

    private double  customizeCircleUp;
    private double  customizeCircleDown;

    private double  gapLeft;
    private double  gapRight;
    private double  maxGap;

    private boolean tickmarkAlwaysUpperCase;

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public boolean isMergeSameTickmarks() {
        return mergeSameTickmarks;
    }

    public void setMergeSameTickmarks(boolean mergeSameTickmarks) {
        this.mergeSameTickmarks = mergeSameTickmarks;
    }

    public boolean isDeleteHighlights() {
        return deleteHighlights;
    }

    public void setDeleteHighlights(boolean deleteHighlights) {
        this.deleteHighlights = deleteHighlights;
    }

    public boolean isGenerateFigureLog() {
        return generateFigureLog;
    }

    public void setGenerateFigureLog(boolean generateFigureLog) {
        this.generateFigureLog = generateFigureLog;
    }

    public double getCircleBorderWidth() {
        return circleBorderWidth;
    }

    public void setCircleBorderWidth(double circleBorderWidth) {
        this.circleBorderWidth = circleBorderWidth;
    }

    public double getCustomizeCircleUp() {
        return customizeCircleUp;
    }

    public void setCustomizeCircleUp(double customizeCircleUp) {
        this.customizeCircleUp = customizeCircleUp;
    }

    public double getCustomizeCircleDown() {
        return customizeCircleDown;
    }

    public void setCustomizeCircleDown(double customizeCircleDown) {
        this.customizeCircleDown = customizeCircleDown;
    }

    public boolean isTickmarkAlwaysUpperCase() {
        return tickmarkAlwaysUpperCase;
    }

    public void setTickmarkAlwaysUpperCase(boolean tickmarkAlwaysUpperCase) {
        this.tickmarkAlwaysUpperCase = tickmarkAlwaysUpperCase;
    }

    public double getGapLeft() {
        return gapLeft;
    }

    public void setGapLeft(double gapLeft) {
        this.gapLeft = gapLeft;
    }

    public double getGapRight() {
        return gapRight;
    }

    public void setGapRight(double gapRight) {
        this.gapRight = gapRight;
    }

    public double getMaxGap() {
        return maxGap;
    }

    public void setMaxGap(double maxGap) {
        this.maxGap = maxGap;
    }

}

【问题讨论】:

  • 显示CircleUpModel..
  • 我的帖子更新了

标签: java forms spring-mvc modelattribute


【解决方案1】:

这个问题可以通过改变模型中文件的类型来解决。

以前它是一个 pdfclown 文件,现在我已将其更改为 MultipartFile。 在我的 POST 方法中,我已将文件从 MultipartFile 转换为 pdfclown 文件,以便能够像以前一样使用它。

【讨论】:

    【解决方案2】:

    如果您删除文件上传内容,您将能够看到模型中的数据。但是如果你想做文件上传,你必须调整你的代码如下。

    1. 首先,从模型中删除成员“文件”及其 setter 和 getter 方法。
    2. 其次,在你的 JSP 中替换下面的标签

      <form:input path="file" id="upload" type="file" />
      

    带有简单的 HTML 标记。

        <input name="file" type="file"/>
    
    1. 将控制器中 POST 方法的签名修改如下。

      public ModelAndView circleUpPost(HttpServletRequest _request, @ModelAttribute("circleUpModel") CircleUpModel _circleUpModel, @RequestParam("file") MultipartFile _file) {
          //do your processing
      }
      

    这里最后一个参数'_file'是MultipartFile类型,包含你从JSP上传的文件。

    1. 最后也是最重要的一步是在 Spring 配置文件中注册一个多部分解析器。

      <beans:bean id="multipartResolver"    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
           <beans:property name="maxUploadSize" value="100000" />
      </beans:bean>
      

    希望这会有所帮助。

    【讨论】:

    • 抱歉我迟到了,感谢您的帮助!不幸的是,它没有直接帮助,但您的示例间接帮助我解决了我的问题!我已经在我的 Spring 配置中实现了多部分解析器,但它是导致冲突的文件类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2015-06-18
    相关资源
    最近更新 更多