Showing posts with label Servlet. Show all posts
Showing posts with label Servlet. Show all posts

SCWCD สรุป

เพิ่งจะผ่านมาสอบมาหมาดๆ ค่ะ แต่ตอนที่อ่านก่อนสอบก็ทำสรุปไปด้วยเรื่อยๆ ตาม link ด้านล่างนะค่ะ


สำหรับสรุปนี้รวมมาจากหนังสือ Head First Servlet and JSP เป็นหลัก
มาทำ link รวมไว้ให้เผื่อใครจะสอบ ตอนที่สอบเป็นรหัส 310-083 นะค่ะ รู้สึกว่าจะเป็น J2EE 1.5 ค่ะ
ขอให้โชคดีกันนะค่ะ

Servlet: Listener

listener class เป็นคลาสที่มีลักษณะเป็น event-driven คือ method ที่อยู่ใน listener จะต้องถูกเรียกโดยอัตโนมัติ มีการเหตุการณ์เกิดขึ้น ซึ่งแต่ละ class ก็จะ support event ที่แตกต่างกันไป



ที่เราเห็นใช้กันบ่อยหน่อย ก็คงจะเป็น ServletContextListener ซึ่งจะ support event ที่เกี่ยวกับการ initialize และ destroy context หรือเมื่อเรา deploy application เราขึ้นไปบน web container หรือตอนที่ เรา undeploy หรือตอนที่ server start หรือ clash ก็จะมีการเรียก class นี้ไปใช้ ส่วน ServletContextAttributeListener ก็จะเป็นคลาสที่ทำงานเมื่อการมี add, remove, replace attribute เข้าไปที่ context (ดังนั้นจะต้องเป็น attribute ที่เป็น context scope เท่านั้น)

ส่วน ServletRequestListener และ ServletRequestAttributeListener ก็จะคล้ายกัน คือ สำหรับเมื่อมี request เกิดขึ้น หรือก่อนที่ request จะจบ และเมื่อมีการเปลี่ยนแปลงของ attribute ใน request (page scope)

ส่วนอีก 4 listener ที่เหลือ คือ HttpSessionListener, HttpSessionAttributeListner และ HttpSessionActivationListener, HttpSessionBindingListener ก็จะเป็น listener ที่เกี่ยวกับ session โดย 2 อันแรก จะคล้ายกับที่กล่าวมาข้างต้น คือเกี่ยวกับ สร้าง/ทำลาย session และเกี่ยวกับ add, remove, replace ของ session attribute

สำหรับ HttpSessionActivationListener จะเกี่ยวพันถึงการ migrate session ข้าม jvm (สำหรับบางกรณี เช่นการทำ load-balancing) และ HttpSessionBindingListener จะคล้ายกับ HttpSessionAttributeListener แต่ต่างกันที่เป็น listener ที่จะ implement โดย attribute class คือมันจะ notify ที่ attribute ที่ implement มัน เมื่อ attribute นั้นๆ ถูกผูกเข้ากับ session หรือโยนออกจาก session

ซึ่ง listener class ส่วนใหญ่จะต้อง declare ไว้ใน DD (web.xml) ยกเว้น HttpSessionBindingListener ที่ไม่ต้องใส่ไว้ใน DD

