0

我希望在实际上只有一个可绑定值的表单上使用 Spring 强大的绑定工具(错误/验证/标记库/等)。我没有使用包含单个字符串属性(“名称”)的对象,而是尝试使用基本字符串作为命令对象,但我不确定如何(或是否)让它与相同的顶级。这是一个使用带有嵌套字符串的对象 (MyObject) 的示例 - 这很好用。我想只使用一个字符串,但是当我将 MyObject 更改为 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>
4

2 回答 2

0

字符串是不可变的。当你使用 MyObject 时,Spring 改变的是对象对 String 的引用,而不是 String 本身。

于 2013-01-25T21:39:04.623 回答
0

我猜你的情况可能是由两件事引起的:

1) String 是一个不可变对象。这意味着每当您分配一个新的字符串时都会返回一个新的参考值

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

于 2013-01-28T12:57:35.677 回答