SCWCD jegyzetek

A Sun Certified Web Component Developer vizsga hasonló volt, mint az SCJP. Lentebb a múltkorihoz hasonló jegyzet néhány dologról, ami eszembe jutott tanulás közben, kérdezték valamelyik tesztkérdésben, érdemes megjegyezni, vagy épp elrontottam a valamelyik feladatban. Az angol szövegek többnyire javadoc-ból származnak, a gyakorlatiasabb dolgok pedig Tomcat 6 alatt kipróbált tesztek eredményeként.

A lista pontjait az általam használt Charles Lyons-féle SCWCD Study Companion (2nd Edition) c. könyv fejezetei alapján csoportosítottam. A web.xml-es és TLD-s részeknél néhol az XML elemek neveivel egybeírtam az előfordulásaiknak lehetséges számát is (?; 1; +; *).

Az előbbi könyvön kívül érdemes belenézni a Head First Servlets and JSP-be is, mert volt pár apróság, amiről az egyik könyv biztosan állította, hogy nem lesz vizsgán, miközben azt a másik úgy tárgyalta, mint rendes vizsgaanyag - és fordítva is. A Head First utolsó száz oldala ráadásul egy teljes tesztvizsga. Ehhez viszont ajánlott a webes hibajegyzéket is átvezetni a könyvbe, mert sajnos elég sok elírás van benne.

Itt is érvényes, hogy a lista átnézése a könyvekben és a JavaRanch-en linkelt vizsgasorok, feladatok megoldása előtt túlzott önbizalomhoz vezethet, aminek sikertelen vizsga lehet a vége.

1. fejezet, Networks and HTTP
  • HTTP1.0 metódusok: GET, HEAD, POST.
3. fejezet, Servlet Basics
  • Servlet: void init(ServletConfig config)
  • GenericServlet: void init()
  • UnavailableException konstruktorai: UnavailableException(String msg): permanently unavailable; UnavailableException(String msg, int seconds): temporarily unavailable.
  • ServletException: temporarly problem.
  • HttpServlet doXxx metódusai ha nincsenek felülírva:
    • HTTP1.0 esetén: 400 Bad request,
    • HTTP1.1 esetén: 405 Method not Allowed.
    • A doHead() kivétel, ő doGet()-et hív, de csak fejléceket ad vissza.
  • HttpServlet felülírható (http) metódusai: doGet, doHead, doPost, doPut, doDelete, doOptions, doTrace.
4. fejezet, Servlet Contexts
  • application scope: ServletContext objektum.
  • ServletConfig: ServletContext getServletContext()
  • ServletConfig: getInitParameter(String name): web-app > servlet > init-param
  • ServletContext: getInitParameter(String name): web-app > context-param
  • ServletContextListener metódusai: contextDestroyed(ServletContextEvent sce), contextInitialized(ServletContextEvent sce)
  • ServletContextEvent egyetlen metódusa: ServletContext getServletContext()
  • ServletContextAttributeListener metódusai:
    • attributeAdded(ServletContextAttributeEvent scab)
    • attributeRemoved(ServletContextAttributeEvent scab)
    • attributeReplaced(ServletContextAttributeEvent scab)
    • Egyik sem dobhat semmilyen ellenőrzött kivételt.
  • ServletContext: setAttribute, removeAttribute visszatérési típusa void.
  • GenericServlet getInitParamter() és getInitParamterNames() metódusa a ServletConfig-nak delegálja a kéréseket.
  • Ha a Servlet.init() ServletException-t dob (nem leszármazottat), akkor a konténer elengedi a referenciát (megy GC-hez az object), nem hív meg rajta több metódust, de később megpróbálkozik egy újabb példány létrehozásával.
  • Servlet.destroy() nem dobhat ellenőrzött kivételt.
  • A Listener objektumok a DD-ben szereplő sorrendjükben lesznek regisztrálva és meghívva. Az alkalmazás leállításánál a sorrend fordított.
  • A ServletContext-nek ugyan van getRequestDispatcher() metódusa, de sendRedirect()-je nincs.
  • A ServletConfig nem tárol attribútumokat.
