以下是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
),并在下一页(jsf
或bean
)检索它。
当我使用h:outputLink
时,每件事情都很好,但由于h:outputLink
没有action()
方法,我无法调用selectBook()
的bean
答案 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并且不期望使用资本(= =因此对用户体验不利)。