Datatable طباعة فقط العنصر الأول ، إذا كانت سمة القيمة تحتوي على شريحة مربعة
-
25-09-2019 - |
سؤال
انا املك h:dataTable
يعرض ProfileNotification
مثل أدناه:
<h:dataTable value="#{myBean.profileNotifications}" var="item"
rendered="#{myBean.renderProfileNotification}">
<h:column>
<h:form>
<h:outputText value="#{item.userName} "/>
<h:outputText value="commented on your profile. "/>
<!-- <h:outputText value="[#{item.createTime}]"/> -->
</h:form>
</h:column>
</h:dataTable>
عندما لا يكون لدي item.createTime
, ، إذا قمت بالنقر فوق أ commandLink
لتعيين renderProfileNotification=true
, ، يطبع 4 عناصر. ومع ذلك ، إذا لم أكن مضطربًا item.createTime
, ، طباعة عنصر واحد فقط ، العنصر الأول.
تحرير: المشكلة هي []
داخل value
. نظرًا لأن Balusc يشك في أن هذا خطأ EL ، فإنني أقوم بإعادة إنتاج خطأي في رمز صغير وقابل للقراءة وقابل للتكرار. يعمل هذا الرمز على Glassfish v3.0.1 B22
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>TODO supply a title</title>
</h:head>
<h:body>
<h:form id="table">
<h:dataTable value="#{myBean.temp}" var="item" rendered="#{myBean.display}">
<h:column>
<h:outputText value="[#{item}]"/>
</h:column>
</h:dataTable>
</h:form>
<h:form>
<p:commandLink value="Display" actionListener="#{myBean.setDisplay}" update="table"/>
</h:form>
</h:body>
</html>
myBean.java
@ManagedBean(name="myBean")
@SessionScoped
public class myBean {
List<String> temp = null;
public myBean() {
}
private boolean display = false;
@PostConstruct
public void init(){
temp = new ArrayList<String>();
temp.add(0, "Tom");
temp.add(1, "Peter");
temp.add(2, "Mike");
temp.add(3, "Fox");
}
public List<String> getTemp() {
return temp;
}
public void setTemp(List<String> temp) {
this.temp = temp;
}
public boolean isDisplay() {
return display;
}
public void setDisplay() {
this.display = !this.display;
}
}
المحلول
حسنًا ، إنه الأخير ]
الذي يسبب مشاكل. عند استخدام
<h:outputText value="[#{item}]"/>
استجابة XML لطلب AJAX هي كما يلي:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom]]]><![CDATA[</td>
</tr>
<tr>
<td>[Peter]]]><![CDATA[</td>
</tr>
<tr>
<td>[Mike]]]><![CDATA[</td>
</tr>
<tr>
<td>[Fox]]]><![CDATA[</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="8834103461195979522:5904029216967015556" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
لاحظ كتل CDATA غير الضرورية.
وعند استخدام
<h:outputText value="[#{item})"/>
استجابة XML لطلب AJAX هي كما يلي:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom)</td>
</tr>
<tr>
<td>[Peter)</td>
</tr>
<tr>
<td>[Mike)</td>
</tr>
<tr>
<td>[Fox)</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="502405171373727621:5591448575905434431" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
هذا يتلخص في المشكلة التالية السبب: معالج استجابة AJAX هو الإغلاق غير الضروري ويبدأ كتلة CDATA لـ a ]
في الاستجابة الجزئية وحامل استجابة JS XML يختار فقط أول واحد للعرض. كان الحل السهل وضع ]
خارج التعبير عن القيمة:
<h:outputText value="[#{item}"/>]
مما يؤدي إلى استجابة XML التالية:
<?xml version="1.0" encoding="UTF-8"?><partialResponse><components><component><id>table</id><output><![CDATA[
<form id="table" name="table" method="post" action="/playground/test.jsf" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="table" value="table" />
<table>
<tbody>
<tr>
<td>[Tom]
</td>
</tr>
<tr>
<td>[Peter]
</td>
</tr>
<tr>
<td>[Mike]
</td>
</tr>
<tr>
<td>[Fox]
</td>
</tr>
</tbody>
</table>
~com.sun.faces.saveStateFieldMarker~
</form>]]></output></component></components><state><![CDATA[<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-1679996061683473780:1967669133311943592" autocomplete="off" />]]></state><callbackParams><callbackParam>{"validationFailed":false}</callbackParam></callbackParams></partialResponse>
لست متأكدًا بعد من أين تم تجذر المشكلة ، في معالج استجابة Ajax أو في محلل استجابة JS XML ، لكننا الآن نعرف السبب على الأقل. سأبلغ عن مشكلة لرجال Mojarra عاجلاً أم آجلاً مرة واحدة.
تحديث: حسنًا ، لقد قمت بتسميرها إلى أسفل: إنه معالج استجابة Ajax 'Ajax و JS XML الذي يقوم بذلك بشكل غير صحيح. عند استخدام Mojarra's h:commandLink
بدلاً من p:commandLink
أنه يعمل بشكل جيد.
<h:commandLink value="Display" actionListener="#{myBean.setDisplay}">
<f:ajax render=":table" />
</h:commandLink>
معالج استجابة AJARRA AJAX لا يطبع كتل CDATA غير الضرورية بعد كل منها ]
. قد يكون هذا هو السبب الجذري في PrimeFaces.
تحديث: تم الإبلاغ عن مشكلة لرجال PF: http://code.google.com/p/primefaces/issues/detail؟id=1282
نصائح أخرى
أعتقد ما هو الخطأ. واضح ، وضع []
داخل value
السمة سيئة. ما لدي هذا:
<h:outputText value="[#{item.createTime}]"/>
إذا أخرجت []
, ، لتصبح
<h:outputText value="#{item.createTime}"/>
ثم كل شيء يعمل بشكل جيد. يجب أن يكون أحد الأشياء الخاصة.