【问题标题】:Display param value in h:commandLink在 h:commandLink 中显示参数值
【发布时间】:2015-04-13 09:54:14
【问题描述】:

这是Home.xhtml中的commandLink

<h:commandLink action="#{booksBean.selectBook()}">
    <h:graphicImage library="images/books" name="s1.jpg"/>
    <f:param name="isbn" value="25413652" />
</h:commandLink>

但是当我想点击它时,浏览器地址栏是:

http://localhost:8080/OBS2/Home.xhtml

如何在地址和地址处添加isbn 值(25413652),并在下一页检索它(jsfbean)。

当我使用h:outputLink 时,一切都很好,但是由于h:outputLink 没有action() 方法,我无法调用bean 的selectBook()

【问题讨论】:

    标签: jsf commandlink


    【解决方案1】:

    换句话说,您想要一个 GET 链接而不是 POST 链接?在源页面中使用&lt;h:link&gt; 而不是&lt;h:commandLink&gt;,并在目标页面中使用&lt;f:viewParam&gt; 来设置基于请求参数的bean 属性,如有必要,还可以使用Converter,该ConverterString 表示一个 ISBN 号到一个具体的 Book 实例。

    例如在Home.xhtml

    <h:link outcome="Books.xhtml">
        <h:graphicImage name="images/books/s1.jpg" />
        <f:param name="isbn" value="25413652" />
    </h:link>
    

    Books.xhtml

    <f:metadata>
        <f:viewParam name="isbn" value="#{booksBean.book}" converter="isbnToBookConverter" />
    </f:metadata>
    

    使用此转换器

    @FacesConverter("isbnToBookConverter")
    public class IsbnToBookConverter {
    
        @Override
        public Object getAsString(FacesContext context, UIComponent component, Object modelValue) {
            Book book = (Book) modelValue;
            return (book != null) ? book.getIsbn() : "";
        }
    
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
            if (submittedValue == null || submittedValue.isEmpty()) {
                return null; // Let required="true" or @NotNull handle this condition.
            }
    
            String isbn = submittedValue;
            Book book = someBookService.getByIsbn(isbn);
            return book;
        }
    
    }
    

    感谢转换器,您无需任何操作即可设置所选图书。如果您需要根据设置的书执行其他操作,只需将&lt;f:viewAction&gt; 添加到&lt;f:metadata&gt;

    <f:metadata>
        <f:viewParam name="isbn" value="#{booksBean.book}" converter="isbnToBookConverter" />
        <f:viewAction action="#{booksBean.initializeBasedOnSelectedBook}" />
    </f:metadata>
    

    另见:


    与具体问题无关,注意我还修复了图片组件library属性的不当使用。为了正确使用,请前往What is the JSF resource library for and how should it be used? 并且,您最好将 XHTML 文件名小写,因为 URL 区分大小写,当用户尝试从头顶键入 URL 并且不希望使用大写字母时,这将失败(== 因此对 UX 不利)。

    【讨论】:

    • 这只是一个自定义 JSF 转换器的虚构示例。从未创建过?我用一个启动示例更新了答案。
    • 一切都很好,但是为什么地址栏中没有显示链接值?
    • 点击链接后地址栏只显示http://localhost:8080/OBS2/Books.xhtmlhttp://localhost:8080/OBS2/Home.xhtml?isbn=25413652
    • 它应该显示类似 http://localhost:8080/OBS2/Books.xhtml?isbn=25413652 的内容。
    • 我在selectBook()方法结束时返回"Books?faces-redirect=true?
    猜你喜欢
    • 2011-08-31
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多