5. fejezet, Requests and Responses
  • The difference between ServletRequest.getRequestDispatcher(String) and ServletContext.getRequestDispatcher(String) is that ServletRequest's method can take a relative path.
  • ServletRequest: String getParameter(String name) (Nem Object a visszatérési érték.)
  • HttpServletResponse.sendRedirect() IllegalStateException-t dob, ha már commit-olva volt a kimenet. Persze ez ott már nem fog látszani, csak szerverlogban/stdout-on.
  • response.getWriter() simán dobhat java.io.UnsupportedEncodingException-t, ha a setContentType() karakterkódolás része hülyeséget tartalmaz.
  • response.getCharacterEncoding() response.getContentType() értéke fix lesz, miután meghívtuk a getWriter()-t, hiába hívogatjuk a setContentType() metódust.
  • response.setContentType("h2/h2;charset=latin2"); response.setCharacterEncoding("UTF-16"); után UTF-16 lesz a response.getCharacterEncoding() értéke és a response.getContentType() megfelelő része is.
  • response.setContentType("text/html"): getWriter() után (de még commit/flush előtt) is átállítja a fejlécet. (Karakterkódolást nem, ha az is meg van adva.)
  • request.getParameterMap() kulcsai: String, értékei: String[].
  • String[] getParameterValues(String name)
  • Cookie csomagja: javax.servlet.http
  • A fogadott sütiket a szerver automatikusan visszaküldi.
  • HttpServletRequest: long getDateHeader(String name) (Nem Date!)
  • HttpServletRequest: getHeaderNames() és getHeaders(String name) visszatérési értéke: Enumeration.
  • sendError() után committed lesz a kimenet.
  • sendError()-os oldal nem küldi vissza a sütiket, amiket a klienstől kap (Tomcat 6).
  • Az encodeRedirectURL() és az encodeURL() mintha csak abban különböznének, hogy az üres URL-t másképp kezelik. Legalábbis Tomcat forráskódja alapján erre jutottam.
  • A 17. ellenőrző kérdés alapján: encodeRedirectURL() akkor kell, ha kimutat az alkalmazásunkból a link. De amúgy semmi különbség a kettő közt, mindkettő megvizsgálja, hogy egyezik-e a link eleje a context-tel, és ha igen, akkor odarakja a jsessionid-t, ha nem sütiben utazik a munkamenetazonosító.
  • HttpServletResponse: setLocale(java.util.Locale loc) létezik. setLang(), setLanguage() nincs.
  • HttpServletResponse: void setStatus(int sc), és nem setStatusCode().
  • ServletRequestListener metódusai:
    • requestDestroyed(ServletRequestEvent sre)
    • requestInitialized(ServletRequestEvent sre)
  • ServletRequestEvent metódusai: getServletRequest(), getServletContext().
  • Az encodeURL() a HttpServletResponse interfész metódusa.
  • Bejövő kérés body-jának megszerzése (ServletRequest):
    • ServletInputStream getInputStream() throws IOException
    • BufferedReader getReader() throws IOException
  • A HttpServletRequest-nek nincs getCookie(String name) metódusa, csak a Cookie[] getCookies() használható.
  • addHeader(), setHeader() nem dob semmilyen exceptiont, ha az isCommitted() true.
  • request.getLocales() akkor is a szerver locale-jaival tér vissza, ha üres a fejléc értéke. (Nincs vizsgán.)
  • ServletRequest.getServerName(): a Host fejlécből vett érték, ServletRequest.getLocalName(): a szerver IP címének reverse DNS-e. (Nincs vizsgán.)
