2012-11-21 58 views
14

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

这是我有:

第一个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:致属性的“id”上java.lang.String类型没有发现

回答

9

当您通过变量${widget}它在请求时被翻译为字符串(widget.toString())。然后将该值作为字符串传递给第二个JSP,而不是原始的Java对象。访问对象的值

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

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

然后用第二JSP代码波纹管:

${param.widgetId} 

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

+0

我知道如何在servlet的帮助下设置一个请求参数。我不知道的是如何将此参数传递给包含的文件。你能解释一下如何实现这一点吗? –

6

<jsp:param>传递参数作为HTTP请求的参数,它只能是一个串。因此,toString()在您的小部件上被调用,并且此方法的结果作为参数传递。

您应该使用一个JSP标记,作为标记文件实现,而不是使用JSP include。有关如何定义使用它们的信息,请参阅http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

例如:

标签definintion,在/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}"/> 
+0

感谢您的帮助。你能举一个这个工作原理的基本例子吗?在研究了您发送的链接之后,我不太清楚如何将其用于解决问题。 –

+0

查看我的编辑示例。 –

10

我设法解决我的问题与下面的代码:

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

谢谢两位的帮助:)它救了我的一天

+0

帮助我的技巧是添加scope =“request” – jeff