从表面上看,这个问题听起来很像以前在 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 导入声明的相对链接。