6. fejezet, RequestDispatchers & Wrappers
  • ServletContext.getRequestDispatcher() exceptiont dob, ha nem / jellel kezdődik az URL. (IllegalArgumentException)
  • HttpServletResponseWrapper.getResponse() visszatérési típusa: ServletResponse. (Implementáció a ServletResponseWrapper osztályból öröklődik.)
  • RequestDispatcher: mindképp szerveroldali, a kliens nem fog tudni az átirányításról forward() és include() esetén sem.
  • RequestDispatcher.forward() hívása után committed lesz a kimenet.
  • RequestDispatcher.forward() simán tovább forward-olhatja a kérést, de forward() visszatérése után újabb forward nem lehet, illetve az outputra sem írhat az első szervlet.
  • RequestDispatcher.include()-dal beszúrt tartalom nem nyúlhat a http fejlécekhez. addHeader/setHeader figyelmen kívül lesz hagyva.
  • A->B forward után a javax.servlet.forward.* request attribútumok az eredeti (A) kérésről fognak infókat tartalmazni, a request.getRequestURL() pedig a B kérésről.
    • getNamedDispatcher esetén ez nem így van, ott nincsenek ilyen extra attribútumok, a getRequestURL() az eredeti kérésről tartalmaz infókat.
  • A->B include után a javax.servlet.include.* request attribútumok az include-olt (B) kérésről fognak infókat tartalmazni, a request.getRequestURL() pedig az eredeti A kérésről.
    • getNamedDispatcher esetén ez nem így van, ott nincsenek ilyen extra attribútumok, a getRequestURL() az eredeti kérésről tartalmaz infókat.
  • relatív URL-ekkel a ServletContext-től elkért RequestDispatcher nem használható.
  • RequestDispatcher metódusai:
    • void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
    • void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException, IllegalStateException
    • IllegalStateException: ha committed a válasz.
      • Például: IllegalStateException: Cannot forward after response has been committed
    • Egyébként továbbdobják a include-olt/forward-olt tartalmak által generált exception-öket.
  • response.getWriter().println("teszt1"); response.getWriter().println("teszt2"); - Működik.
  • RequestDispatcher segítségével a /WEB-INF mappában lévő JSP fájlokat is el lehet érni.
  • rd.forward(request, response); majd response.getWriter().println("back"); - nem dob kivételt, de nem is ír ki semmit (Tomcat 6).
  • ServletContext: ServletContext getContext(String uripath) - visszatérhet null-lal is, és a path-nak / jellel kell kezdődnie.
  • javax.servlet.forward.request_uri és nem request_url!
  • ServletRequestWrapper, ServletResponseWrapper és Http-s társaiknak nincs default konstruktora. Leszármaztatásnál figyelni kell rá.
7. fejezet, Filters
  • Filter, FilterChain csomagja: javax.servlet
  • FilterChain egyetlen metódusa: void doFilter(ServletRequest, ServletResponse, FilterChain) throws IOException, ServletException
  • Ha egy filter nem indul el (például ServletException-t dob az init metódusban), akkor a Tomcat 6 nem szolgálja ki azokat az erőforrásokat, amelyekhez be lett állítva a filter.
  • Filter interfész metódusai:
    • void destroy()
    • void doFilter(ServletRequest, ServletResponse, FilterChain) throws IOException, ServletException
    • void init(FilterConfig filterConfig) throws ServletException
  • web-app > filter* > init-param* > description*, param-name1, param-value1
  • Filterek sorrendje: url-pattern alapján illeszkedő filterek DD-ben meghatározott sorrendben, majd servlet-name alapján illeszkedő filterek a DD-ben meghatározott sorrendben.
8. fejezet, Session Management
  • HttpSession invalidate() után a getAttribute() és más metódusok is IllegalStateException-t dobnak.
  • HttpSession.setMaxInactiveInterval(0) nálam (Tomcat 6) ugyanúgy viselkedik, mint az invalidate(). (Forráskódba belenézve is úgy tűnik, hogy ugyanazt hívják.) Fontos hatás, hogy meghívása után a session.getAttribute() és hasonlók nem használhatóak.
  • HttpSessionBindingEvent: megkapja az objektum is, ha implementálja a HttpSessionBindingListener interfészt, valamint a HttpSessionAttributeListener-ek is.
  • A HttpSession interfész.
  • encodeUrl() metódusa a HttpServletResponse interfésznek van.
  • A ServletRequest-nek nincs getSession() metódusa. (A HttpServletRequest-nek van.)
  • request.getSession() == request.getSession().
  • HttpSessionActivationListener metódusai: sessionWillPassivate, sessionDidActivate.
  • HttpSessionBindingListener metódusai: valueBound, valueUnbound.
  • request.getSession() IllegalStateException: ha sütiket használunk, nincs még session, és committed a kimenet.
  • HttpSessionListener metódusai:
    • void sessionCreated(HttpSessionEvent se)
    • void sessionDestroyed(HttpSessionEvent se)
  • A session id-t tartalmazó süti neve mindenképp JSESSIONID. Az URL paraméternek szintén, csak kisbetűvel.
  • A web.xml-ben percekben lehet megadni a session érvényességi idejét, míg a HttpSession.setMaxInactiveInterval(int) metódusa másodpercekben várja azt.
  • A HttpSessionAttributeListener.attributeRemoved() nem lesz értesítve session timeout esetén.
