09. december 2006 - 20:51Der er
29 kommentarer og 1 løsning
Nested custom tags
HEJ HEJ Er der nogen, der har nogle gode/simple kode eksempler til nested tags.
Vil gerne lave tabel ud fra et RowSet. <test:table rowSetName="x"> <test:col colName="col 1" attributeName="HEJ 1"> <test:col colName="col 2" attributeName="HEJ 2"> osv. </test:table>
Har lavet to klasser til dig. To tags. Et table tag og et Column tag. Se lige om det giver mening. Derudover skal du lave en tld fil og i din jsp side skal du pege på tld filen.
Jeg har IKKE testet klasserne, men så kan du i hvert fald se hvordan man kan gøre det
OK Arbejder lidt med et <select> tag med <option> tag "nested" <HTML:Select attributeName="parties" scope="request"> <OPTION value="-1">test</option> <HTML:Option attributeName="partyId" labelName="PartyName" labelValue="PartyId" scope="request"/> </HTML:Select>
Det jeg gerne vil er kun at skrive test en gang, men hvis jeg løber rowSettet igennem, evaluere jeg body en gang til og får derfor test en gang til.
public int doStartTag() throws JspException { if(locateAttribute() != null){ StringBuffer selecttBuffer = new StringBuffer(); selecttBuffer.append("<SELECT name=\""); selecttBuffer.append(getAttributeName()+"\" >"); try { pageContext.getOut().print(selecttBuffer.toString()); } catch (IOException e) { throw new JspTagException("Error: IOException while writing to the user"); } rowSet = (RowSet)locateAttribute(); if(rowSet.getRowCount() > 0){ row = rowSet.next(); return EVAL_BODY_INCLUDE; } } }
public int doAfterBody() throws JspException{ if(rowSet.hasNext()){ row = rowSet.next(); return EVAL_BODY_AGAIN; } return SKIP_BODY; }
public int doEndTag() throws JspException { try { pageContext.getOut().print("</SELECT>"); } catch (IOException e) { throw new JspTagException("Error: IOException while writing to the user"); } return EVAL_PAGE; }
hmm.. Jeg tror du skal gentænke lidt hvilket tag der har ansvaret for udskrivning/rendering. Jeg synes for det første du skal slette din doAfterBody(), da vi principielt har problemer med at løbe bodien igennem flere gange. Jeg synes desuden at du skal flytte rendering af dit rowset væk fra optiontag og over i Select.doEnd(). Der kan du i ro og mag iterere igennem dit rowSet, og printe det ud.
Hvad skal man så med Option tagget? Vi er jo nødt til at samle de info ind som optiontagget samler ind for os. Hvilken property er label, value etc.... Hvis du så lader option tagget give disse informationer til dit select tag, istedet for selv at bruge dem, så har vi vist det hele med. Så bliver funktionaliteten i dit option tag reduceret væsentligt - men det gør vel heller ikke noget?
Husk at lave release-metoder - ellers risikere du at dine tags gemmer data fra tag til tag på samme side..
Select løber gennem rowsettet, hvor så option henter den række som select har fundet. Personligt synes jeg at option skal have ansvaret for at skrive sig selv(hvis du forstår)
Jeg forstår dig godt. Men det skaber imidlertid det problem at du ikke kan have noget andet i select'ens body uden at det bliver gentaget det antal gange du har rows..
Men men .. Du kan jo bruge det hvis du vil.
Det andet spm du havde, var omkring responsestreamen. Jeg ville sørge for at alt html generering enten lå i jsp-filer eller egne tags. Så du kan lave et "page" tag der gør alt det som din servlet gør idag. Og så forwarde til jsp'erne på traditionel vis. SÅ tror jeg det problem forsvinder.
Ja - dybest set vil jeg stortset kopiere koden fra din servlet over en en tag-klasse. Det der ligger før du printer jspPage ud skal ligge i doStartTag() og det der ligger efter skal ligge i doEndTag().
Din request/response/printWriter kan du nå via pageContext()
Jsp'er kommer alle til at starte med : <thingesTags:page> // sidespecifikt indhold </thingesTags:page>
I din servlet skal du så forwarde til din jsp side. Det gør du ligesom du "includer". Du bruger bare forward metoden. Men du skal helt lade være med selv at skrive til streamen fra din servlet.
Vedr din service-metode.. Og du kan også fjerne dine "this.session/request/response". Der er ingen grund til at holde fast i object referencerne på objectniveau. Lad istedet din createPage() tage dem som args så den bliver til createPage(request, response);
din service-metode..,Lyder som en god ide. Den vil jeg helt sikkert prøve.
Men <thingesTags:page> bliver vi nok aldrig enig om. Jeg PRØVER på at alt hvad der er ens, skal kun ligge et sted. Og da <thingesTags:page> vil komme på alle sider, mener jeg at det skal ligge et sted. mmm og måske bliver vi enige. Hvis jeg nu skulle have en side med et andet stylesheet, kunne tagget tage et stylesheetName med som parameter.
endnu en ting jeg skal overveje. Du smadre min DEADLINE
Jeg vil ikke blande mig i hvordan du gør. :o) Vi behøver jo ikke være enige..
Men nu har jeg givet dig mine erfaringer omkring denne problematik, så kan du bruge dem hvis du synes. Men din deadline bliver vel også smadret hvis du ikke løser dine problemer - right?
Hvis der er noget af det jeg har skrevet der ikke giver mening, må du sige til
Min DEADLINE var bare ment som lidt gas, da jeg troede det var lige til at gå til. Alt hvad du skriver giver mening, og jeg forstår dig godt, men jeg er bare ikke helt enig med dig. Men dejligt med lidt "skænderier"(også bare gas) om hvordan man skal lave tingene.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.