【问题标题】:How can I pass a complex object from controller to the view (jsp)如何将复杂对象从控制器传递到视图(jsp)
【发布时间】:2013-11-01 17:28:03
【问题描述】:

我需要将一个复杂的对象从 Spring MVC 控制器传递到视图,并且能够使用它的所有属性。对象本身具有其他类对象的列表,而这些对象具有其他类对象的列表,依此类推。我正在尝试从中呈现多级无序列表,该列表将用作treeView。

我可以这样做吗?如何做?

顺便说一句,我已经尝试过“定期”传递它,但我明白了

org.apache.jasper.el.JspPropertyNotFoundException: /WEB-INF/pages/index.jsp(29,8) '${rootAsObject.JWSs}' Property 'JWSs' not found on type com.model.Root

我的控制器...

@RequestMapping(method = RequestMethod.GET)
public String someFunction(ModelMap model,HttpServletRequest request) {

    model.addAttribute("rootAsAttribute", this.GenerateTreeView(appconfigProperties));
    model.addObject("rootAsObject", this.GenerateTreeView(appconfigProperties));

    return "index"; 
}

我的 index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <link href="css/style.css" rel="stylesheet" type="text/css"/>
</head>

<body>
<div style="float: left; width: 20%; height: 100%; overflow-x: scroll">
    <ul>
        <c:forEach items="${rootAsObject.JWSs}" var="jws">
            <li>${jws.ActualFile.getName()}</li>
        </c:forEach>
    </ul>
</div>
<div style="float: left; width: 80%" id="thePage">
    <iframe id="frame1" name="frame1" scrolling="auto" runat="server" style="float: left; width: 100%; height: 100%;"
            frameborder="0" scrolling="no"></iframe>
</div>
</body>
</html>

【问题讨论】:

  • 传递复杂对象的方式与传递简单对象相同:将其存储在模型中。
  • 我想我已经尝试过了。我刚刚编辑了我的问题...
  • 错误消息告诉您问题出在哪里:JSP 找到了类型为 com.model.Root 的对象。但它没有名为“JWSs”的属性。所以问题出在 com.model.Root 或 JSP 中。不在您的控制器中。编程的第一条规则:阅读错误信息。
  • 不,不,Root 100% 具有 JWS 属性,我在与此相关的其他项目中使用此模型,即使在此项目中,如果我直接从 Root 对象生成树视图,JWS 也存在。我想避免在模型中生成视图,这就是为什么我试图在 .jsp 中呈现列表
  • 如果 JSP 告诉您它没有 JWS 属性,那么它就没有。向我们展示模型的代码。顺便说一句,属性以小写字符开头。所以不,它没有 JWSs 属性。

标签: java spring jsp spring-mvc


【解决方案1】:

您可以在从控制器返回视图时向模型添加属性,并使用 JSTL 表达式访问该属性引用的对象。

【讨论】:

  • 试过了,但我收到一条异常消息。请查看已编辑的问题。
  • 如果您尝试访问对象的属性,请确保您在 bean 中有此属性并且 bean 是有效的 java bean。
  • 对于下一个问题,我很抱歉,但是“我该怎么做”?我是 Spring MVC 的 100% 新手,对 Java 也很陌生……你有什么有用的链接吗?
  • 谢谢,我会浏览它并寻找解决方案。
【解决方案2】:

将复杂视图模型传递给控制器​​的最佳方法是使用自定义模型绑定器。当数据从视图发送到控制器时,MVC 默认模型绑定器用于确定如何将数据的值绑定到视图模型。通过创建自定义模型绑定器,您可以控制值如何绑定到您的视图模型。

【讨论】:

    【解决方案3】:
    1. 传递到视图中的对象应该是有效的 Java Bean 对象。 所以所有字段都是私有的,有 getter 和 setter

    例子:

    public class Xxx implements Serializable {
       @Getter @Setter
       private String someField;
       // constructor, etc.
    }
    
    1. 您将它传递给控制器​​以通过以下方式查看:

      model.addAttribute("someName", yourJavaComplexBeanObject );

    2. 您可以通过其属性名称 (someName) 和属性名称在视图中使用它, 示例:

    &lt;p&gt;${someName.someProperty}&lt;/p&gt;

    所以你需要保持Java Bean命名约定,字段以小写开头并且有getter/setter,然后你通过字段名来使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2014-10-22
      • 1970-01-01
      • 2018-10-29
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多