9. fejezet, Application Deployment
  • load-on-startup: ha egyformák a számok, akkor a konténer dönti el a sorrendet. Ha negatív a szám, akkor nem muszáj indításkor betöltenie.
  • mime-mapping > extension: a pont nem kell. Pl.: "pdf".
  • mime-mapping > extension1, mime-type1.
  • web.xml root: web-app
  • context-param > param-name, param-value. Application scope.
  • session-config* > session-timeout?. Percekben.
  • welcome-file-list > welcome-file+.
  • web-app > jsp-config* > taglib*, jsp-property-group*.
  • web-app > jsp-config* > jsp-property-group* > include-prelude*, include-coda*
  • web-app > filter-mapping* > dispatcher0..4: FORWARD, INCLUDE, REQUEST, ERROR. Ha egy sincs, akkor REQUEST.
  • Include direktívával beszúrt JSP-nek ugyanazzal (vagy semmilyen) a page contentType-pal kell rendelkeznie, különben translation error-t kapunk. Ez azonban nem vonatkozik a jsp:include tag-re, mivel ez RequestDispatchert használ, és az ott az include-olt tartalomban az addHeader, setHeader hívások figyelmen kívül vannak hagyva.
  • WAR: Web ARchive
  • web-app > listener* > description*, display-name*, icon*, listener-class1
  • web-app > error-page > exception-type: full qualified nevet kell megadni.
  • war fájlok: web.xml kötelező, így a WEB-INF mappa is.
  • war nevű command line utility nincs, a war fájlok is a jar segédprogrammal készülnek.
10. fejezet, JSP Basics
  • Felülírható metódusok: public void jspInit(), public void jspDestroy().
  • <%= new Date() %>: compilation error (import hiányzik).
  • <%= new java.util.Date() %>: kiírja a dátumot.
  • <%@ page session="false" %><%= session.getAttribute("userid") %>: compilation error. A session objektum nem létezik.
  • <%@ taglib prefix="c" uri="..." %>
  • A jsp prefix fent van tartva a standard JSP akciók számára.
  • <%@ include file="..." %>
  • Ilyet nem kellene deklarálni: service(), _jspService().
  • PageContext metódusai: Object getPage(); ServletRequest getRequest(); ServletResponse getResponse(); ServletConfig getServletConfig(); ServletContext getServletContext(); HttpSession getSession();
  • <%= getAttribute("a") %>: compile error. Nincs ilyen metódus.
  • web.xml > context-param : ServletContext.getInitParameterNames(), JSP-ben: application
  • web.xml > servlet > init-param: ServletConfig.getInitParameterNames(), JSP-ben: config
  • JSP implicit objektumok: request, response, pageContext, session, application, out, config, page, exception.
  • The exception implicit object is only available in pages that have isErrorpage set to true.
  • Az application JSP implicit objektum a jspInit() metódusban nem érhető el, csak a _jspService() metódusban.
  • _jspInit() metódus deklarálása semmilyen hatással nincs a JSP-re. Meghívva sem lesz.
  • Validation: két allépésből áll: először XML-be konvertálja a JSP-t, majd ezt validálja.
  • JspContext.getAttributeNames() nem létezik. A ServletRequest, HttpSession és a ServletContext osztályoknak viszont van ilyen nevű metódusa (Enumeration visszatérési típussal). Továbbá létezik egy JspContext.getAttributeNamesInScope(int scope).
