[ Pobierz całość w formacie PDF ] .Klasy obsługi znacznikówKlasy definiujące znaczniki zagnieżdżane mogą być klasami potomnymi klas TagSupportbądz BodyTagSupport.Wybór użytej klasy bazowej zależy od tego czy definiowany znacznik będzieprzetwarzać swoją zawartość (w takich przypadku klasą bazową powinna być klasaBodyTagSupport) czy też będzie ją ignorować bądz wyświetlać w oryginalnej postaci (takieznaczniki, znacznie bardziej popularne, są klasami potomnymi klasy TagSupport).Jednak podczas implementacji znaczników zagnieżdżanych wykorzystywane są dwa,całkowicie nowe rozwiązania.Po pierwsze, klasy zagnieżdżane używają metodyfindAncestorWithClass, aby określić znacznik, a jakim zostały umieszczone.Argumentamiwywołania tej metody są: odwołanie do bieżącej klasy (na przykład: this) oraz obiekt Classokreślający klasę zewnętrznego znacznika (na przykład: ZewnetrznyZnacznik.class).Jeśli znacznikzewnętrzny nie zostanie odnaleziony, to metoda zgłasza wyjątek JspTagException, który informujeo zaistniałym problemie.Po drugie, jeśli pewna klasa chce przechować informacje, z których innaklasa będzie mogła pózniej skorzystać, to będzie mogła je umieścić w kopii obiektureprezentującego zewnętrzny znacznik.Definicja takiego zewnętrznego znacznika, powinnazawierać metody pozwalające na zapisanie i pobranie takich informacji.Listing 14.22 przedstawiaprzykład ilustrujący sposób implementacji znaczników zagnieżdżanych.Listing 14.22 Szablon znaczników zagnieżdżanychpublic class ZnacznikZewn extends TagSupport {public void setJakasWartosc(JakasKlasa arg) {.}public JakasKlasa getJakasWartosc() {.}}public class PierwszyZnacznikWewn extends BodyTagSupport {public int doStartTag() throws JspTagException {ZnacznikZewn zewnetrzny =(ZnacznikZewn)findAncestorWithClass(this, ZnacznikZewn.class);if (zewnetrzny == null) {throw new JspTagException("nieprawidłowe zagnieżdżenie znaczników");} else {zewnetrzny.setJakasWartosc(.);}return(EVAL_BODY_TAG);}.}public class DrugiZnacznikWewn extends BodyTagSupport {public int doStartTag() throws JspTagException {ZnacznikZewn zewnetrzny =(ZnacznikZewn)findAncestorWithClass(this, ZnacznikZewn.class);if (parent == null) {throw new JspTagException("nieprawidłowe zagnieżdżenie znaczników");} else {JakasKlasa wartosc = parent.getSomeValue();zrobCosZ(wartosc);}return(EVAL_BODY_TAG);}.}Załóżmy teraz, że chcemy zdefiniować grupę znaczników, które będą używane wnastępujący sposób:261 Rozdział 14.Tworzenie bibliotek znacznikówKod JSP dołączany gdy warunek jest spełnionyKod dołączany gdy warunek nie jest spełnionyPierwszym krokiem jaki należy wykonać aby zrealizować to zadanie, jest zdefiniowanieklasy IfTag, która będzie obsługiwać znacznik csajsp:if.Klasa ta powinna dysponować metodamipozwalającymi na podanie i sprawdzenie wartości warunku (będą to metody setCondition orazgetCondition) jak również metodami umożliwiającymi określenie i sprawdzenie czy warunekkiedykolwiek został jawnie określony (będą to metody setHasCondition oraz getHasCondition).Tadruga para metod będzie mam potrzebna gdyż, chcemy zabronić przetwarzania znacznikówcsajsp:if, w których nie ma podanego znacznika csajsp:condition.Kod klasy IfTagprzedstawiłem na listingu 14.23.Listing 14.23 IfTag.javapackage coreservlets.tags;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;import javax.servlet.*;/** Znacznik działający jak instrukcja if/then/else.*/public class IfTag extends TagSupport {private boolean condition;private boolean hasCondition = false;public void setCondition(boolean condition) {this.condition = condition;hasCondition = true;}public boolean getCondition() {return(condition);}public void setHasCondition(boolean flag) {this
[ Pobierz całość w formacie PDF ]
zanotowane.pldoc.pisz.plpdf.pisz.plhanula1950.keep.pl
|
|
|