我是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
}
非常感谢任何帮助。
答案 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库项目。我发现版本3.2.5.RELEASE
通过网络发送参数如下:
更正了3.0.1.RELEASE
中的参数,如下所示:
另一个解决方法是使用常规HTML input
标记来创建表单控件及其名称属性。这将消除Spring 3.0.1
对path
属性进行的修改(最终呈现为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);