无法在spring mvc中的控制器中接收表单数据

时间:2014-02-20 09:59:47

标签: java spring spring-mvc jstl

我是spring mvc框架的新手,我在控制器中从视图中获取值时遇到了问题。 请在下面找到代码。

这是jsp:

<form:form action="envDetails" method="POST" commandName="enviromentForm">
<c:forEach items="${enviromentForm.environments}" varStatus="i" var="env">
        Name of Environment<c:out value="${(i.index)+1}"/>:
       <form:input path="environments[${i.index}].name" type="text"/>
       <br>
       Path of Environment<c:out value="${(i.index)+1}"/>  :
       <form:input path="environments[${i.index}].path" type="text"/>
       <br><br>
</c:forEach>
<input class="submitStyle" type="submit" value="SUBMIT" />
</form:form>

这是我的控制者:

@RequestMapping(value="envDetails",method=RequestMethod.GET)
public ModelAndView setBackingForm(HttpServletRequest request) {
    EnviromentForm envf=new EnviromentForm();
    envf.setProjectName("Test");
    for(int i=0;i<2;i++) {
        envf.add(new Enviroment());
    }
    return new ModelAndView("envDetails","enviromentForm",envf);
}

@RequestMapping(value = "envDetails", method = RequestMethod.POST)
public ModelAndView viewFolderInput(
        @ModelAttribute("enviromentForm") EnviromentForm enviromentForm,BindingResult binding,WebRequest request, SessionStatus status) {

    ***//here I am not receiving the values in enviromentForm***
}

这是EnviromentForm类:

public class EnviromentForm {

private String projectName;
private List<Enviroment> environments;

public EnviromentForm() {
    environments = new ArrayList<>();
}

public EnviromentForm(String projectName, List<Enviroment> environments) {
    this.projectName = projectName;
    this.environments = new ArrayList<>();
    this.environments.addAll(environments);
}

//getter setter

public void add(Enviroment env) {
    this.environments.add(env);
}

}

这是Enviroment类:

public class Enviroment {
private String name;
private String path;

//getter setter

}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

主要问题是Spring MVC 3.0.1将HTML中的<form:input>标记呈现为:

<input id="environments0.path" name="environments0.path" value="" type="text">

请注意name属性缺少括号([]),这使得它符合HTML规范,但会破坏您的数据绑定。有两种方法可以解决此问题,升级Spring或使用常规input标记。我建议升级Spring。

升级Spring

第一个解决方案是升级Spring库项目。我发现版本3.2.5.RELEASE通过网络发送参数如下:

enter image description here

更正了3.0.1.RELEASE中的参数,如下所示:

enter image description here

使用常规HTML输入

另一个解决方法是使用常规HTML input标记来创建表单控件及其名称属性。这将消除Spring 3.0.1path属性进行的修改(最终呈现为name属性)。

<input name="environments[${i.index}].name" type="text"/>

答案 1 :(得分:0)

您错误地将请求映射到@Controller(value = "/"),而不是@RequestMapping(value="/")将其添加到EnvController

@Controller的value元素表示对逻辑组件名称的建议,将其转换为Spring bean。详细了解@Controller

此外,为什么需要add()方法,如果要将环境添加到列表中,请通过调用environments的getter添加它

像这样:

environmentForm.getEnvironments().add(env);