ListenerDescriptionmethod
javax.servlet.
ServletContextListener
support event ที่เกี่ยวกับการ initialize และ destroy context หรือเมื่อเรา deploy application เราขึ้นไปบน web container หรือตอนที่ เรา undeploy หรือตอนที่ server start หรือ clash ก็จะมีการเรียก class นี้ไปใช้contextInitialized(ServletContextEvent)
contextDestroyed(ServletContextEvent)
javax.servlet.
ServletContextAttributeListener
ทำงานเมื่อการมี add, remove, replace attribute เข้าไปที่ contextattributeAdded(ServletContextAttributeEvent)
attributeRemoved(ServletContextAttributeEvent)
attributeReplaced(ServletContextAttributeEvent)
javax.servlet.
ServletRequestListener
เมื่อมี request เกิดขึ้น หรือก่อนที่ request จะจบ requestInitialized(ServletRequestEvent)
requestDestroyed(ServletRequestEvent)
javax.servlet.
ServletRequestAttributeListener
เมื่อมีการเปลี่ยนแปลงของ attribute ใน request
attributeAdded(ServletRequestAttributeEvent)
attributeRemoved(ServletRequestAttributeEvent)
attributetReplaced(ServletRequestAttributeEvent)
javax.servlet.http.
HttpSessionListener
เกี่ยวกับ สร้าง/ทำลาย sessionsessionCreated(HttpSessionEvent)
sessionDestroyed(HttpSessionEvent)
javax.servlet.http.
HttpSessionAttributeListner
เกี่ยวกับ add, remove, replace ของ session attributeattributeAdded(HttpSessionBindingEvent)
attributeRemoved(HttpSessionBindingEvent)
attributeReplaced(HttpSessionBindingEvent)
javax.servlet.http.
HttpSessionActivationListener
จะเกี่ยวพันถึงการ migrate session ข้าม jvm (สำหรับบางกรณี เช่นการทำ load-balancing)sessionDidActivate(HttpSessionEvent)
sessionWillPassivate(HttpSessionEvent)
javax.servlet.http.
HttpSessionBindingListener
คล้ายกับ HttpSessionAttributeListener แต่ต่างกันที่เป็น listener ที่จะ implement โดย attribute class คือมันจะ notify ที่ attribute ที่ implement มัน เมื่อ attribute นั้นๆ ถูกผูกเข้ากับ session หรือโยนออกจาก sessionvalueBound(HttpSessionBindingEvent)
valueUnbound(HttpSessionBindingEvent)

Servlet: Cookie Example1

ตัวอย่างนี้เป็นตัวอย่างโปรแกรม cookie ที่เพียงต้องการแสดงให้รู้จักการใช้ cookie เท่านั้น อาจจะไม่ใช่โปรแกรมที่สมเหตุสมผลเท่าไรนะค่ะ

เอาละ มาดูกัน

CookieAdd.java

package com.amadmonster.scwcd.cookies; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class CookieAdd */ public class CookieAdd extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); // add any name to test cookie Cookie cookie = new Cookie("username", "amadmonster"); cookie.setMaxAge(30 * 60); response.addCookie(cookie); RequestDispatcher view = request .getRequestDispatcher("cookies/cookieresult.jsp"); view.forward(request, response); } }


cookie/cookieresult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="testcookie.do">click</a> </body> </html>

CookieAdd เป็น servlet ที่ใส่ cookie username ไว้ และ forward ต่อให้ cookieresult.jsp แสดงลิงค์ ไปยัง CookieTester (testcookie.do map กับ CookieTester.java) เพื่อแสดงผลค่าของ cookie username ที่เก็บไว้

CookieTester.java

package com.amadmonster.scwcd.cookies; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class CookieTester */ public class CookieTester extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("username")) { String userName = cookie.getValue(); out.println("Hello " + userName); break; } } } }


Cookie จะเหมือน attribute ใน session scope ฮับ คือใน session เดียวกันจะเป็นตัวเดียวกัน ในขณะที่อีก session หนึ่งจะไม่เห็นตัวแปรนั้น ลองทดสอบได้ฮับ ถ้าคุณใช้ IE อยู่ หลังจากที่ run CookieAdd แล้ว ให้ลองเปิดอีก tab หนึ่ง (แต่ยังอยู่ใน windows เดียวกันนะ) ให้ run testcookie.do ซึ่งจะแสองผลเหมือนกับยังอยู่ใน tab เดิมอยู่ แต่ถ้าเปิด IE ขึ้นมาอีก 1 ตัว และลอง run testcookie.do (โดยไม่ run CookieAdd ก่อน) จะได้เป็นหน้าว่างๆ ฮับ เนื่องจากไม่มี cookie ที่ชื่อ username ที่จะแสดงผลนั่นเอง

ลองดูนะฮับ ขอให้โชคดี

Servlet: Class Diagram



สำหรับ parameter ที่ได้รับมาจากแต่ละ reqest method ที่ใช้ก็จะเป็น method ที่อยู่ใน ServletRequest ทั้งหมด ซึ่งมีดังนี้

getParameter(String)
getParameterNames()
getParameterValue(String) - คล้ายกับ getParameter(String) แต่สามารถดึงค่าตัวแปรที่เป็น array ของ String ได้

จะเห็นว่า parameter มีแต่ get method เท่านั้น เราไม่สามารถ set ค่า ให้กับ parameter ได้


Initial parameter

