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
A Charles Lyons-féle könyvben általam felfedezett hibák listáját felraktam a JavaRanch-re. A szerző nem reagált rá semmit pár hónap alatt.