1

我有一个 jsp 子视图页面,我已将参数传递给该页面,然后我想将该参数传递给存储在会话 bean 中的地图的 get() 方法。

前任:

<h:panelGrid id="panelGrid1" rendered="#{MySessionBean[param.id].showPanelGrid1}">
...
</h:panelGrid>

在上面的示例中,MySessionBean 实现了 Map 接口,并且我有自己的自定义 get 方法,如果键 [params.id] 不存在,该方法将创建一个对象并将其放入映射中。当我在调试模式下运行代码时,我的 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

我用静态字符串值替换了 [param.id]。

<h:panelGrid id="panelGrid1" rendered="#{MySessionBean.MY_TEMP_VAL.showPanelGrid1}">
  ...
</h:panelGrid>

一切正常。它触发了我的 map get 方法并访问了会话 bean 和所有内容。因此,使用 [params.id] 传递给地图对象显然不喜欢整体。不知道从这里做什么。

4

1 回答 1

2

在 JSF2 中,适当且简单的解决方案是使用复合组件。由于您受困于 JSF 1.2 和 jsp,因此您可以改用标记文件。这些类似于常规 jsps,但带有扩展名tagtagx并放在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>
于 2011-11-23T10:12:25.247 回答