สำหรับ initial parameter ที่กำหนดไว้ใน deployment descriptor ซึ่งมีด้วยกัน 2 ส่วนคือ
  1. ส่วนที่กำหนดไว้ที่ context-param ซึ่งเป็นค่าทุก servlet สามารถนำไปใช้ได้ โดยใช้ method จาก ServletContext getInitParameter(String) หรือ getInitParameterNames()
  2. ส่วนที่กำหนดไว้ที่ init-param ใน servlet จะต้องใช้ ServletConfig getInitParameter(String) method

Attribute

ก่อนหน้านี้เคยสงสัยเหมือนกันว่า parameter มันต่างกับ attribute ตรงไหน ส่วนที่ต่างกันนอกจากเราไม่สามารถ set ค่าให้กับ parameter ได้แล้ว นอกนั้นหลักๆ เลยก็คือ parameter มันเก็บได้เฉพาะค่าที่เป็น String เท่านั้น แต่ attribute สามารถเก็บค่าที่เป็น object ใดๆ ก็ได้

จาก Class Diagram ก็จะเห็นว่า มี method ที่เกี่ยวกับ attribute (setAttribute(String, Object), getAttribute(String), removeAttribute(String), getAttributeName()) อยู่ใน 3 object ซึ่งก็คือ
  1. ServletContext
  2. HttpSession
  3. ServletRequest
นั่นก็หมายความว่า attribute จะอยู่ใน 3 scope คือ application, session และ request ซึ่งก็หมายถึง การเข้าถึง attribute ทั้ง 3 scope จะแตกต่างกันด้วย (นั่นหมายถึงการ ป้องกัน attribute เพื่อให้เป็น thread-safe ก็จะต้องแตกต่างกันด้วย)
  1. application scope - ทุก session ทุก servlet สามารถเข้าถึง attribute นี้ได้ทั้งหมด ดังนั้นถ้าต้องการจะทำให้เป็น thread-safe จะต้อง synchronize ที่ ServletContext เพื่อป้องกัน servlet ตัวอื่นๆ ที่จะเข้าถึงattribute ตัวนี้ได้
  2. session scope - attribute นี้ เข้าถึงได้จาก session เดียวกันเท่านั้น ดังนั้นการทำ thread-safe ก็จะต้อง synchonize ที่ HttpSession เพื่อให้เรียกใช้ตัวแปรใน session นั้นๆ ได้ทีละครั้งเท่านั้น
  3. request scope - ใช้ได้ภายใน request หนึ่งๆ เท่านั้น ตัวนี้เป็น thread-safe อยู่แล้ว ไม่ต้องทำไร สำหรับ servlet ที่ถูกเรียกใช้โดย forward หรือ include จะมี default attribute ซึ่ง container สร้างไว้เลยดังนี้

    ForwardInclude
    javax.servlet.forward.request_urijavax.servlet.include.request_uri
    javax.servlet.forward.context_pathjavax.servlet.include.context_path
    javax.servlet.forward.servlet_pathjavax.servlet.include.servlet_path
    javax.servlet.forward.path_infojavax.servlet.include.path_info
    javax.servlet.forward.query_stringjavax.servlet.include.query_string
    NB. ทั้งนี้เหมือนกับ method ของ HttpServletRequest คือ getRequestURI(), getContextPath(), getServletPath(), getPathInfo(), getQueryString()


Session

สำหรับการจัดการ session Object ที่เราต้องใช้หนักๆ เลยก็คือ HttpSession ซึ่งใน diagram จะ list ไว้เฉพาะ method ที่เราใช้กันบ่อยๆ ไว้แล้ว ส่วน Object อื่นๆ ที่เกี่ยวข้องกับการจัดการ session ก็คือ HttpServletRequest getSession() method ซึ่งที่เกี่ยวกับ session จริงๆ จะมีแค่นี้ค่ะ

โดยปกติแล้ว session จะใช้หลักการส่ง-รับ session id ระหว่าง server กับ client ซึ่งจะต้องใช้ cookie เป็นหลัก ดังนั้นถ้า client disable การับ cookie ไว้ การจัดการ session โดยวิธีนี้ก็จะใช้ไม่ได้ทันที ดังนั้นจะต้องมีวิธีอื่นเพื่อรองรับกรณี นั้นก็คือการ แปะ session id ไปกับ URL ซึ่งเราก็จะใช้ HttpServletResponse encodeURL(String) หรือ encodeRedirectURL(String) ในกรณีที่เป็น redirect URL เพื่อให้ container แปะ session id ให้เราโดยอัตโนมัติ


