14

我有一个包含另一个 JSP 文件的 JSP 文件。第一个 JSP 应该将 Java 类(小部件)的实例传递给第二个 JSP 文件。

这就是我所拥有的:

第一个 JSP:

<jsp:include page="/container/SpecialWidget.jsp">
     <jsp:param name="widget" value="${widget}"/> // widget is a .Java POJO
</jsp:include>

第二个JSP:

${param.widget.id}

问题是这段代码给出了一个错误(它说它不知道 ID)。如果我省略“.id”部分,页面将打印 Java 类的 Java 代码,这意味着该类已正确传输。如果我更改第一页的 ${widget} 规则,例如 ${widget.id} 并尝试打印 ${param.widget},一切正常。

我的问题:为什么我不能传递一个 Java 类并直接调用它的属性?我究竟做错了什么?

编辑:错误消息:原因:javax.el.PropertyNotFoundException:在 java.lang.String 类型上找不到属性“id”

4

3 回答 3

10

我设法用以下代码解决了我的问题:

<c:set var="widget" value="${widget}" scope="request" />
<jsp:include page="/SOMEWHERE/SpecialWidget.jsp"/>

谢谢你们的帮助:)它拯救了我的一天

于 2012-11-22T09:59:39.360 回答
9

当您传递变量${widget}时,它会在请求时转换为字符串 ( widget.toString())。然后将该值作为字符串传递给第二个 JSP,而不是作为原始 java 对象。

访问对象值的一种方法是使用属性值设置参数值:

<jsp:param name="widgetId" value="${widget.id}"/>

然后在第二个 JSP 上使用下面的代码:

${param.widgetId}

您还可以将小部件设置为请求属性,并在第二页上将其用作${widget.id}或 ${request.widget.id}。我建议你使用第二种方法。

于 2012-11-21T16:05:18.970 回答
6

<jsp:param>将参数作为 HTTP 请求参数传递,该参数只能是 String。在您的小部件上调用so toString(),并将此方法的结果作为参数传递。

您应该使用作为标记文件实现的 JSP 标记,而不是使用 JSP 包含。请参阅http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html了解如何定义使用它们。

例如:

标签定义,在 /WEB-INF/tags/specialWidget.tag 中:

<%@ tag %>
<%@ attribute name="widget" required="true" type="the.fully.qualified.name.of.WidgetClass" %>
TODO: add the HTML markup that must be displayed, using ${widget} to access the passed in widget attribute

标记用法,在任何 JSP 中:

<%@ taglib prefix="myTags" tagdir="/WEB-INF/tags" %>
...
Tada! I will use the specialWidget tag here, with widget as an attribute:
<myTags:specialWidget widget="${widget}"/>
于 2012-11-21T15:54:31.310 回答