Joh*_*rik 14 java jsp param parameter-passing include
我有一个包含另一个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>
Run Code Online (Sandbox Code Playgroud)
第二个JSP:
${param.widget.id}
Run Code Online (Sandbox Code Playgroud)
问题是这段代码出错了(它说它不知道ID).如果省略".id"部分,页面将打印Java类的Java代码,这意味着该类已正确传输.如果我更改第一页的$ {widget}规则,例如$ {widget.id},我尝试打印$ {param.widget},一切正常.
我的问题:为什么我不能传递Java类并直接调用它的属性?我究竟做错了什么?
编辑:错误消息:引起:javax.el.PropertyNotFoundException:在类型java.lang.String上找不到属性'id'
Joh*_*rik 10
我设法使用以下代码修复了我的问题:
<c:set var="widget" value="${widget}" scope="request" />
<jsp:include page="/SOMEWHERE/SpecialWidget.jsp"/>
Run Code Online (Sandbox Code Playgroud)
谢谢你们的帮助:)它救了我的一天
传递变量时,${widget}它会在请求时转换为字符串(widget.toString()).然后,此值将作为String传递给第二个JSP,而不是原始java对象.
访问对象值的一种方法是使用属性的值设置参数的值:
<jsp:param name="widgetId" value="${widget.id}"/>
Run Code Online (Sandbox Code Playgroud)
然后在第二个JSP上使用以下代码:
${param.widgetId}
Run Code Online (Sandbox Code Playgroud)
您还可以将小部件设置为请求属性,并在第二页上将其用作${widget.id}$ {request.widget.id}.我建议你使用第二种方法.
<jsp:param>将参数作为HTTP请求参数传递,该参数只能是String.因此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
Run Code Online (Sandbox Code Playgroud)
任何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}"/>
Run Code Online (Sandbox Code Playgroud)