11. fejezet, JSP Documents
  • <jsp:declaration>, <jsp:scriptlet>, <jsp:expression> tag-ekben csak az & és < jeleket kell lecserélni.
  • <jsp:directive.page attr_list... />
  • JSP document: XML. A document a kulcsszó.
  • <jsp:directive.taglib> nem létezik.
  • <jsp:text><jsp:directive.page import="java.util.*" />hello</jsp:text> eredménye: <jsp:text> must not have any subelements. Translatin error.
  • <a href="<jsp:expression>request.getAttribute("x")</jsp:expression>">click here</a>: validation error.
  • jsp:text: bármilyen jól formázott XML-t tartalmazhat, de JSP akciókat nem. (Egyébként translation error.)
  • JSP 2.0 óta nem kötelező, hogy a root elem a jsp:root legyen.
12. fejezet, Expression Language
  • ${ "hello2" }: működik.
  • $ { "hello3" }: nem működik. Megjelenik: $ { "hello3" }
  • param implicit objektum az első paramétert adja vissza, ha több is van.
  • requestScope.tc["33"]: működik, ha get33() a metódus neve.
  • Taglib függvények neveinek egyedinek kell lennie. Overload nem lehetséges.
  • EL implicit objektumok: pageContext, pageScope, requestScope, sessionScope, applicationScope, param, paramValues, header, headerValues, cookie, initParam (ServletContext).
  • contextParam implicit objektum nincs.
  • tld: taglib > name > function-class, function-signature
  • ${ 10 div 0 } EL kifejezés eredménye: Infinity
  • EL-ben nincsenek bitművelet-operátorok.
13. fejezet, Standard Actions & JavaBeans
  • test.txt statikus fájl nevére bemappelt szervlet közül a szervlet fog meghívódni. (Tomcat 6)
  • jsp:useBean scope attribútumának default értéke page és csak a megadott (illetve a default) scope-ban keresi az objektumot.
  • Ha a jsp:useBean class attribútumának megadott osztály nem leszármazottja (implementációja) a type értékben megadott osztálynak (interfésznek), akkor RuntimeException és translation error is lehet az eredmény.
  • Két jsp:useBean ugyanazzal az id értékkel: translation error.
  • jsp:useBean beanName attribútumához kötelező a type attribútumot is megadni.
  • jsp:useBean body-ja csak akkor lesz kiértékelve, ha új példányt hoz létre a tag. Ez igaz a body-ban lévő szövegekre is.
  • scriptless-ként beállított oldalon a jsp:useBean nem hoz létre JSP scripting változót, de a megfelelő scope-ban elhelyezi az objektumot.
  • jsp:setProperty name attribútuma kötelező. Akkor is, ha useBean tagen belül használjuk.
  • Ha a jsp:useBean-nek nincs class és beanName megadva, csak type, és nem létezik a megadott scope-ban az id-val megadott objektum, akkor nem lesz új példányosítva, hanem InstantiationException dobódik.
  • A jsp:include tag page attribútumának relatív URL-t kell megadni, ami azt jelenti, hogy lehet context relatív, vagy az aktuális oldalhoz képest relatív az URL.
