我有一个jsp子视图页面,我已经向它传递了一个参数,然后我想将该参数传递给存储在会话bean中的映射的get()方法。
,
<h:panelGrid id="panelGrid1" rendered="#{MySessionBean[param.id].showPanelGrid1}">
...
</h:panelGrid>
在上面的例子中,MySessionBean实现了Map接口,我有自己的自定义get方法,如果键[params.id]不存在,它将创建一个对象并将其放入Map中。当我在调试模式下运行代码时,MySessionBean的get方法永远不会被调用,我的面板总是被呈现。我没有正确传递参数吗?或者正确访问传递给子视图的参数?
下面是我如何将参数传递给子视图的:<f:subview id="subview1">
<jsp:include page="/MyTemplatePage.jsp">
<jsp:param name="id" value="staticUniqueId1"/>
</jsp:include>
</f:subview>
我试图这样做的原因是,我可以在一个页面中多次包含此模板子视图,以便每个实例不会有相同的支持bean对象。因此,在会话中使用映射并向其传递id以获得对每个实例的支持bean的访问权。
此外,我还限制了JSF 1.2、JSTL 1.1、JBoss 4.0.4。所以我不能使用使用RichFaces或JSF 2的答案。
编辑:11/22/11 11:23
I替换[参数。Id]使用静态字符串值。
<h:panelGrid id="panelGrid1" rendered="#{MySessionBean.MY_TEMP_VAL.showPanelGrid1}">
...
</h:panelGrid>
一切都很顺利。它触发了我的map get方法并访问了会话bean和所有东西。所以它显然不喜欢整个使用[参数]。传递给map对象。我不知道该怎么办
在JSF2中,正确而简单的解决方案是使用组合组件。由于您只能使用JSF 1.2和jsp,因此可以使用标记文件代替。这些类似于常规jsp,但扩展名为tag
或tagx
,并置于WEB-INF/tags
之下。在下面的示例中,我在文件名example.tagx
中使用xml语法:
<jsp:root version="2.1"
xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:h="http://java.sun.com/jsf/html">
<jsp:directive.attribute name="myBean"
required="true"
rtexprvalue="false"
deferredValue="true"
deferredValueType="com.example.MyBean"/>
<h:panelGrid id="panelGrid1" rendered="#{myBean.showPanelGrid1}">
...
</h:panelGrid>
</jsp:root>
在jspx中,您必须像xmlns:myTags="urn:jsptagdir:/WEB-INF/tags/"
一样声明名称空间,在jsp中,语法将是:
<%@taglib tagdir="/WEB-INF/tags" prefix="myTags" %>
自定义标记可以在页面上多次使用,并且可以像这样将正确的支持bean作为属性传递:
<myTags:example myBean="#{myBeanInstance1}" />
编辑:您可能还需要一个文件WEB-INF/tags/implicit.tld
来指定版本:
<?xml version = '1.0' encoding = 'UTF-8'?>
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
<tlib-version>2.1</tlib-version>
</taglib>