我有一个包含另一个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.id我尝试打印$ {} param.widget,一切工作正常。
我的问题:为什么我不能传递一个Java类,并直接在其属性打电话? 我究竟做错了什么?
编辑:错误消息:javax.el.PropertyNotFoundException:由造成财产“身份证”不是java.lang.String类型发现
当你传递变量${widget}
也被翻译在请求时将一个字符串( widget.toString()
然后,该值被传递给第二JSP作为字符串,而不是原来的Java对象。
访问对象的值的一种方法是与属性的值设置参数的值:
<jsp:param name="widgetId" value="${widget.id}"/>
然后使用第二JSP代码波纹管:
${param.widgetId}
您还可以设置窗口小部件作为一个请求属性 ,并用它在第二页为${widget.id}
或$ {} request.widget.id。 我建议你使用第二种方法。
我设法解决我的问题与下面的代码:
<c:set var="widget" value="${widget}" scope="request" />
<jsp:include page="/SOMEWHERE/SpecialWidget.jsp"/>
谢谢两位的帮助:)它救了我的一天
<jsp:param>
传递参数作为HTTP请求的参数,它只能是一个字符串。 所以toString()
被调用的小部件,而这种方法的结果作为参数传递。
您应该使用JSP标签,作为一个标记文件来实现,而不是使用JSP包括。 见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}"/>