14. fejezet, Tag Libraries and the JSTL
  • Ha c:otherwise után szerepel c:when a c:choose-on belül, akkor JasperException a vége.
  • <c:forEach begin="0" end="5" step="1"> - end inclusive, 6-szor fog lefutni.
  • forEach varStatus: TagLoopStatus:
    • getIndex(): index értéke. Collection-ökre 0-val kezdődik.
    • getCount(): As an example, an iteration with begin = 5, end = 15, and step = 5 produces the counts 1, 2, and 3 in that order.
  • c:catch Throwable-ket kap el.
  • <c:set var="..." scope="..." value="..."> - A value lehet body is.
  • <c:set target="..." property="..." value="...">
  • <c:remove var="..." scope="...">
  • <c:if test="${ 5 < 6}"> - A csibecsőr XML stílusú JSP-nél nem megengedett, sima JSP oldalnál viszont működik.
  • <c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
  • <c:import url="..." [context="..."] varReader="..." [charEncoding="..."]>
  • <c:redirect url="..." context="...">
  • Csak tag fájlokban használható standard JSP akciók: jsp:doBody, jsp:invoke.
  • <jsp:doBody ({var="..." | varReader="..." } [scope="..." ] />) | />
  • <jsp:invoke fragment="..." ({var="..." | varReader="..."} [scope="..." ] />) | />
  • <jsp:attribute name="..." [ trim= "true | false" ] />
  • <jsp:getProperty name="beanInstanceName" property="propertyName" />
  • web-app > jsp-config* > taglib* > taglib-uri1, taglib-location1
  • c:out value="..." escapeXml="..." default="..." - A default attribútum értéke lehet a body is. Ha a value null, akkor a default lesz kiírva.
  • c:set target attribútumának Map is megadható.
  • A jsp:getProperty-nek nincs scope attribútuma.
  • A JSP-kben nincs automatikus encodeUrl, ha a sütik tiltva vannak a kliensnél. (c:url megoldja)
15. fejezet, Custom Tags
  • IterationTag folyamata: setPageContext, setParent, attr. setters, doStartTag, doAfterBody, doEndTag.
  • SimpleTag folyamata: példányosítás, setJspContext, setParent, attr. setters, setJspBody, doTag, destroy.
  • Ha üres a body, akkor a setJspBody nem lesz meghívva.
  • JspTag (ős) interfész leszármazottai: SimpleTag, Tag.
  • Tag.doStartTag() visszatérési értékei: EVAL_BODY_INCLUDE, SKIP_BODY (+BodyTag: EVAL_BODY_BUFFERED).
  • Tag.doEndTag() visszatérési értékei: EVAL_PAGE, SKIP_PAGE.
  • IterationTag.doAfterBody() visszatérési értékei: EVAL_BODY_AGAIN, SKIP_BODY.
  • BodyTag: void doInitBody().
  • TagSupport.doStartTag(): Default processing of the start tag, returning SKIP_BODY.
  • BodyTagSupport.doStartTag(): Default processing of the start tag returning EVAL_BODY_BUFFERED.
  • BodyContent metódusai: getReader(), getString(), writeOut(Writer), clearBody(), flush(), getEnclosingWriter().
  • SimpleTagSupport: protected JspContext getJspContext().
  • TagSupport: protected PageContext pageContext; (mező, nem metódus).
  • Tag interfész metódusai: int doEndTag(), int doStartTag(), Tag getParent(), void release(), void setPageContext(PageContext), void setParent(Tag).
  • A SimpleTag doTag() metódusa void, így nem térhetünk vissza SKIP_PAGE-pel, de helyette dobhatunk SkipPageException-t (JspException leszármazott).
  • DynamicAttributes interfész metódusa: void setDynamicAttribute(String uri, String localName, Object value) throws JspException. Emellé a TLD-ben is jelezni kell: taglib > tag > dynamic-attributes.
  • public interface IterationTag extends Tag: int doAfterBody() throws JspException.
  • public interface BodyTag extends IterationTag: void doInitBody() throws JspException, void setBodyContent(BodyContent).
  • public class TagSupport implements IterationTag
  • public class BodyTagSupport extends TagSupport implements BodyTag
  • Írás a kimenetre classic tag esetén: pageContext.getOut().print...() (JspWriter). Az IOException-t kezelni kell, mert a Tag metódusai nem deklarálták, így nem lehet továbbdobni.
  • Írás a kimenetre SimpleTag esetén: getJspContext.getOut().print...() (JspWriter). Az IOException továbbdobható.
