我希望在一个真正只有一个可绑定值的表单上使用Spring强大的绑定工具(errors / validation / tag library / etc.)。我没有让一个包含单个String属性(“name”)的对象,而是试图使用一个基本的String作为命令对象,但是我不确定如何(或者如果)将其用于处理所有内容同样的顶级。这是一个使用带有嵌套字符串的对象(MyObject)的示例 - 这很好用。我想只使用一个字符串,但是当我将MyObject更改为String时,为此String输入的内容不会反映在下一页中。我做错了什么?
@Controller
@SessionAttributes("command")
public class TestController {
private static final String[] WIZARD_PAGES = new String[] {
"enterValue",
"confirmValue"
};
@RequestMapping(value = "doStuff.action", method = RequestMethod.GET)
public String formBackingObject(HttpServletRequest request, HttpServletResponse response, final ModelMap modelMap) {
MyObject entry = new MyObject();
modelMap.put("command", entry);
return WIZARD_PAGES[0];
}
@RequestMapping(value = "doStuff.action", method = RequestMethod.POST)
public String onSubmit(HttpServletRequest request, HttpServletResponse response, final ModelMap modelMap,
final @ModelAttribute("command") MyObject entry,
final Errors errors, SessionStatus status,
@RequestParam(value = "_page") Integer currentPage,
@RequestParam(value = "_finish", required=false) Object finish,
@RequestParam(value = "_cancel", required=false) Object cancel) {
// submitting
if (finish != null) {
// do submit stuff here
status.setComplete();
return "redirect:/home.action";
}
// cancelling
if (cancel != null) {
status.setComplete();
return "redirect:/home.action";
}
// moving to next page
int targetPage = WebUtils.getTargetPage(request, "_target", currentPage);
if (targetPage >= currentPage) {
// validate current page here
switch(currentPage) {
case 0: // TODO: call validation
if (!errors.hasErrors()) {
// do some stuff to prepare the next page
}
break;
}
}
if (errors.hasErrors())
return WIZARD_PAGES[currentPage];
return WIZARD_PAGES[targetPage];
}
并输入VALue.jsp:
<form:form commandName="command">
<form:input path="name"/>
<input type="submit" name="_target1" value="<spring:message code="COMMON.NEXT"/>" />
<input type="hidden" name="_page" value="0" />
</form:form>
并确认Value.jsp:
<form:form commandName="command">
${name}
<input type="submit" name="_finish" value="<spring:message code="COMMON.SUBMIT"/>" />
<input type="hidden" name="_page" value="1" />
</form:form>
答案 0 :(得分:0)
字符串是不可变的。当您使用MyObject时,Spring更改的是对象对String的引用,而不是String本身。
答案 1 :(得分:0)
我猜你的案子可能是由两件事引起的:
1)字符串是不可变对象。这意味着,只要您指定新的字符串
,就会返回新的参考值2)方法参数按值传递。由于String是引用类型,因此对象引用的参考值无法更改。
例如
public static void change(String text) { // (1) pass by value
text = "Hello Word"; // (2) immutable
}
public static void main(String[] args) {
String str = "Hello";
change(str);
System.out.println(str); // Output: Hello
}
当我们将String对象引用包装在另一个对象中时,传递给change方法的对象引用是 myObject ,不再是String引用即可。这就是为什么使用myObject可以更改String对象引用的引用值。