我找到了this JSF教程,该教程展示了如何使用分页和排序创建JSF表
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<f:view>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Effective datatable paging and sorting at DAO level</title>
</head>
<body>
<h:form id="form">
<%-- The sortable datatable --%>
<h:dataTable value="#{myBean.dataList}" var="item">
<h:column>
<f:facet name="header">
<h:commandLink value="ID" actionListener="#{myBean.sort}">
<f:attribute name="sortField" value="id" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Name" actionListener="#{myBean.sort}">
<f:attribute name="sortField" value="name" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Value" actionListener="#{myBean.sort}">
<f:attribute name="sortField" value="value" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.value}" />
</h:column>
</h:dataTable>
<%-- The paging buttons --%>
<h:commandButton value="first" action="#{myBean.pageFirst}"
disabled="#{myBean.firstRow == 0}" />
<h:commandButton value="prev" action="#{myBean.pagePrevious}"
disabled="#{myBean.firstRow == 0}" />
<h:commandButton value="next" action="#{myBean.pageNext}"
disabled="#{myBean.firstRow + myBean.rowsPerPage >= myBean.totalRows}" />
<h:commandButton value="last" action="#{myBean.pageLast}"
disabled="#{myBean.firstRow + myBean.rowsPerPage >= myBean.totalRows}" />
<h:outputText value="Page #{myBean.currentPage} / #{myBean.totalPages}" />
<br />
<%-- The paging links --%>
<t:dataList value="#{myBean.pages}" var="page">
<h:commandLink value="#{page}" actionListener="#{myBean.page}"
rendered="#{page != myBean.currentPage}" />
<h:outputText value="<b>#{page}</b>" escape="false"
rendered="#{page == myBean.currentPage}" />
</t:dataList>
<br />
<%-- Set rows per page --%>
<h:outputLabel for="rowsPerPage" value="Rows per page" />
<h:inputText id="rowsPerPage" value="#{myBean.rowsPerPage}" size="3" maxlength="3" />
<h:commandButton value="Set" action="#{myBean.pageFirst}" />
<h:message for="rowsPerPage" errorStyle="color: red;" />
<%-- Cache bean with data list, paging and sorting variables for next request --%>
<t:saveState value="#{myBean}" />
</h:form>
</body>
</html>
</f:view>
这个表可以在没有Tomahawk
库的情况下使用吗?我想尽可能多地使用干净的JSF?是否可以使用标准JSF标记编辑此代码,而无需更改分页和排序?
祝福
答案 0 :(得分:3)
那篇旧文章的目标是JSF 1.x,该代码旨在与请求范围的bean一起使用。 <t:saveState>
确保请求范围bean保留在下一个POST请求中,就像新的JSF 2.x视图范围一样(因此在标准JSF 1.x中不存在)。会话范围不是一个选项,因为它会导致不直观的行为和“wtf?”当最终用户在多个浏览器窗口/选项卡中打开同一页面时的情况,因此每个基于请求的操作都会影响同一页面在另一个窗口/选项卡中的行为,以及当最终用户在它们之间切换并调用基于请求的操作时
对于JSF 2.x,可以通过将bean标记为<t:saveState>
来将bean替换为视图范围而不是请求范围来替换@ViewScoped
。
@ManagedBean
@ViewScoped
public class MyBean {
// ...
}
另请注意,本文使用的是旧的JSP视图技术。自JSF 2.0以来,Facelets已经成功实现了这一目标。您还希望通过Facelets替换JSP。通过顶级标记(<html>
标记)中常用的XML名称空间声明删除这些JSP标记库,并将文件从.jsp
重命名为.xhtml
。这样,您就可以将<t:dataList>
替换为JSP中不存在的<ui:repeat>
。
<ui:repeat value="#{myBean.pages}" var="page">
...
</ui:repeat>