16. fejezet, Tag Files
  • Saját tag használatakor a body-ban lévő EL (amit a jsp:doBody-val futtatunk) saját a pageContext-et kap. A variable direktíva mindenképp szükséges a szinkronizációhoz, nélküle például a page scope-pal paraméterezett c:out hatása sem látszik a body-ban.
  • tag direktíva body-content attribútumának lehetséges értékei: empty, tagdependent, scriptless (default), JSP.
    • tagdependent: nem fut EL resolver rajta. Példátul SQL-hez jó, ha semmilyen feldolgozást nem akarunk végezni a tartalmon, majd a tag megoldja.
    • JSP: SimpleTag (és tag fájlok) esetén nem használható, egyébként a body tartalmazhat JSP akciókat.
    • scriptless: JSP szkripting nem engedélyezett, EL, JSP akciók viszont igen.
  • Tag fájl belsejében üres jspContext-tel indulunk.
  • Ha a hívó JSP-ben <%@ page session="false" %>, akkor a hívott tagfájlban a session implicit objektum null lesz (Tomcat 6). A könyv szerint ez nem így van, mert mindig lesz session objektum.
  • Implicit objektumok egy tag fájlban (szkriptinghez): request, response, jspContext, session, application, out, config. (headers, param nem! Ezek EL-ből elérhetőek.)
  • SimpleTag (és tagfile) body-jában JSP szkriptinget használva translation error a jutalom.
  • Tag fájlok kiterjesztése csak .tag és .tagx lehet.
  • <%@ tag display-name="Addition" body-content="scriptless" dynamic-attributes="dyn" description="..." import="..." isELIgnored="..." pageEncoding="..." %>
  • <%@ attribute name="..." required="true" fragment="false" rtexprvalue="false" type="java.lang.Integer" description="..." %>
  • <%@ variable name-given="..." variable-class="java.lang.Integer" scope="NESTED" declare="true" description="..." %>
  • <%@ variable name-from-attribute="var" alias="result" %>
  • <jsp:doBody var="..." varReader="..." scope="..." />
  • <jsp:invoke fragment="..." var="..." varReader="..." scope="session"/>
  • Tag fájl hívásakor megadott attribútumok a JspContext-be kerülnek, onnan a getAttribute() metódussal, illetve EL-el a ${pageScope.attrName} illetve ${attrName} módon elérhetőek.
17. fejezet, Tag Deployment
  • Unpackaged tag library: tag fájlok: /WEB-INF/tags/, tag handlers: WEB-INF/classes, TLD-k: /WEB-INF/.
  • <jsp:root xmlns:my="urn:jsptld:/WEB-INF/mytags.tld" ...>
  • <jsp:root xmlns:my="urn:jsptagdir:/WEB-INF/tags/mylib" ...>
  • <%@ taglib uri="/WEB-INF/mylib.tld" prefix="my" %>
  • TLD JAR fájlokban: /META-INF alatt, .tld kiterjesztéssel.
  • TLD WAR fájlokban: /WEB-INF alatt, .tld kiterjesztéssel, vagy a /WEB-INF/lib alatt lévő JAR-okban.
  • Tag fájlok JAR fájlokban: /META-INF/tags alatt bárhol.
18. fejezet, Security
  • login-config* > auth-method?, realm-name?, form-login-config? > form-login-page1, form-logi-config1
  • web-app > security-role* > description*, role-name1
  • servlet > security-role-ref* > description*, role-name1, role-link?
  • security-constraint > display-name*
  • security-constraint > web-resource-collection+ > web-resource-name1, description*, url-pattern+, http-method*
  • security-constraint > auth-constraint? > description*, role-name*
  • security-constraint > user-data-constraint? > description*, transport-guarantee1
  • transport-guarantee lehet: NONE, INTEGRAL, CONFIDENTAL.
  • HttpServletRequest kapcsolódó metódusai: getAuthType(), isUserInRole(), getRemoteUser(), getUserPrincipal().
  • A "*" nem érvényes url-pattern érték. Ajánlott: "/*".
  • <role-name>*</role-name> jelentése: bármelyik bejelentkezett felhasználó.
  • Üres auth-constraint tag: senki sem férhet hozzá az erőforrásokhoz.
  • Ha nincs http-method megadva, akkor minden metódusra vonatkozik a beállítás.
  • Ha több security-constraint tag közül bármelyik engedélyezi a felhasználó számára a hozzáférést, akkor a felhasználó hozzá tud férni az erőforráshoz.

Hozzászólások

SCWCD Study Companion hibalista

Tartalom átvétel