Avatar billede thinge Nybegynder
09. december 2006 - 20:51 Der 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>

håber I kan hjælpe
/thinge
Avatar billede cayman Nybegynder
19. december 2006 - 10:09 #1
Masser - hvor skal vi starte?
Kører du java 5
Avatar billede thinge Nybegynder
19. december 2006 - 10:48 #2
Jeg har sgu købt en bog "JSP Tag Libraries" 565 spir. Denne har indtil videre været en stor hjælp.

Men links til gode sider er altid velkomme.
Og så kan du MÅSKE tjene lidt point

/thinge
Avatar billede cayman Nybegynder
19. december 2006 - 11:30 #3
Hej Thinge, er ik interesseret i point. Men vil gerne hjælpe hvis jeg kan ;o)
Avatar billede thinge Nybegynder
19. december 2006 - 12:19 #4
Ok
Lige en anden ting.
Du spørge om jeg kører JAVA 5, hvad mener du med det?

/thinge
Avatar billede cayman Nybegynder
19. december 2006 - 12:39 #5
Hvilken version af java kører du med? Jdk-version?.

Indtil fornyeligt kørte de fleste med version 1.4, men nu er der en ny version der hedder 5.0.

Hvilken version af Tomcat kører du med?

Alt efter hvor vidt du kører version 5.0 eller ej, så er der forskellige løsningsmuligheder når man skal lave egne tags

Det er et spørgsmål om du kan lave tagfiles eller ej. Taglibs kan man lave i begge versioner. Tagfiles er bare nemmere at arbejde med.

Og det er jo der jeg mener du skal hen, hvis du skal løse dette problem og dit problem i spm http://www.eksperten.dk/spm/747373.
Avatar billede cayman Nybegynder
19. december 2006 - 12:41 #6
Skal vi blive herovre i dette spørgsmål ? :o)
Avatar billede thinge Nybegynder
19. december 2006 - 12:42 #7
Nå for s....
Jeg troede det var noget helt vildt

Køre java 5.0
Tomcat 5.5.2

Og kører Taglibs

/thinge
Avatar billede thinge Nybegynder
19. december 2006 - 12:46 #8
yes
lade os bliver herover :o)

