Ajax 加载数据时出现问题
我在页面中有多个表单,每个表单都有数据表。 选择时,映射到该控件的datatable应显示在页面上。 使用primefaces开发应用程序时遇到以下异常:Ajax 加载数据时出现问题,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,我在页面中有多个表单,每个表单都有数据表。 选择时,映射到该控件的datatable应显示在页面上。 使用primefaces开发应用程序时遇到以下异常: javax.faces.view.facelets.TagAttributeException: //C:/Workspace/Application/WebContent/transfer.xhtml @28,102 rendered="#{transferMB.mySelectedValues('1')}" Error Parsing
javax.faces.view.facelets.TagAttributeException: //C:/Workspace/Application/WebContent/transfer.xhtml @28,102 rendered="#{transferMB.mySelectedValues('1')}" Error Parsing: #{transferMB.mySelectedValues('1')}
at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:428)
at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:378)
at com.sun.faces.facelets.tag.jsf.ComponentRule$ValueExpressionMetadata.applyMetadata(ComponentRule.java:107)
at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
Caused by: javax.el.ELException: Error Parsing: #{transferMB.mySelectedValues('1')}
at com.sun.el.lang.ExpressionBuilder.createNodeInternal(Unknown Source)
at com.sun.el.lang.ExpressionBuilder.build(Unknown Source)
at com.sun.el.lang.Expres
sionBuilder.createValueExpression(Unknown Source)
at com.sun.el.ExpressionFactoryImpl.createValueExpression(Unknown Source)
at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:412)
... 94 more
您应该使用逗号分隔要更新的表单,如:
<p:ajax update=":transForm, :sprdForm" />
这意味着有两个表单需要更新。如果您的代码如下:
<p:ajax update=":transForm :sprdForm" />
表示您要在
转换中更新sprdForm
,这是不可能的,因为您无法将表单放入另一个表单中。您正在尝试将列表与单个字符串进行比较:
rendered="#{transferMB.selectedItems == '1'}"
但是,您应该检查列表是否包含以下单个字符串:
在html中:
rendered="#{denemeBean.controlSelectedValues('1')}"
在bean类中:
// list should be initialized (unless, we'll get NullPointer
// when using the below method)
private List<String> selectedItems = new ArrayList<>();
// This methods returns true if parameter is included in the
// list of selected items
public boolean controlSelectedValues(String needed) {
for (String string : selectedItems) {
if (string.equals(needed)) {
return true;
}
}
return false;
}
//应该初始化列表(除非我们得到null指针
//使用以下方法时)
private List selectedItems=new ArrayList();
//如果参数包含在
//选定项目列表
公共布尔控制SelectedValues(需要字符串){
for(字符串:selectedItems){
if(string.equals(需要)){
返回true;
}
}
返回false;
}
最后,我不确定是否真的需要将这些数据表放入表单中。
下面您可以看到我所处理的工作副本:(当然,您应该用datatables替换OutputText)
//bean文件
导入java.util.List;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ViewScoped;
@ManagedBean(name=“denemeBean”)
@视域
公共类DenemeBean实现了可序列化{
private List selectedItems=new ArrayList();
/**
*@返回selectedItems
*/
公共列表getSelectedItems(){
返回selectedItems;
}
/**
*@param selectedItems要设置的selectedItems
*/
公共无效设置selectedItems(列出selectedItems){
this.selectedItems=selectedItems;
}
公共布尔控制SelectedValues(需要字符串){
for(字符串:selectedItems){
if(string.equals(需要)){
返回true;
}
}
返回false;
}
}
//html文件:
使用
是完全有效的。
这里还有很多其他问题
第一点:渲染属性将列表与字符串进行比较(selectedItems=='1'
)。它应该测试列表是否包含字符串(selectedItems.contains('1')
)。(注意:您必须为此使用EL 2.2)
第二点是:我认为
需要columns
-属性。
我精简了您的代码,这对我来说很好:
<h:body>
<h:form>
<p:selectManyCheckbox value="#{transferMB.selectedItems}">
<f:selectItem itemValue="1" itemLabel="Transfer Status" />
<f:selectItem itemValue="2" itemLabel="Spread Status" />
<f:selectItem itemValue="3" itemLabel="Number1 - 3" />
<p:ajax update=":transForm :sprdForm"/>
</p:selectManyCheckbox>
</h:form>
<h:form id="transForm">
<p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('1')}">
transForm
</p:panelGrid>
</h:form>
<h:form id="sprdForm">
<p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('2')}">
sprdForm
</p:panelGrid>
</h:form>
</h:body>
使改变
喷射成形
我使用
是因为
带有内部
导致java.lang.ClassCastException:java.lang.Boolean无法转换为org.primefaces.component.api.ClientBehaviorRenderingMode
。我认为这可能是我的JSF实现JSF-impl-2.1.7-jbossorg-2.jar中的一个bug。是否调用selectedItems的setter?您可以尝试使用
在上面的文章中提到的尝试时遇到以下异常:“rendered=“#{searchMB.controlSelectedValues('1')}”错误解析:#{transferMB.controlSelectedValues('1')}”。控制台上的异常:1100:JSF1073:javax.faces.view.facelets.TagAttributeException在处理RENDER_响应6时捕获@ISHKAFELStackTrace中的根异常是什么?根据所提供的信息,我们只能猜测。始终检查NullPointerException(列表已初始化?)。您在评论中也提到了searchMB和transferMB,请检查您的代码:您使用哪一个?方法controlSelectedValues
基本上与列表中的contains
相同,为什么不使用它呢?我发现你在哪里问了同样的问题。请看我的建议贴在那里我试过了,正如你提到的,它在页面上抛出了异常。“rendered=“#{searchMB.controlSelectedValues('1')}”错误解析:#{transferMB.controlSelectedValues('1')}”。控制台上的异常:1100:JSF1073:javax.faces.view.facelets.TagAttributeException在处理RENDER_RESPONSE 6@Null Pointer.done时捕获,正如您所建议的,面临异常。请查看上面修改的帖子并包含异常-@Null指针。我猜您不能在调用中传递参数。(与表达语言(EL)有关,但我不知道细节)。因此,您需要将此调用相关的控制方法更改为非参数样式。例如:“rendered=“#{denemeBean.controlTableA}”和“public boolean controlTableA(){controlSelectedValues(“1”);}”这样,每个控件都有一个方法。这些方法使用必要的参数调用我们的主方法。
<h:body>
<h:form>
<p:selectManyCheckbox value="#{transferMB.selectedItems}">
<f:selectItem itemValue="1" itemLabel="Transfer Status" />
<f:selectItem itemValue="2" itemLabel="Spread Status" />
<f:selectItem itemValue="3" itemLabel="Number1 - 3" />
<p:ajax update=":transForm :sprdForm"/>
</p:selectManyCheckbox>
</h:form>
<h:form id="transForm">
<p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('1')}">
transForm
</p:panelGrid>
</h:form>
<h:form id="sprdForm">
<p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('2')}">
sprdForm
</p:panelGrid>
</h:form>
</h:body>