【问题标题】:JSP to Facelets equivalent for database provided URL linking in loopJSP 到 Facelets 等效于数据库提供的 URL 循环链接
【发布时间】:2012-01-04 14:22:07
【问题描述】:

我正在将 servlet/jsp Netbeans 的 Affableben 教程移植到 JSF 框架,并希望将 Facelets 用于视图。

我已经有了 JPA 实体、会话 bean 和托管 bean。我从视图开始。但是,我还没有在 Facelets 中找到可以解决这一行的等效项:

<a href="<c:url value='category?${category.id}'/>">

这是完整的循环,包括 jsp 和 facelets:

JSP 代码:

<c:forEach var="category" items="${categories}">
    <div class="categoryBox">
        <a href="<c:url value='category?${category.id}'/>">
            <span class="categoryLabel"></span>
            <span class="categoryLabelText"><fmt:message key='${category.name}'/></span>

            <img src="${initParam.categoryImagePath}${category.name}.jpg"
                 alt="<fmt:message key='${category.name}'/>" class="categoryImage">
        </a>
    </div>
</c:forEach>

等效的 Facelets 代码:

<ui:repeat var="category" value="${categoryController.items}">
    <div class="categoryBox">
        <h:link outcome="${category.id}"/>
        <span class="categoryLabel"></span>
        <span class="categoryLabelText">${category.name}</span>

        <img src="./resources/img/categories/${category.name}.jpg"
                 alt="${category.name}" class="categoryImage"/>

    </div>
</ui:repeat>

此行在 Facelets 中无法正常工作:

<h:link outcome="${category.id}"/>

Facelets 中的等效功能是什么?

编辑 1

public String getName() throws UnsupportedEncodingException {
    return URLEncoder.encode(name, "UTF-8");
}

警告信息:无法找到资源 img/categories/fruit+%26+veg.jpg

【问题讨论】:

    标签: jsf-2 facelets


    【解决方案1】:

    &lt;h:link&gt; 使用 JSF 隐式导航并需要一个真实的(隐式)导航结果值。您需要在结果中指定视图 ID。需要通过&lt;f:param&gt;指定请求参数。您还需要像在初始示例中那样在链接中嵌套跨度和图像。假设您在根目录中有一个 category.xhtml 文件,应该这样做:

    <h:link outcome="category">
        <f:param name="id" value="#{category.id}" />
    
        <span class="categoryLabel"></span>
        <span class="categoryLabelText">#{category.name}</span>
        <img src="./resources/img/categories/#{category.name}.jpg"
                 alt="#{category.name}" class="categoryImage"/>
    </h:link>
    

    与具体问题无关,您也应该使用&lt;h:graphicImage&gt; 而不是&lt;img&gt;。这样 JSF 将确保正确设置 src。在您的特定情况下,这将是

    <h:graphicImage name="img/categories/#{category.name}.jpg"
        alt="#{category.name}" class="categoryImage"/>
    

    (请注意,我将 ${} 替换为 #{},只是为了遵守标准和一致性)

    【讨论】:

    • 感谢您的快速回复,这对我帮助很大。只是一个问题:<:choose> 的 Facelets 等效或解决方法是什么? (如果这不相关,我会发布一个新线程,告诉我)
    • 啊,我忘了。使用 代替 如果图像的名称字符串已从数据库中获取并且其字段值包含与号或空格,例如“fruit & veg”,则不会呈现图像。
    • 1) 使用 JSF 组件的rendered 属性。 2) URL 中不应包含无效字符。使用URLEncoder
    • String encoded = URLEncoder.encode(raw, "UTF-8");。在 URL 中使用此 encoded 值。
    • 我导入了需要的库,编辑了category实体类,在name getter方法中加了一点代码。它不显示图像。请参阅上面初始线程中的 EDIT 1。
    【解决方案2】:

    你可以从这一行改变:

    <a href="<c:url value='category?${category.id}'/>">
    

    到这里:

    <h:link outcome="category.xhtml?id=#{category.id}" />
    <h:link outcome="category">
       <f:param name="id" value="#{category.id}" />
    </h:link>
    <h:outputLink value="category.xhtml?id=#{category.id}" ></h:outputLink>
    

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      相关资源
      最近更新 更多