/thinge
Avatar billede cayman Nybegynder
19. december 2006 - 13:01 #9
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
Avatar billede cayman Nybegynder
19. december 2006 - 13:01 #10
package tagtest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class TableTag extends BodyTagSupport {
    List rows;
    List cols;

    public int doStartTag() throws JspException {
        cols=new ArrayList();
        pageContext.setAttribute("cols", cols);
        return EVAL_BODY_BUFFERED;
    }

    public int doEndTag() throws JspException {
        cols = (List)pageContext.getAttribute("cols");
        pageContext.removeAttribute("cols");
       
        try {
            pageContext.getOut().print("<TableTag>");
//        løkker til cols og rows
            pageContext.getOut().print("</TableTag>");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return SKIP_BODY;
    }

    public void release() {
        cols=null;
        rows=null;
        super.release();
    }
   
   
   
}
Avatar billede cayman Nybegynder
19. december 2006 - 13:02 #11
package tagtest;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class ColumnTag extends BodyTagSupport {
    String name;
    String attribute;

    public int doStartTag() throws JspException {
        ((List)pageContext.getAttribute("cols")).add(new TingesColumnVO(name, attribute));
        return SKIP_BODY;
    }
    public String getAttribute() {
        return attribute;
    }
    public void setAttribute(String attribute) {
        this.attribute = attribute;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void release() {
        name=null;
        attribute=null;
        super.release();
    }
   

   
   
   
}
Avatar billede cayman Nybegynder
19. december 2006 - 13:03 #12
hov - der er en fejl:

Der skulle ikke stå <TableTag> men <table> i koden. Det var en refactoring fejl.
:o(
Avatar billede cayman Nybegynder
19. december 2006 - 13:03 #13
Det er skrives ud skal jo være plain html
Avatar billede cayman Nybegynder
19. december 2006 - 13:07 #14
Der mangler desuden getter og setter til "rows" i TableTag

Nå men det du så kan skrive i din jsp er

<tingestags:table rows="${myRowSet}">
<tingestags:column name="Col 1" attribute="Hej 1">
<tingestags:column name="Col 2" attribute="Hej 2">
</tingestags:table>
Avatar billede cayman Nybegynder
19. december 2006 - 13:07 #15
Kan du bruge det til noget
Avatar billede cayman Nybegynder
19. december 2006 - 13:12 #16
Der er lidt forskel i hvordan man skriver jsp i jsp2.0 (følger med java 5) og også i javakoden, så det vil ikke nødvendigvis bare virke.

Hvis du vil have hjælp til tld filen, så sig bare til
Avatar billede thinge Nybegynder
19. december 2006 - 14:17 #17
hold da kæft, har lige været til møde, så jeg prøve lidt af.
vender tilbage

/thinge
Avatar billede thinge Nybegynder
20. december 2006 - 21:44 #18
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.

<select>
  <option>test</option>
  <option>CARLSBERG</option>
  <option>test</option>
  <option>TUBORG</option>
  <option>test</option>
  osv
</select>

test skal kun stå der 1 gang

/thinge
Avatar billede thinge Nybegynder
20. december 2006 - 21:49 #19
<selecttag>
public class Select extends AbstractAttributeScopeTag{
    private String id;
    private String styleClass;
    private String delete;
    private RowSet rowSet;
    private Row row;
   
    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;
    }

    public RowSet getRowSet() {
        return rowSet;
    }

    public Row getRow() {
        return row;
    }
Avatar billede thinge Nybegynder
20. december 2006 - 21:51 #20
<optiontag>
public class Option extends AbstractAttributeScopeTag{
    private String labelName;
    private String labelValue;
   
    public int doStartTag() throws JspException {
        Select select = (Select)getParent();
        Row option = select.getRow();
        StringBuffer optionBuffer = new StringBuffer();
        optionBuffer.append("<OPTION VALUE=\"");
        if(getAttributeName() != null && locateAttribute() != null && locateAttribute().toString().equals(option.getAttribute(getLabelValue()).toString())){
            optionBuffer.append(option.getAttribute(getLabelValue())+"\" selected=\"true\">");
        }
        else{
            optionBuffer.append(option.getAttribute(getLabelValue())+"\" >");
        }
        optionBuffer.append(option.getAttribute(labelName));
        optionBuffer.append("</OPTION>");
        try {
            pageContext.getOut().print(optionBuffer.toString());               
        }
        catch (IOException e) {
            throw new JspTagException("Error: IOException while writing to the user");
        }
      return EVAL_PAGE;
    }

    public void setLabelName(String labelName) {
        this.labelName = labelName;
    }

    public String getLabelName() {
        return labelName;
    }

    public void setLabelValue(String labelValue) {
        this.labelValue = labelValue;
    }

    public String getLabelValue() {
        return labelValue;
    }
Avatar billede cayman Nybegynder
21. december 2006 - 09:05 #21
Det kan jeg godt se.

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..
Avatar billede thinge Nybegynder
21. december 2006 - 10:35 #22
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)

release-metoder, ja dem skal jeg huske

/thinge
Avatar billede cayman Nybegynder
21. december 2006 - 12:27 #23
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.
Avatar billede thinge Nybegynder
21. december 2006 - 12:44 #24
Hvordan vil du da gøre det?
Avatar billede cayman Nybegynder
21. december 2006 - 13:53 #25
Det med page-tagget?

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);
Avatar billede thinge Nybegynder
21. december 2006 - 14:12 #26
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

/thinge
Avatar billede cayman Nybegynder
21. december 2006 - 14:38 #27
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

Hav en god jul..
/cayman
Avatar billede thinge Nybegynder
21. december 2006 - 19:17 #28
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.

God jul til dig også

/thinge
Avatar billede cayman Nybegynder
19. januar 2007 - 10:11 #29
Skal vi lukke spm ? :o)
Avatar billede thinge Nybegynder
20. januar 2007 - 10:38 #30
ja det var da en god ide
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester