Spring 升级后,与搜索命令按钮一起使用的全局过滤器不会更新数据表
Global filter used with search commandbutton doesn't update datatable after Spring upgrade
我在使用 commandButton 更新数据表时遇到了一些问题。
我检查过:
Primefaces - update datatable with commandButton doesn't work
但我看不出问题所在:
我使用 commandButton onclick 来搜索 globalFilter。延迟加载没问题,但过滤器仅在我按下搜索按钮时才起作用,然后按下另一个更新按钮来更新数据表。
搜索按钮过滤器 onclick。
更新按钮将 onclick 重定向到 getPaginator().setPage(0),显示更新数据表。这是我看到更新数据表的唯一方法
我尝试将 comandButton 和 actionListener 中的 form:datatable 更新为 bean.resetDatable() 但没有成功。
我只需要按下搜索按钮并在一个按钮中同时更新数据表。
<h:form id="myDataForm">
<p:dataTable id="MyData" rowStatePreserved="true"
var="varMyData"
value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"
widgetVar="wMyData"
rowKey="#{MyData.id}"
paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
emptyMessage="No data" >
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search: " />
<p:inputText id="globalFilter" onkeypress="PF('wMyData').filter();" />
<p:commandButton value="Search" class="ui-button" icon="fa fa-search" onclick="PF('wMyData').filter();"
update=":myDataForm:MyData" actionListener="#{MyData.resetDatatable()}"/>
<p:commandButton value="Update" onclick="VarMyData.getPaginator().setPage(0);"/>
</p:outputPanel>
</f:facet>
<p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"
filterStyle="display:none" filterBy="#{varMyData.idNumber}" filterMatchMode="exact" >
<h:outputText value="#{varMyData.idNumber}" />
</p:column>
</datatable>
</form>
我尝试用 lazydatamodel 重置为 null 和 PrimeFaces.current(),但没有任何效果。
myDataView.java
public MyDataLazyDataModel getMyDataLazyDataModel() {
if (myDataLazyDataModel == null) {
myDataLazyDataModel= new MyDataLazyDataModel(getListAll());
}
return myDataLazyDataModel;
}
public void setMyDataLazyDataModelT(MyDataLazyDataModel myDataLazyDataModel) {
this.myDataLazyDataModel = myDataLazyDataModel;
}
public String resetDatatable() {
//option1:
myDataLazyDataModel = null;
//option2
DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("myDataForm:myData");
PrimeFaces.current().ajax().update("myDataForm:myData");
if (!dataTable.getFilters().isEmpty()) {
dataTable.reset();
PrimeFaces.current().ajax().update("myDataForm:MyData");
}
谢谢。
我检查了控制台,问题与 Spring 3 到 Spring 4 升级和 ajax "gives 403 Forbidden" 没有提交 crsf 令牌有关。
提交crsf令牌后:
https://www.baeldung.com/spring-security-csrf
<h:head>
.....
<meta name="_csrf" content="#{_csrf.token}"/>
<meta name="_csrf_header" content="#{_csrf.headerName}"/>
....
</h:head>
我创建了一个全局过滤器,现在我可以在按搜索按钮或回车键后进行过滤,
并且更新了数据表。
<h:form id="myDataForm">
<p:dataTable id="MyData" rowStatePreserved="true"
var="varMyData"
value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"
widgetVar="wMyData"
rowKey="#{MyData.id}"
paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
emptyMessage="No data" >
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search: " />
<p:inputText id="globalFilter" onkeypress="if (event.keyCode === 13) {PF('wMyData').filter(); return false;}"
placeholder="Enter data and press enter or search button"/>
<p:commandButton class="ui-button" icon="fa fa-search" onclick="PF('wMyData').filter() " update="growl"/>
</p:outputPanel>
</f:facet>
<p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"
filterStyle="display:none" filterBy="#{varMyData.idNumber}" filterMatchMode="exact" >
<h:outputText value="#{varMyData.idNumber}" />
</p:column>
</datatable>
</h:form>
我在使用 commandButton 更新数据表时遇到了一些问题。
我检查过:
Primefaces - update datatable with commandButton doesn't work
但我看不出问题所在:
我使用 commandButton onclick 来搜索 globalFilter。延迟加载没问题,但过滤器仅在我按下搜索按钮时才起作用,然后按下另一个更新按钮来更新数据表。
搜索按钮过滤器 onclick。 更新按钮将 onclick 重定向到 getPaginator().setPage(0),显示更新数据表。这是我看到更新数据表的唯一方法
我尝试将 comandButton 和 actionListener 中的 form:datatable 更新为 bean.resetDatable() 但没有成功。
我只需要按下搜索按钮并在一个按钮中同时更新数据表。
<h:form id="myDataForm">
<p:dataTable id="MyData" rowStatePreserved="true"
var="varMyData"
value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"
widgetVar="wMyData"
rowKey="#{MyData.id}"
paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
emptyMessage="No data" >
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search: " />
<p:inputText id="globalFilter" onkeypress="PF('wMyData').filter();" />
<p:commandButton value="Search" class="ui-button" icon="fa fa-search" onclick="PF('wMyData').filter();"
update=":myDataForm:MyData" actionListener="#{MyData.resetDatatable()}"/>
<p:commandButton value="Update" onclick="VarMyData.getPaginator().setPage(0);"/>
</p:outputPanel>
</f:facet>
<p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"
filterStyle="display:none" filterBy="#{varMyData.idNumber}" filterMatchMode="exact" >
<h:outputText value="#{varMyData.idNumber}" />
</p:column>
</datatable>
</form>
我尝试用 lazydatamodel 重置为 null 和 PrimeFaces.current(),但没有任何效果。
myDataView.java
public MyDataLazyDataModel getMyDataLazyDataModel() {
if (myDataLazyDataModel == null) {
myDataLazyDataModel= new MyDataLazyDataModel(getListAll());
}
return myDataLazyDataModel;
}
public void setMyDataLazyDataModelT(MyDataLazyDataModel myDataLazyDataModel) {
this.myDataLazyDataModel = myDataLazyDataModel;
}
public String resetDatatable() {
//option1:
myDataLazyDataModel = null;
//option2
DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("myDataForm:myData");
PrimeFaces.current().ajax().update("myDataForm:myData");
if (!dataTable.getFilters().isEmpty()) {
dataTable.reset();
PrimeFaces.current().ajax().update("myDataForm:MyData");
}
谢谢。
我检查了控制台,问题与 Spring 3 到 Spring 4 升级和 ajax "gives 403 Forbidden" 没有提交 crsf 令牌有关。
提交crsf令牌后: https://www.baeldung.com/spring-security-csrf
<h:head>
.....
<meta name="_csrf" content="#{_csrf.token}"/>
<meta name="_csrf_header" content="#{_csrf.headerName}"/>
....
</h:head>
我创建了一个全局过滤器,现在我可以在按搜索按钮或回车键后进行过滤, 并且更新了数据表。
<h:form id="myDataForm">
<p:dataTable id="MyData" rowStatePreserved="true"
var="varMyData"
value="#{MyData.MyDataLazyDataModel}" lazy="true" filterDelay="1000"
widgetVar="wMyData"
rowKey="#{MyData.id}"
paginator="true" paginatorPosition="bottom" rows="10"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
emptyMessage="No data" >
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search: " />
<p:inputText id="globalFilter" onkeypress="if (event.keyCode === 13) {PF('wMyData').filter(); return false;}"
placeholder="Enter data and press enter or search button"/>
<p:commandButton class="ui-button" icon="fa fa-search" onclick="PF('wMyData').filter() " update="growl"/>
</p:outputPanel>
</f:facet>
<p:column id ="numdoc" headerText="ID number" sortBy="#{varMyData.idNumber}"
filterStyle="display:none" filterBy="#{varMyData.idNumber}" filterMatchMode="exact" >
<h:outputText value="#{varMyData.idNumber}" />
</p:column>
</datatable>
</h:form>