Cookies

Cookie เป็นส่วนหนึ่งที่ช่วยในการจัดการ session Object ที่เราใช้ก็คือ Cookie ซึ่งใน diagram ก็ list method ที่จะต้องใช้ไว้ให้แล้ว นอกจากนี้ ที่เราจะต้องใช้สำหรับ เพิ่ม cookie และ ดึงค่า cookie มาใช้ก็คือ HttpServletResponse addCookie(Cookie) และ HttpServletRequest getCookies() (ไม่มี method สำหรับการดึง cookie ตัวใดตัวหนึ่งออกมา เราจะต้องใช้การวนค่า array Cookie[] เพื่อดึงค่าที่ต้องการออกมาเอง)

สุดท้ายแถม Servlet Life Cycle ให้ฮับ



สำหัรบ HttpServlet service() method จะเรียก doGet(), doPost, etc. แ้ล้วแต่ request ที่ำได้รับยกเว้น CONNECT method ซึ่ง HttpServlet ไม่ support

Reference:
Web Application FAQ

Servlet: Deployment Descriptor (DD)

DD ก็คือ XML ไฟล์ที่กำหนดการ deploy Servlet สำหรับ Web Container หรือ DD ก็คือ web.xml นะเอง

ตัวอย่างของ DD อย่างง่ายๆ
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <context-param>
    <param-name>param</param-name>
    <param-value>parameter value</param-value>
  </context-param>
  [ <context-param> ...parameter name-value pair as above... </context-param> ]

  <listener>
    <listener-class>package.class</listener-class>
  </listener>

  <session-config>
    <session-timeout>10</session-timeout>
  </session-config>

  <servlet>
    <servlet-name>Internal Name</servlet-name>
    <servlet-class>package.ServletClass</servlet-class> | <jsp-file>path/file.jsp</jsp-file>
    <load-on-startup>1<load-on-startup/>

    <init-param>
      <param-name>param</param-name>
      <param-value>parameter value</param-value>
    </init-param>
    [ <init-param> ...parameter name-value pair... <init-param> ]...

    <security-role-ref>
      <role-name>Manager</role-name>
      <role-link>Admin</role-line>
    </security-role-ref>
  </servlet>

  <servlet-mapping>
    <servlet-name>Internal Name</servlet-name>
    <url-pattern>/Public.do</url-pattern>
  </servlet-mapping>

  <jsp-config>
    <jsp-property-group>
      <url-pattern>*.jsp</url-pattern>
      <el-ignored>[ true | false ]</el-ignored>
      <scripting-invalid>[ true | false ]</scripting-invalid>
    </jsp-property-group>

    <taglib>
      <taglib-uri>randomThing</taglib-uri>
      <taglib-location>/WEB-INF/myFunctions.tld</taglib-location>
    </taglib>
  </jsp-config>

  <!-- filter config -->
  <filter>
    <filter-name>LogRequest</filter-name>
    <filter-class>package.Filter</filter-class>

    <init-param>
      <param-name>param</param-name>
      <param-value>parameter value</param-value>
    </init-param>
    [ <init-param> ...parameter name-value pair... <init-param> ]...
  </filter>

  <filter-mapping>
    <filter-name>LogRequest</filter-name>
    <url-pattern>/path/*</url-pattern> | <servlet-name>AnyRequest</servlet-name>
    <dispatcher> REQUEST | INCLUDE | FORWARD | ERROR </dispatcher>
    [ <dispatcher> REQUEST | INCLUDE | FORWARD | ERROR </dispatcher> ]...
  </filter-mapping>

  <!-- declare welcome file -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    [ <welcome-file>index.html</welcome-file> ]...
  </welcome-file-list>

  <!-- declare to catch all error, but you can change to catch only some exceptions -->
  <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/ErrorPage.jsp</location>
  </error-page>

  <!-- This is another way to catch error by status code -->
  <error-page>
    <error-code>404</error-code>
    <location>/ErrorNotFound.jsp</location>
  </error-page>

  <!-- external resource related -->
  <resource-env-ref>
    <resource-env-ref-name>jms/StockQueue</resource-env-ref-name><resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
</resource-env-ref>
  <resource-ref>
    <res-ref-name>ECC</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth> APPLICATION | CONTAINER </res-auth>
    <res-sharing-scope> Shareable | Unshareable </res-sharing-scope>
  </resource-ref>

  <!-- EJB related -->
  <ejb-local-ref>
    <ejb-ref-name>JNDI lookup name (such as ejb/Customer)</ejb-ref-name>
    <ejb-ref-type> Entity | Session </ejb-ref-type>
    <local-home>package.Class</local-home>
    <local>package.Class</local>
  </ejb-local-ref>

  <ejb-ref>
    <ejb-ref-name>JNDI lookup name (such as ejb/Customer)</ejb-ref-name>
    <ejb-ref-type> Entity | Session </ejb-ref-type>
    <home>package.Class</home>
    <remote>package.Class</remote>
  </ejb-ref>

  <env-entity>
    <env-entry-name>JNDI lookup name (such as rates/discountRate)</env-entry-name>
    <env-entry-type>java.lang.Integer</env-entry-type>
    <env-entry-value>10<env-entry-value>
  </env-entity>

  <!-- mine-type mapping -->
  <mime-mapping>
    <extension>mgp</extension>
    <mime-type>video/mpeg</mime-type>
  </mime-mapping>

  <!-- constraint resource -->
  <security-constraint>

    <web-resource-collection>
      <web-resource-name>some name</web-resource-name>
      <description>explain about tht resource</description>
      <url-pattern>/Public.do</url-pattern>
      [ <url-pattern>/Path/resource</url-pattern> ]...

      <http-method>GET | POST | PUT | TRACE | DELETE | HEAD | OPTION</http-method>
      [ <http-method>GET | POST | PUT | TRACE | DELETE | HEAD | OPTION</http-method> ]...
    </web-resource-collection>

    <auth-constraint>
      <role-name>Admin</role-name>
      [ <role-name>Others</role-name> ]...
    </auth-constraint>

    <user-data-constraint>
      <transport-guarantee> NONE | INTEGRAL | CONFIDENTIAL </transport-guarantee>
    </user-data-constraint>
  </security-constraint>

  <!-- authorization path to define role -->
  <security-role><role-name>Admin</role-name></security-role>
  [ <security-role><role-name>Admin</role-name></security-role> ]...

  <login-config>
    <auth-method>BASIC | DIGEST | CLIENT-CERT | FORM</auth-method>
    <form-login-config>
    <form-login-page>/loginPage.html</form-login-page>
    <form-error-page>/loginPage.html</form-error-page>
    </form-login-config>
  </login-config>

</web-app>

context-param เป็นค่าที่กำหนดไว้สำหรับทั้ง application
listener เป็นตัวกำหนดว่าใน application ของเรามี listener อะไรบ้าง


Servlet Configuration

session-timeout กำหนดระยะเวลาที่ session inactive กี่นาที ก่อนจะหลุด session จากตัวอย่างข้างบน คือ ถ้า session inactive 10 นาที ก็จะหลุด ถ้าใส่ 0 หมายถึงให้ time out ทันมี (เสมือนเรียก HttpSession invalidate())
servlet-name ใน servlet เป็นชื่อที่ใช้ใน DD เพื่อเชื่อกับ servlet-name ใน servlet-mappping
servlet-class เป็น Servlet class ที่เราเขียนขึ้นมาเพื่อให้มัน process อะไรสักอย่างสำหรับเวปเรา
jsp-file เป็นชื่อไฟล์ jsp ที่เราต้องการใส่แทน servlet class โดยปกติ jsp สามารถแสดงผลได้โดยไม่ต้องใ่ส่ใน deployment descriptor ก็ได้ แต่เราจะใส่ในกรณีที่เราต้องการ config เพิ่มเติม เช่นต้องการกำหนดค่า init-param แต่ในกรณีที่เราเขียน jsp-file tag แล้ว จะต้องไ่ม่มี servlet-class tag อีก
load-on-startup เป็นการบอกว่าจะให้ servlet นั้นๆ ทำการ load ตั้งแต่ตอน deploy หรือไม่ (เพื่อเป็นการย่นระยะเวลาในการเรียกใช้ของผู้ใช้ในครั้งแรก)

init-param เป็นค่าที่กำหนดไว้สำหรับ servlet นั้นๆ ซึ่งสามารถมี init-param tag ได้มากกว่า 1 ตัวสำหรับหลายๆ parameter

servlet-mapping กำหนดค่ารูปแบบ url ที่จะใช้เรียก servlet ซึ่งลำดับในการ map จะใช้เป็น exact match (คือจะต้องถูกต้องตรงกับ url-pattern ทั้งหมด), directory match (เช่น url-pattern เป็น /test/*) สุดท้ายคือ extension match (เช่น *.do)
url-pattern เป็น URL pattern สำหรับ คนภายนอกที่จะเรียกใช้ ทั้งนี้เราสามารถเขียนเป็น pattern ซึ่งทุก URL ที่ตรงกับ pattern ที่กำหนดจะใช้ Servlet class ตัวเดียวกัน

JSP Configuration

el-ignored กำหนดให้ EL ทำงานหรือไม่ ถ้าเป็น true คือไ่ม่ให้ทำงาน
scripting-invalid กำหนดให้ JSP สามารถใส่ scriptlet ได้หรือไม่

taglib เป็นการกำหนด location ของ Tag Library Descriptor ซึ่งใช้สำหรับก่อน JSP 2.0 ซึ่งจำเป็นต้องบอก location ที่ให้กับ web container แต่ตั้งแต่ JSP 2.0 เป็นต้นไป ไม่จำเป็นต้องมากำหนดใน DD แล้ว web container สามารถหาได้จากการ map ไฟล์ .tld ทุกไฟล์ที่อยู่ใน WEB-INF รวมถึง META-INF ใน jar ไฟล์ แต่ถ้ามีการกำหนดค่าไว้ใน DD และถึงแม้จะเป็น JSP 2.0 web container ก็จะใช้ตัวที่กำหนดไว้ใน DD เท่านั้น

Filter Configuration

Web container จะเรียง filter ตามลำดับที่ปรากฎใน Deployment descriptor โดยจะเลือกที่ map โดย url-pattern ก่อน servlet-name

Error Configuration
exception-type เป็น Class ที่ต้องการจะดักเพื่อให้ redirect ไปยัง error page
error-code นอกจากจะดักเป็น Exception class แล้ว ก็สามารถดักเป็น status code ได้
location เป็น relative location ของ error page

EJB Configuration

env-entry-type จะต้องเป็น Class เท่านั้น เป็น primitive type ไม่ได้

Security Configuration

ส่วนนี้เป็นแยกเป็นส่วนที่เกี่ยวกับ Authorization และ Authentication ซึ่งจะต้องใช้ร่วมกับ web container แต่ละตัว ซึ่งแต่ละียี่ห้อก็จะแตกต่างกัน เช่น Tomcat ใช้การ config ไว้ที่ไฟล์ conf/tomcat-users.xml

ส่วนที่เกี่ยวกับ Authorization จะเป็นการกำหนดว่า resource ไหน จะถูกจำกัดด้วย role ใด โดยวีธีใดบ้าง

security-constraint เป็นส่วนที่กำหนดว่า resources หรือไฟล์ไหนและ method ไหนบ้างที่จะต้องมี constraint กำหนดไว้ เช่น
url-pattern เป็น resource ที่ถูกกำหนดว่าจะต้องมี constraint ซึ่ง กำหนดเป็นไฟล์ใดไฟล์หนึ่ง หรือว่ากำหนดเป็น path ก็ได้ (ในกรณีนี้จะเป็น /path/*) หรือกำหนดเป็น pattern เช่น /path/*.do ก้ได้ แต่อย่างไรก็ตามจะต้องกำหนดอย่างน้อย 1 resouce
auth-contraint เป็นตัวกำหนดว่า resource เหล่านี้จะมี constraint ที่ method ไหนบ้าง ซึ่งจะใช้ได้กับทั้ง resource ใน web-resource-collection

ส่วนถัดมาเป็น Authentication เป็นส่วนกำหนดว่าจะมี role ในบ้าน โดยวีธีการ authentication แบบใด
security-role และ role-name เป็นตัวกำหนดว่าจะมี role อะไรบ้าง

สำหรับโครงสร้างในการ deploy web application จะเป็นดังนี้


Reference:

MVC บน Servlet

การนำ MVC มาใช้กับ Servlet และ JSP นั้น เราจะให้

Java object เป็น model
JSP เป็น view
Servlet เป็น controller

ง่ายๆ แบบนี้แหละ จบ.