Spring可以使用简单的String作为表单命令对象吗?

时间:2013-01-25 21:30:38

标签: java spring binding command-objects

我希望在一个真正只有一个可绑定值的表单上使用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>

2 个答案:

答案 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对象引用的引用值。