Avatar billede starfish Nybegynder
13. december 2001 - 18:00 Der er 13 kommentarer og
2 løsninger

Custom Tags tutorial eller løsning

Hajse. Jeg skal have lavet noget Custom Tags og jeg har desværre forlagt alt mit material om, hvordan man laver det. Det jeg konkret skal bruge er et taglib der kan søge på kunder.

Jeg har lavet min findKunder(parametre) i en KunderADT klasse og det er denne jeg vil bruge.

Mit taglib/custom tags skal så ved kald af en list metode udskrive alle de fundne kunder. Til det formål har jeg resultatet i en container, og det kan jeg sagtens udskrive nu.

ER der en nem måde hvorpå jeg kan lave et Taglib jeg kan bruge? Det skal kun kunne to ting. Udføre en søgning og liste resultatet.
Avatar billede starfish Nybegynder
13. december 2001 - 19:24 #2
Det lader til at være gode kilder, men jeg støder inf i et problem. jeg kan ikke teste om det virker da
import javax.servlet.jsp.*; fejler, og jeg ved ikke hvor jeg skal lede efter javax.servlet. Den findes ikek umiddelbart i mit system?!

Avatar billede erikjacobsen Ekspert
13. december 2001 - 20:47 #3
Du har dem måske ikke i dit visuelle udviklingsværktøj, men de findes med
garanti på din JSP-server. Prøv at afvikle dem der.
Avatar billede lbhansen Nybegynder
13. december 2001 - 21:48 #4
det der måske er din nemmeste løsning er, at tilgå din database klasse som en bean der resulterer en Collection, og så derefter implementere det iteration tag, som er beskrevet i suns tutorial
Avatar billede starfish Nybegynder
13. december 2001 - 22:27 #5
I min JSP fil her jeg flg.:

  <list:list navn=\"T\" telefon=\"\" kundenr=7>
  Kunder fundet:
 
  </list:list>

Under \"Kunder fundet:\"vil jeg gerne have udskrevet navnene på kunderne, men det vil det tilsyneladende ikke. Den finder kunder det har jeg checket, men den fejler.


Min ListTag har flg:
  if(itr == null) {
    return SKIP_BODY;
  }

  if(itr.hasNext()) {
      kunde = (Kunde)itr.next();
      pageContext.setAttribute(navn, kunde.getNavn());
      return EVAL_BODY_TAG;
  } else {
      return SKIP_BODY;
  }

Jeg få denne fejl.
/tags/Demo.jsp:9: Undefined variable: navn
          out.print((navn ));
                   
Nå jeg så kigger i min bog ser det ikke ud til at de initialiserer eller definerer de variable der skrives ud?

Hvordan skal de gøres?

Avatar billede lbhansen Nybegynder
13. december 2001 - 23:12 #6
nej. Den tutorial som sun har bruger en TEI class til at sætte attributen med.
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#68067

