1

从表面上看,这个问题听起来很像以前在 SOF 上问过的问题,但我很久以前就尝试过这些答案,但没有运气。

(例如这个问题spring 3 not rendering model in jsp

所以我有一个扩展 CancelableFormController 的 Spring 2.0 控制器,它包含以下内容以将命令对象绑定到 JSP 页面渲染上的表单:

public class MyFormController extends CancellableFormController {

....

    protected Object formBackingObject(HttpServletRequest request) throws ServletException {
        MyCommand myCommand = new MyCommand();
            ... // add some list info to command object etc in preparation for page render
        return myCommand;
    }

....

}

JSP 页面如下所示:

<form:form method="post" commandName="myCommand">

    <c:forEach items="${myCommand.myList}" var="myItem" varStatus="index">

</form:form>

需要明确的是,在表单标记定义之间,JSP 页面上显示了一个项目列表。这是在任何表单提交发生之前(即在页面呈现时)。我们生活在一个多么美丽简单的世界。一切都是第一次工作,地球上很平静……对不起,讽刺够了!;)

好的,所以我很高兴地尝试将这个旧代码升级到 Spring 3 和注释。我当前的问题是仅让 Command 对象在页面加载时呈现。当我将数据输入表单字段并提交表单等时,数据会正确绑定。我要做的是预先填充 Command 对象,然后在填充和提交表单之前将该内容呈现到 JSP 页面中。

我最初尝试过这个:

@Controller
@RequestMapping(value = "/myContextPath")
public class MyFormController {

    ...

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView initForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView("myTilesViewName");
        MyCommand myCommand = new MyCommand();
        ...
        mv.addObject("myCommand", myCommand);
        return mv;
    }

    ...

}

然后我尝试了以下每种方法(Controller类构造与上面相同):

@RequestMapping(method = RequestMethod.GET)
@ModelAttribute("myCommand")
public String initForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
      MyCommand myCommand = new MyCommand();
      ....
      return "myTilesViewName";
}

@RequestMapping(method = RequestMethod.GET)
public String initForm(ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception {
    MyCommand myCommand = new MyCommand();
    ...
    model.addAttribute("myCommand", cmd);
    return "myTilesViewName";
}

我不想增加任何混淆。我“想象”如果我只是返回 JSP 页面的视图名称,这个问题的答案可能是相同的……但是,我使用 Apache Tiles 来处理页面选择。我的定义类似于:

<definition name="myTilesViewName" extends=".myTemplate">
    <put-attribute name="title" value="MyTitle" type="string" />
    <put-attribute name="body" value="/WEB-INF/jsp/myPage.jsp" />
</definition>

请记住,之前使用 Spring 2 CancelableFormController 代码一切正常。我根本没有更改 Tiles 配置或 JSP 页面,所以不要相信它们是这个问题的根源。

非常感谢任何可以提供任何帮助的人。这当然值得赞赏!

更新:

这个问题最终与客户端(JSP 页面)相关的问题有关。我认为“除了控制器之外没有任何变化”的假设是不正确的。向那些花时间阅读这篇文章并考虑解决方案的人表示诚挚的歉意。对于其他阅读相同症状的人,请仔细检查您的视图页面 (JSP) 并确保它们在语法上是正确的。在我的例子中,我将一个 JSP(大约 2000 行代码)移动到一个子文件夹中,并破坏了一个到嵌套 jsp 导入声明的相对链接。

4

0 回答 0