我有一个jsp子视图页面,我已经传递了一个参数,然后我想将该参数传递给存储在会话bean中的map的get()方法。
例如:
<h:panelGrid id="panelGrid1" rendered="#{MySessionBean[param.id].showPanelGrid1}">
...
</h:panelGrid>
在上面的示例中,MySessionBean实现了Map接口,我有自己的自定义get方法,如果密钥[params.id]不存在,它将创建一个对象并将其放入映射中。当我在调试模式下运行代码时,MySessionBean的get方法永远不会被调用,我的面板总是被渲染。我没有正确传递参数吗?或者访问传递给子视图的参数correclty?
以下是我将参数传递给此子视图的方法:
<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
我用静态字符串值替换了[param.id]。
<h:panelGrid id="panelGrid1" rendered="#{MySessionBean.MY_TEMP_VAL.showPanelGrid1}">
...
</h:panelGrid>
一切顺利。它触发了我的map get方法并访问了会话bean和所有内容。因此,使用[params.id]传递给地图对象显然不喜欢整体。不知道该怎么做。
答案 0 :(得分:2)
在JSF2中,正确而简单的解决方案是使用复合组件。由于您坚持使用JSF 1.2和jsp,因此您可以使用tag files。这些与常规jsps类似,但扩展名为tag
或tagx
,位于WEB-INF/tags
下。我在下面的示例中使用xml语法,文件名为example.tagx
:
<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>