så sparer man for at caste objekterne ude i jsp´en, men det bliver derimod en del af den compilerede servlet
Avatar billede starfish Nybegynder
14. december 2001 - 00:24 #7
Jeg er nu kommet så langt at det forhåbentligt snart virker.

  public int doStartTag() throws javax.servlet.jsp.JspException {
          // Åbner forbindelsen til databasen
          kunder.åben();

          // Opretter en container til at indeholde vores resultat
            KundeContainer k = kunder.findKunder(navn, telefon, kundenr);
          ListIterator itr = k.createIterator();

          if(itr == null) {
            return SKIP_BODY;
          }

          if(itr.hasNext()) {
            kunde = (Kunde)itr.next();
            pageContext.setAttribute(\"navn\", kunde.getNavn());
            return EVAL_BODY_TAG;
          } else {
            return SKIP_BODY;
          }
  }

  public int doAfterBody() throws javax.servlet.jsp.JspException {
      try {
        getBodyContent().writeOut(getPreviousOut());
      } catch (Exception e) {
//        throw new JspTagException(ioe.toString());
      }
      return SKIP_BODY;

  }

Men der kommer ingentin ud på min side?!?
Avatar billede erikjacobsen Ekspert
14. december 2001 - 01:12 #8
Du skriver vel ikke noget ud - der sker ikke så meget ved en
setAttribute
Avatar billede starfish Nybegynder
14. december 2001 - 01:46 #9
Har fået det til at virke. MIn kode ser nu sådan ud:
  public int doStartTag() throws javax.servlet.jsp.JspException {
          // Åbner forbindelsen til databasen
          kunder.åben();

          // Opretter en container til at indeholde vores resultat
            k = kunder.findKunder(navn, telefon, kundenr);
          itr = k.createIterator();

          if(itr == null) {
            return SKIP_BODY;
          }

          if (itr.hasNext()) {
            kunde = (Kunde)itr.next();
            System.out.println(kunde.getNavn());
            pageContext.setAttribute(\"navn\", kunde.getNavn());
            pageContext.setAttribute(\"telefon\", kunde.getTelefon());
            pageContext.setAttribute(\"kundenr\", \"\"+kunde.getKundeNummer());
              return EVAL_BODY_INCLUDE;
          }
          else
          {
            return SKIP_BODY;
          }
  }
 
  public int doAfterBody() throws javax.servlet.jsp.JspException {
 
      if(itr.hasNext()) {
        kunde = (Kunde)itr.next();
        pageContext.setAttribute(\"navn\", kunde.getNavn());
        pageContext.setAttribute(\"telefon\", kunde.getTelefon());
        pageContext.setAttribute(\"kundenr\", \"\"+kunde.getKundeNummer());
        return EVAL_BODY_TAG;
      }
      else {
          try {
            getBodyContent().writeOut(getPreviousOut());
          } catch (Exception e) {
    //        throw new JspTagException(ioe.toString());
          }
          return SKIP_BODY;
      }
  }
Avatar billede bearhugx Nybegynder
14. december 2001 - 05:14 #10
hvis du stadig bruger følgende :
##
<list:list navn=\"T\" telefon=\"\" kundenr=7>
  Kunder fundet:
 
</list:list>
##

Så skal du lige huske at ALLE sendte attributter (også tal) skal sendes i quotes - dvs.
<list:list navn=\'Navn\' telefon=\'\' kundenr=\'7\'>
</list:list>


Men under alle omstændigheder :
Har du husket at lave en
public void setNavn(String navn)-metode...

HUSK : når du sender data afsted til et tag som attributter, så SKAL der være en setXXX-metode, ellers gå den hel gal!

/Søren
Avatar billede bearhugx Nybegynder
14. december 2001 - 05:19 #11
for lige at følge op på mit svar....

Et tag initialiseres med alle attributterne umiddelbart inden doStartTag() går i gang...
Dette sker ved azt der for hver attribut søges efter en setXXX metode, som kan \'modtage\' attributten.

Dette betyder, i dit tilfælde, at du skal have tre set-metoder i din tag-klasse
* public void setNavn(String navn)
* public void setTelefon(String telefon) <-- eller int, alt efter datatype :-) - og
* public void setKundenr(int kundenr)

/Søren
Avatar billede starfish Nybegynder
14. december 2001 - 09:36 #12
Det er korrekt det var en skrivefejl at jeg ikke havde \"pakket\" mit 7-tail ind i quoutes. Men som jeg skrev så virker min kode, og det må jo betyde at jeg har lavet min get og set metoder :-) Men tak alligevel. Det er god information til evt. andre der skal lave tags.

Så til point uddelingen.

>> erik
Jeg ved erik ikke tager imod point og det er fair nok.

>> lbhansen?
Du må gerne ligge et svar hvis du vil have nogle point.

>>Kresten
Gode links. Ikke helt alle 60 points værd, men noget er de værd :-)

>>bearhugx
Du kom desværre for sent :-) Sorry...
Venter lige og hører lidt respons fra lbhansen.

Avatar billede kresten Nybegynder
14. december 2001 - 09:57 #13
Jeg er nu også ligeglad med de points. Bare godt at se der er flere og flere som bruger JSP :)
Avatar billede starfish Nybegynder
14. december 2001 - 10:30 #14
Hehe. Sværger ellers til PHP, men jeg må indrømme at f.eks. Custom Tags er vildt cool. Så måske man burde konvertere inden længe :-)
Avatar billede kresten Nybegynder
14. december 2001 - 13:45 #15
heh, jeg kommer fra ASP verdenen - og kan kun sige det er en fordel og mere professionelt.... bare en del mere besværligt :(
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