在h:commandLink中显示参数值

时间:2015-04-13 09:54:14

标签: jsf commandlink

以下是commandLink中的Home.xhtml

<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()方法,我无法调用selectBook()的bean

1 个答案:

答案 0 :(得分:4)

换句话说,您想要一个GET链接而不是POST链接?在源页面中使用<h:link>而不是<h:commandLink>,并在目标页面<f:viewParam>中使用基于请求参数设置bean属性,如果需要,还可以使用Converter它从表示ISBN号的String转换为conrete Book实例。

E.g。在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;
    }

}

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

<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并且不期望使用资本(= =因此对用户体验不利)。