$KK(Die PageContext API) $R(Objective) Using the PageContext API, write tag handler code to access the JSP implicit variables and access web application attributes. $R\ PageContext ist ein Objekt, auf das man als implizite Variable mit dem Ausdruck ${pageContext} zugreifen kann. PageContext bietet: * eine API um Attribute in den verschiedenen Gültigkeitsbereichen (Scopes) zu lesen bzw. schreiben * einfacher Zugriff auf öffentliche Variablen wie out,session,page,servletConfig bzw servletContext * Ein Meachanismus um die Anfrage an weitere aktive Komponenten mit forward bzw include weiterzuleiten * Ein Mechanismus zur Fehlerbehandlung Hier die wichtigsten Methoden die PageContext anbietet: $S() public abstract class JspContext { public abstract void setAttribute(String name, Object value); // setzt Attribut im page Scope public abstract void setAttribute(String name, Object value, int scope); public abstract Object getAttribute(String name); // liest Attribut aus PageScope public abstract Object getAttribute(String name, int scope); public abstract Object findAttribute(String name); //sucht in allen Scopes public abstract void removeAttribute(String name); // löscht im PageScope public abstract void removeAttribute(String name, int scope); public abstract int getAttributesScope(String name); // Gibt scope zurück indem Attribut gefunden wurde public abstract Enumeration getAttributeNamesInScope(int scope); public abstract JspWriter getOut(); // gibt den JSP Writer der Seite zurück } $S\ $S() public abstract class PageContext extends JspContext { public abstract javax.servlet.http.HttpSession getSession(); public abstract java.lang.Object getPage(); public abstract javax.servlet.ServletRequest getRequest(); public abstract javax.servlet.ServletResponse getResponse(); public abstract java.lang.Exception getException(); public abstract javax.servlet.ServletConfig getServletConfig(); public abstract javax.servlet.ServletContext getServletContext(); public abstract void forward(java.lang.String relativeUrlPath) throws javax.servlet.ServletException, java.io.IOException; public abstract void include(java.lang.String relativeUrlPath) throws javax.servlet.ServletException, java.io.IOException; public abstract void handlePageException(Throwable e) // für unbehandelte Ausnahmefälle throws javax.servlet.ServletException, java.io.IOException; } $S\ Für die verschiedenen Scopes sind in PageContext Konstanten definiert. Sie lauten $S() public static final int APPLICATION_SCOPE public static final int PAGE_SCOPE public static final int REQUEST_SCOPE public static final int SESSION_SCOPE $S\ $KK(Umgang zur Programmierung verschachtelter Tags) $R(Objective) Given a scenario, write tag handler code to access the parent tag and an arbitrary tag ancestor. $R\ Es gibt 2 Methoden um von einem TagHandler eines inneren Tags, auf den TagHandler eines äusseren Tags zuzugreifen. $T(caption,ll,40.60) Methode | Beschreibung || Tag setParent() | Dies gibt des TagHandler der übergeordneten Klasse zurück. Existiert kein übergeordneter TagHandler so wird der Wert null zurückgegeben || TagSupport. findAncestorWithClass(tag,class) | Dies statische Methode wird angenommen wenn man nicht die Verschachtelungshierarchie der Tags kennt. Das erste Argument ist die Instanz eines TagHandlers von der gesucht wird. Das zweite Argument ist eine Klasse oder Interface. Die erste Instanz die gefunden wird, die von der Klasse oder Interface ist, wird zurückgegegen. || $T\ Hier ein Beispiel zur Verwendung findAncestorWithClass $S() public class SQLParamTag extends SimpleTagSupport { ... public void doTag() throws JspException { SQLExecutionTag parent = (SQLExecutionTag) find AncestorWithClass(this,SQLExecution.class); if (parent == null) { throw new JspTagException("The param action is not " + "enclosed by a supported action type"); } parent.addSQLParameter(value); } } $S\ Bei SimpleTags erfüllt ein TagHandler das Interface SimpleTag und wird meist als Unterklasse von SimpleTagSupport implementiert. Beim einem klassischen TagHandler wird i.a. eine Unterklasse von TagSupport implementiert. Beide Klassen verstehen besitzen die Methode: