Spring POST 方法中的 MVC 模型为空
Spring MVC Model within POST Method is empty
我正在使用 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;
}
}
如果删除文件上传内容,您将能够在模型中看到数据。但是如果你想做文件上传,你必须调整你的代码如下。
- 首先,从模型中删除成员 'file' 及其 setter 和 getter 方法。
其次,替换 JSP
中的以下标签
<form:input path="file" id="upload" type="file" />
带有简单的 HTML 标签。
<input name="file" type="file"/>
将控制器中的POST方法的签名修改为如下。
public ModelAndView circleUpPost(HttpServletRequest _request, @ModelAttribute("circleUpModel") CircleUpModel _circleUpModel, @RequestParam("file") MultipartFile _file) {
//do your processing
}
此处最后一个参数“_file”是 MultipartFile 类型,包含您从 JSP.
上传的文件
最后也是最重要的一步是在 Spring 配置文件中注册多部分解析器。
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="100000" />
</beans:bean>
希望对您有所帮助。
可以通过更改模型中的文件类型来解决此问题。
之前是pdfclown文件,现在改成了MultipartFile。
在我的 POST 方法中,我已将文件从 MultipartFile 转换为 pdfclown 文件,以便能够像以前一样使用它。
我正在使用 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;
}
}
如果删除文件上传内容,您将能够在模型中看到数据。但是如果你想做文件上传,你必须调整你的代码如下。
- 首先,从模型中删除成员 'file' 及其 setter 和 getter 方法。
其次,替换 JSP
中的以下标签<form:input path="file" id="upload" type="file" />
带有简单的 HTML 标签。
<input name="file" type="file"/>
将控制器中的POST方法的签名修改为如下。
public ModelAndView circleUpPost(HttpServletRequest _request, @ModelAttribute("circleUpModel") CircleUpModel _circleUpModel, @RequestParam("file") MultipartFile _file) { //do your processing }
此处最后一个参数“_file”是 MultipartFile 类型,包含您从 JSP.
上传的文件最后也是最重要的一步是在 Spring 配置文件中注册多部分解析器。
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="maxUploadSize" value="100000" /> </beans:bean>
希望对您有所帮助。
可以通过更改模型中的文件类型来解决此问题。
之前是pdfclown文件,现在改成了MultipartFile。 在我的 POST 方法中,我已将文件从 MultipartFile 转换为 pdfclown 文件,以便能够像以前一样使用它。