【问题标题】:model passed from spring controller to jsp, some attributes added and passed to another controller, Does Not Work模型从spring控制器传递到jsp,添加了一些属性并传递给另一个控制器,不起作用
【发布时间】:2012-11-27 01:59:41
【问题描述】:

流程是:收到的消息列表显示在表格中,每个消息前面都有一个回复链接。按下回复到这个控制器:

    @RequestMapping("/createMessage")
public String createMessage(@RequestParam("receiver") String receiver, HttpSession session, Model model){
  try{  

    Message message = new Message();
    //sender, Date, and receiver are known and are added to the object      

    model.addAttribute(message);

    return "newMessage";

  } catch (Exception e){
        model.addAttribute("message", "Can't create message!");
        return "error"; 
  }

newMessage.jsp 如下。它接收模型,因为正确填写了 from:、To: 和 Date: 字段:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Send Message</title>
</head>
<body>
<form:form modelAttribute="message" method="POST" action="sendMessage">
<table border="1">
<tr>
  <th>To: </th><td>${message.userName}</td>
</tr>
<tr>
  <th>from: </th><td>${message.fromUser}</td>
</tr>
    <tr>
  <th>Date: </th><td>${message.messageDate}</td>
</tr>
<tr>
  <th>Message</th>
  <td>
    <form:textarea path="message"/>
  </td>            

</table>
<input type="submit" value="send Message">
</form:form>  

</body>
</html>

当按下发送按钮时,以下控制器负责在数据库中创建对象(使用 Hibernate),但它给出了“fromUser 列不能为空”的错误。表明与数据库的连接正在工作,但对象未传递给此控制器。为什么?

@RequestMapping("/sendMessage")
public String sendMessage(HttpSession session,@ModelAttribute("message") Message message, Model model){

    try{
    MessageDAO mDao = new MessageDAO();
    Message message2 = mDao.create(message);

    model.addAttribute("message", "Message was sent");
    return "success";

    } catch(Exception e){
        model.addAttribute("message", "Can't create message!");
        return "error";
    }


}

【问题讨论】:

  • 要使 MVC 控制器工作,您必须将值作为 html 表单元素传递。要呈现此 html,您可能需要使用 Spring MVC 表单库,该库需要阅读 static.springsource.org/spring/docs/current/…。所以你需要有 HTML 元素。表单的状态默认不存储在会话中,因此所有对象字段值都是由 Spring MVC 框架从 html 表单值填充的。
  • 你的意思是我不能将对象从视图传递给控制器​​吗?但正如我从这里了解的link 它说:“@ModelAttribute 在控制器中有两种使用场景。...,@ModelAttribute 将模型属性映射到 ....,这就是控制器获取对持有的对象的引用的方式表格中输入的数据。
  • 我的意思是必须先填充html表单。由于没有 html 输入元素,表单 bean 字段将为空。
  • 是的,知道了。并且使用 path= 将完成将数据绑定到对象的工作。我将它用作隐藏(如 Stefan 建议的那样)。非常感谢。

标签: jsp spring-mvc modelattribute


【解决方案1】:

调试您的 sendMessage 例程。您的表单仅包含消息字段,其他字段在技术上不是表单的一部分。要么你想将你的消息对象存储到会话中,以便 java bean 在两个请求中存活,要么你可以重复 userName、fromName 等作为隐藏字段,因此它们被映射到为 sendMessage 创建的新请求 bean。

【讨论】:

  • 是的,你是对的。我刚刚将以下代码添加到 jsp 中,然后 vollllaaaa!!它会持续存在。谢谢 :) code code
猜你喜欢
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多