Bitte den anderen Thread löschen
Hallo ich habe folgende Problem:
Kurz zum aufbau ich habe eine list mit SearchType objecten diese iteriere ich mit eine c:foreach schleife durch. In der foreach schleife frage ich mit c:if oder c:when den type ab und verändere demensprechen das ausehen.
Die JSF läuft als portlet in einem BenutzerPortal von Novell
und zwar wird die anzeige durch die c:foreach und c:if variable generiert wenn ich nun zwei inputText habe und einen davon lösche kommt es zu einem fehler und zwar wird die variable i zwar in der foreach schleife richtig hochgezählt aber im c:when block nochmals um einen inkrementiert. Dies geschieht allerdings nur wenn ich ein inputText lösche das ein nicht String type hatte.
Das heisst ich füge ein neue h:inputText hinzu welches an ein Date object gebunden wird, nun lösche ich den h:inputText der über diesen ist. Intern (durch Debuggen getestet) kommt es zu keinen fehler die Liste mit den Objecten wird richtig veringert. Doch troztdem kommt es zu dem Fehler das die variable i in den c:while oder eben c:if um eins höher ist als sie sein sollten
Das komische ist es passiert nur wenn der h:inputText (der keine String bindung hat) unterhalb des inputTextes ist. Zudem kommt dieses problem nicht vor wenn ich die h:inputText nur mit String objecten Binde
Wenn ich mir die variable i ausgeben lasse wird sie wie folgt ausgegeben
Ablauf
foreach i = 0
when i = 1
danach wieder i=0
auserhalb von when ist die variable i so wie sie sein sollte
es sieht auch so aus als ob das ein problem vom Framework ist
In der Klasse search (ein kleiner teil)
In der Klasse searchType (ein kleiner teil)
list.jsp
Hallo ich habe folgende Problem:
Kurz zum aufbau ich habe eine list mit SearchType objecten diese iteriere ich mit eine c:foreach schleife durch. In der foreach schleife frage ich mit c:if oder c:when den type ab und verändere demensprechen das ausehen.
Die JSF läuft als portlet in einem BenutzerPortal von Novell
und zwar wird die anzeige durch die c:foreach und c:if variable generiert wenn ich nun zwei inputText habe und einen davon lösche kommt es zu einem fehler und zwar wird die variable i zwar in der foreach schleife richtig hochgezählt aber im c:when block nochmals um einen inkrementiert. Dies geschieht allerdings nur wenn ich ein inputText lösche das ein nicht String type hatte.
Das heisst ich füge ein neue h:inputText hinzu welches an ein Date object gebunden wird, nun lösche ich den h:inputText der über diesen ist. Intern (durch Debuggen getestet) kommt es zu keinen fehler die Liste mit den Objecten wird richtig veringert. Doch troztdem kommt es zu dem Fehler das die variable i in den c:while oder eben c:if um eins höher ist als sie sein sollten
Das komische ist es passiert nur wenn der h:inputText (der keine String bindung hat) unterhalb des inputTextes ist. Zudem kommt dieses problem nicht vor wenn ich die h:inputText nur mit String objecten Binde
Wenn ich mir die variable i ausgeben lasse wird sie wie folgt ausgegeben
Ablauf
foreach i = 0
when i = 1
danach wieder i=0
auserhalb von when ist die variable i so wie sie sein sollte
es sieht auch so aus als ob das ein problem vom Framework ist
In der Klasse search (ein kleiner teil)
Code:
public void deleteSearch(int item)
{
list.remove(item);
}
public void addSearch()
{
SearchType tempSearchType;
String tempType = getTypeByName(newAttribute);
Attribute tempAttr = getAttributeByName(newAttribute);
if(tempType.equals("date") || tempType.equals("unixtimestamp"))
{
tempSearchType = new SearchType(new Date(),tempAttr,"=var");
}
else if(tempType.equals("boolean"))
{
tempSearchType = new SearchType(Boolean.valueOf(false),tempAttr,"=var*");
}
else if(tempType.equals("int"))
{
tempSearchType = new SearchType(Integer.valueOf(0),tempAttr,"=var*");
}
else
{
tempSearchType = new SearchType("test",tempAttr,"=var*");
}
list.add(tempSearchType);
}
Code:
public String getString()
{
if(attr instanceof String)
{
return (String) attr;
}
else
{
return null;
}
}
public Date getDate()
{
if(attr instanceof Date)
{
return (Date) attr;
}
else
{
return null;
}
}
Code:
<h:panelGrid columns="4" >
<c:forEach begin="0" end="#{controller.search.searchSize}" var="i" >
<c:set value="#{controller.search.list[i]}" var="search"/>
<c:set value="#{search.attribute.type}" var="type"/>
<c:choose>
<c:when test="#{type == 'int'}">
<h:inputText value="#{search.int}"/>
<h:outputText value="#{search.attribute.displayName}" />
<h:selectOneMenu value="#{search.criterion}">
<f:selectItems value="#{search.criterionByType}" />
</h:selectOneMenu>
<h:commandButton class="goeUserInPortletCommandButton" id="searchDelete#{i}" value="löschen"
actionListener="#{controller.deleteSearch}"/>
</c:when>
<c:when test="#{type == 'boolean'}">
<h:inputText value="#{search.boolean}"/>
<h:outputText value="#{search.attribute.displayName}" />
<h:selectOneMenu value="#{search.criterion}">
<f:selectItems value="#{search.criterionByType}" />
</h:selectOneMenu>
<h:commandButton class="goeUserInPortletCommandButton" id="searchDelete#{i}" value="löschen"
actionListener="#{controller.deleteSearch}"/>
</c:when>
<c:when test="#{type == 'date' or type == 'unixtimestamp'}">
<t:inputDate
value="#{search.date}" popupCalendar="false">
</t:inputDate>
<h:inputText value="#{controller.search.list[i].date}"/>
<h:selectOneMenu value="#{search.criterion}">
<f:selectItems value="#{search.criterionByType}" />
</h:selectOneMenu>
<h:outputText value="#{controller.search.list[i].attribute.displayName}" />
<h:commandButton class="goeUserInPortletCommandButton" id="searchDelete#{i}" value="löschen"
actionListener="#{controller.deleteSearch}"/>
</c:when>
<c:when test="#{type == 'string'}">
<h:inputText value="#{search.string}"/>
<h:selectOneMenu value="#{search.criterion}">
<f:selectItems value="#{search.criterionByType}"/>
</h:selectOneMenu>
<h:outputText value="#{search.attribute.displayName}">
</h:outputText>
<h:commandButton class="goeUserInPortletCommandButton" id="searchDelete#{i}" value="löschen" actionListener="#{controller.deleteSearch}"/>
</c:when>
</c:choose>
</c:forEach>
<h:selectOneMenu id="searchtype" value="#{controller.search.linkage}">
<f:selectItem itemValue="and" itemLabel="AND" />
<f:selectItem itemValue="or" itemLabel="OR" />
</h:selectOneMenu>
<h:selectOneMenu value="#{controller.search.newAttribute}">
<f:selectItems value="#{controller.selectAttributes}" />
</h:selectOneMenu>
<h:commandButton class="goeUserInPortletCommandButton" disabled="#{editable}" value="hinzufügen"
actionListener="#{controller.addSearch}"/>
<h:commandButton class="goeUserInPortletCommandButton" action="#{controller.searchUsers}" value="Suchen" />
</h:panelGrid>