PrimeFaces 数据表排序
PrimeFaces DataTable sorting
我是 JSF 新手,在数据表中排序时遇到问题。我使用 Tomcat 7 和 Jetty 9(用于测试的 Jetty)和带有 JSF-2.2 的 PrimeFaces 5.1。
我在数据表的页面上显示一些结果。我想要这个 sortable,使用我的代码,列显示排序箭头,但单击它们不会对 table 进行排序,它只是更改列中的 sort-indicator 箭头header。
我知道 question , but the solution in that does not work and contradicts the code in the PrimeFaces showcase.
我做了一个小样本来演示这个问题:
table.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form>
<p:dataTable value="#{tableTest.list}" var="token">
<p:column headerText="Fisch" sortBy="#{token}">
<h:outputText value="#{token}"/>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
支持 bean:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@RequestScoped
public class TableTest {
public List<String> getList() {
return Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
}
}
web.xml中的servlet映射:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
<!-- Production -->
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<!-- HTML comments become components unless they're stripped -->
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
当我使用 firefox 的调试模式检查 newtork 时,我看到单击排序后的以下响应:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1">
<changes>
<update id="j_idt4:j_idt5">
<![CDATA[
<tr data-ri="0" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Aal</td>
</tr><tr data-ri="1" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Zander</td>
</tr>
<tr data-ri="2" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Barsch</td>
</tr>
<tr data-ri="3" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Brasse</td>
</tr>
<tr data-ri="4" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Wels</td>
</tr><tr data-ri="5" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Feldchen</td>
</tr>]]>
</update>
<update id="j_id1:javax.faces.ViewState:0">
<![CDATA[5844788699585149238:6667543622103173254]]>
</update>
</changes>
</partial-response>
我是 JSF 的新手,不知道如何让排序工作。有人可以帮助我使排序功能正常工作吗?
您可能想要查看支持 bean 的范围并添加一个列表 属性,如下所示:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@ViewScoped
public class TableTest {
private List<String> fishList;
@PostConstruct
public void init() {
this.fishList = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
}
public List<String> getFishList() {
return this.fishList;
}
}
确切地说:视图范围是可选的,但您需要一个真实的 属性。
所以这个例子也可以,虽然我不推荐它:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@RequestScoped
public class TableTest {
private List<String> list = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
public List<String> getList() {
return list;
}
}
此行为的原因是,属性(列表)在请求期间被多次访问。
在您的示例中,每次访问 属性 时,您总是 return 一个新列表(Arrays.asList 创建一个具有新 ID 的新列表)。
然而,列表排序似乎只有在列表对象在请求期间保持不变时才有效。
我是 JSF 新手,在数据表中排序时遇到问题。我使用 Tomcat 7 和 Jetty 9(用于测试的 Jetty)和带有 JSF-2.2 的 PrimeFaces 5.1。 我在数据表的页面上显示一些结果。我想要这个 sortable,使用我的代码,列显示排序箭头,但单击它们不会对 table 进行排序,它只是更改列中的 sort-indicator 箭头header。 我知道 question , but the solution in that does not work and contradicts the code in the PrimeFaces showcase.
我做了一个小样本来演示这个问题:
table.xhtml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head></h:head>
<h:body>
<h:form>
<p:dataTable value="#{tableTest.list}" var="token">
<p:column headerText="Fisch" sortBy="#{token}">
<h:outputText value="#{token}"/>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
支持 bean:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@RequestScoped
public class TableTest {
public List<String> getList() {
return Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
}
}
web.xml中的servlet映射:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
<!-- Production -->
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<!-- HTML comments become components unless they're stripped -->
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
当我使用 firefox 的调试模式检查 newtork 时,我看到单击排序后的以下响应:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1">
<changes>
<update id="j_idt4:j_idt5">
<![CDATA[
<tr data-ri="0" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Aal</td>
</tr><tr data-ri="1" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Zander</td>
</tr>
<tr data-ri="2" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Barsch</td>
</tr>
<tr data-ri="3" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Brasse</td>
</tr>
<tr data-ri="4" class="ui-widget-content ui-datatable-even" role="row">
<td role="gridcell">Wels</td>
</tr><tr data-ri="5" class="ui-widget-content ui-datatable-odd" role="row">
<td role="gridcell">Feldchen</td>
</tr>]]>
</update>
<update id="j_id1:javax.faces.ViewState:0">
<![CDATA[5844788699585149238:6667543622103173254]]>
</update>
</changes>
</partial-response>
我是 JSF 的新手,不知道如何让排序工作。有人可以帮助我使排序功能正常工作吗?
您可能想要查看支持 bean 的范围并添加一个列表 属性,如下所示:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@ViewScoped
public class TableTest {
private List<String> fishList;
@PostConstruct
public void init() {
this.fishList = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
}
public List<String> getFishList() {
return this.fishList;
}
}
确切地说:视图范围是可选的,但您需要一个真实的 属性。 所以这个例子也可以,虽然我不推荐它:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.Arrays;
import java.util.List;
@ManagedBean(name = "tableTest")
@RequestScoped
public class TableTest {
private List<String> list = Arrays.asList("Aal","Zander","Barsch","Brasse","Wels","Feldchen");
public List<String> getList() {
return list;
}
}
此行为的原因是,属性(列表)在请求期间被多次访问。 在您的示例中,每次访问 属性 时,您总是 return 一个新列表(Arrays.asList 创建一个具有新 ID 的新列表)。 然而,列表排序似乎只有在列表对象在请求期间保持不变时才有效。