SlideShare a Scribd company logo
IMC Institute




    Java Web
    Programming
    Using Cloud Platform

    By Associate Professor Dr. Thanachart Numnonda
     & Associate Professor Dr. Thanisa Kruawaisayawan
    Date 18 – 22 Feb 2013
1




                Hand-on
                Exercises

         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš
       Java Servlet / JSP
                    āđ‚āļ”āļĒāđƒāļŠāđ‰
      Eclipse and TomCat




Assoc.Prof.Dr.Thanachart Numnonda
             Software Park Thailand

                      and
Asst.Prof.Dr.Thanisa Kruawaisayawan
King Mongkut's Institute of Technology Ladkrabang



              February 2013

                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
2

                                                                   āļŠāļēāļĢāļšāļąāļ
Exercise 1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āđ„āļŸāļĨāđŒ HTML..........................................................................5
  1.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server...................................................................................................................... 5
  1.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project.................................................................................................. 7
  1.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html................................................................................................ 9
  1.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...........................................................................................................................13
Exercise 2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ..........................................................................15
  2.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java......................................................................................... 15
     2.1.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addCustomer.html ............................................................................... 15
     2.1.2 āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†.......................................................................................................16
  2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java ................................................................................17
  2.3 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...........................................................................................................................19
Exercise 3 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāđ‚āļžāļĨ......................................................................................................... 21
  3.1 āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html....................................................................................................................... 21
  3.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java................................................................................................. 21
     3.2.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang ................................................................................................22
     3.2.2 āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ........................................................... 22
     3.2.3 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•...................................................................................................................22
  3.3 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter ............................................................................................................ 23
  3.4 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java............................................................................................... 28
     3.4.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters................................................................................................................28
     3.4.2 āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰.......................................................................................................... 28
Exercise 4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MySQL Database............................................................................................. 30
  4.1 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ MySQL āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench....................................................................... 30
  4.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ books....................................................................................................................... 31
  4.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđƒāļ™ MySQL WorkBench........................................................................................33
Exercise 5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ........................................................................................ 35
  5.1 āļāļēāļĢ Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver...............................................................35
  5.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project................................................................................................ 36
  5.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html..................................................................................................... 36
  5.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html.................................................................................................... 37
  5.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java......................................................................................... 38
     5.5.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addBook.html ......................................................................................38
     5.5.2 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ...............................................................................................................38
     5.5.3 āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ ................................................................................................ 39
     5.5.4 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ thankyou.html ................................................................................................ 39
  5.6 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java ................................................................................40
  5.7 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................41
Exercise 6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB.......................................................................... 43
  6.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ MongoDB..................................................................................................................... 43
  6.2 āļāļēāļĢāđƒāļŠāđ‰ MongoDB......................................................................................................................... 44
  6.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB.......................................................................45
  6.4 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................47
Exercise 7 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„............................................................................................ 48
  7.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request ..................................................................... 48
     7.1.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request .....................................................50
     7.1.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request.................................................... 50
  7.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session ......................................................................51


Thanachart Numnonda and Thanisa Kruawaisayawan
3

     7.2.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session ......................................................53
     7.2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session .................................................... 53
  7.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application................................................................ 54
     7.3.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Application................................................................. 55
     7.3.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application.............................................. 56
Exercise 8 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener............................................................... 57
  8.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java.............................................................................................................. 57
  8.2 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java ......................................................................................60
  8.3 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................61
Exercise 9 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter ...............................................................................................62
  9.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter.......................................................................................................62
  9.2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļē Login......................................................................................................................... 63
  9.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Servlet Filter.................................................................................................................. 64
  9.4 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet ........................................................................................................67
  9.5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ ..................................................................................................................68
Exercise 10 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ...........................................................................................69
  10.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp........................................................................................................... 69
  10.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp................................................................................................... 70
     10.2.1 āļāļēāļĢāļāļģāļŦāļ™āļ” Tag Library........................................................................................................ 70
     10.2.2 āļāļēāļĢāļāļģāļŦāļ™āļ” Datasource......................................................................................................... 70
     10.2.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ c:forEach āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨ ............................................................................................ 71
Exercise 11 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Online Book Store................................................................................. 73
  11.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp.................................................................................................73
  11.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java......................................................................................................... 80
  11.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java........................................................................................................... 83
  11.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java....................................................................................... 84
  11.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java ............................................................................................................87
  11.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp..................................................................................................... 87
  11.7 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ ................................................................................................................88
Exercise 12 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tags āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ JSP................................................................................89
  12.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp............................................................................................................ 89
  12.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp................................................................................................... 95
  12.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp................................................................................................96
     12.3.1 āļŠāļĢāđ‰āļēāļ‡ Tag File.....................................................................................................................96
     12.3.2 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp..............................................................................................97
  12.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp...................................................................................................... 97
     12.4.1 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Java ClassTag Handler.........................................................................................98
     12.4.2 āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor........................................................................................... 101
     12.4.3 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp.................................................................................................. 103
Exercise 13 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework...................................................................... 104
  13.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework..............................................................104
  13.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View]....................................................................................... 105
  13.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model]....................................................................... 108
  13.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View].......................................................................................... 111
  13.5 āļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml............................................................................................................... 111
  13.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ....................................................................................................................... 111
Exercise 14 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework........................................................................ 113
  14.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework.............................................................. 113
  14.2 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller................................................................................................................. 114
  14.3 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP............................................................................................................................114


                                                                                                               āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
4

  14.4 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml...................................................................................... 115
  14.5 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml.................................................................................................................... 115
  14.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ.......................................................................................................................116
  14.7 āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ................................................................................................. 116
Exercise 15 āļāļēāļĢ Authentication āđ‚āļ”āļĒāđƒāļŠāđ‰ Tomcat .....................................................................................121
  15.1 āļŠāļĢāđ‰āļēāļ‡ Web Application Project................................................................................................ 121
  15.2 āđ€āļžāļīāđˆāļĄ User āļ‚āļ­āļ‡ Tomcat Web Server........................................................................................... 121
  15.3 āļāļēāļĢ Config āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Web Application āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ Tomcat user .....................................122
  15.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Basic Authenticate...................................................................................124
  15.5 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰ Login Form........................................................................................ 125
  15.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Form Authenticate.................................................................................. 126
  15.7 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ Authenticate āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļˆāļēāļ Database MySQL.............................................. 126
  15.8 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Database Authenticate............................................................................ 127
Exercise 16 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App Engine...................................................................... 128
  16.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine............................................................................ 128
  16.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project............................................................................................ 129
  16.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine................................................................ 133
  16.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account................................................................................135
Exercise 17 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA........................................ 138
  17.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Google App Engine............................................................................................138
  17.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book Entity Class..........................................................................................138
  17.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java........................................................................................................ 139
  17.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html................................................................................................. 140
  17.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine............................................140
  17.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Books ......................................................................................... 142




Thanachart Numnonda and Thanisa Kruawaisayawan
5


          Exercise 1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āđ„āļŸāļĨāđŒ HTML
         āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āļžāļąāļ’āļ™āļēāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡
āļĨāļđāļāļ„āđ‰āļē āđ‚āļ”āļĒāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē HTML āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ­āļīāļ™āļžāļļāļ•āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ Web
Browser āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Eclipse āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļˆāļ°āđƒāļŠāđ‰ Apache Tomcat v 6.0
āđ€āļ›āđ‡āļ™ Web Server
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
     1. āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server
     2. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application
     3. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html

1.1   āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server
       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāļāļģāļŦāļ™āļ” Perspective āļ‚āļ­āļ‡ Eclipse āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Java EE āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Windows >
Open Perspective > Other ..āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ Java EE āđƒāļ™ Dialog Box āļˆāļ°āđ„āļ”āđ‰ Perspective āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.1




                                  āļĢāļđāļ›āļ—āļĩāđˆ 1.1 Perspective āļŠāļģāļŦāļĢāļąāļš Java EE
        āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄ Tomcat Web Server āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Eclipse āļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡
āđ„āļ”āđ‰ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļ”āļąāļ‡āļ™āļĩāđ‰
        āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđāļ—āļ› Servers āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™ Window āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Server
        āđ€āļĨāļ·āļ­āļāļŠāļ·āđˆāļ­ Apache → Tomcat 6.0 Server (āļŦāļĢāļ·āļ­ Version āļ­āļ·āđˆāļ™) āđāļĨāļ° Browse āđ„āļ›āļĒāļąāļ‡ folder Tomcat āļ—āļĩāđˆāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ§āđ‰
        āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK āđāļĨāļ° Finish



                                                                                  āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
6




                             āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļāļēāļĢ Config Eclipse āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļđāđ‰āļˆāļąāļ TOMCAT Web Server

        āđ€āļĢāļēāļˆāļ°āđ€āļŦāđ‡āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Server āļĄāļĩāļŠāļ·āđˆāļ­ Web Server āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Tomcat āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļĄāļēāļ‹āļķāđˆāļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢ Start/Stop
Server āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Server āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ‚āļķāđ‰āļ™āļĄāļēāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.3




                                           āļĢāļđāļ›āļ—āļĩāđˆ 1.3 āđ€āļĄāļ™āļđāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ Web Server




Thanachart Numnonda and Thanisa Kruawaisayawan
7

          āđ€āļĢāļēāļˆāļģāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ„āđˆāļē Server Configuration āļ‚āļ­āļ‡ Tomcat āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđāļ—āļ› Server āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ
Tomcat Server āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Server āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Server Locations āđ€āļ›āđ‡āļ™ Use Tomcat Installation
āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.4




                                     āļĢāļđāļ›āļ—āļĩāđˆ 1.4 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē Server Locations
1.2    āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project
           āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web-Base Application āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Project
           āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Project āļ‚āļĒāļēāļĒ Folder āļŠāļ·āđˆāļ­ Web āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Dynamic Web Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.5




                                   āļĢāļđāļ›āļ—āļĩāđˆ 1.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application

                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
8

    2.   āđƒāļŦāđ‰āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ WebApp
         āļŠāđˆāļ§āļ™āļāļēāļĢāđ€āļāđ‡āļš File Eclipse āļˆāļ°āđƒāļŠāđ‰ Directory āļ—āļĩāđˆāļ–āļēāļĄāđ€āļĄāļ·āđˆāļ­āļ„āļĢāļąāđ‰āļ‡āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™ Default
         āđāļ•āđˆ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāļīāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļ­āļ (Uncheck) āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļ Directory āđƒāļŦāļĄāđˆāđ„āļ”āđ‰
         āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.6




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 1.6 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Project
    3.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Folder āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output folder (āļ—āļĩāđˆāđ€āļāđ‡āļš Class file)
         āļ„āļ·āļ­ [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]src āđāļĨāļ° [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]buildclasses
         āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next




                              āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āđāļŠāļ”āļ‡āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output directory


Thanachart Numnonda and Thanisa Kruawaisayawan
9


      4.   āđāļŠāļ”āļ‡ Context root āđāļĨāļ° Content directory āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āļāļ” Finish




                               āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āđāļŠāļ”āļ‡āļŠāļ·āđˆāļ­ Context root āđāļĨāļ° Content directory

1.3    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html
        āđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļđāļāļ„āđ‰āļē āđāļĨāđ‰āļ§ āļ™āļģāđ„āļ›āļšāļąāļ™āļ—āļķāļāļĨāļ‡āļāļēāļ™
āļ‚āđ‰āļ­āļĄāļđāļĨ customers āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļŦāļ™āđ‰āļēāļˆāļ­ HTML āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.9 (āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ”
āļ–āļąāļ”āđ„āļ›)




                                      āļĢāļđāļ›āļ—āļĩāđˆ 1.9 āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆ addCustomer.html




                                                                                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
10

     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html
     1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebApp āđ€āļĨāļ·āļ­āļ           New → HTML File āļ”āļąāļ‡āļĢāļđāļ› 1.10




                                                      āļĢāļđāļ›āļ—āļĩāđˆ 1.10 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML

     2.   āļāļģāļŦāļ™āļ” HTML File Name: āđ€āļ›āđ‡āļ™ addCustomer āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ› 1.11




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 1.11 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ File HTML




Thanachart Numnonda and Thanisa Kruawaisayawan
11


3.   āđ€āļ‚āļĩāļĒāļ™ source code āļ—āļģāđ„āļ”āđ‰ 2 āļĢāļđāļ›āđāļšāļšāļ„āļ·āļ­
     āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 1 āđ€āļ‚āļĩāļĒāļ™āļ•āļēāļĄ Listing āļ—āļĩāđˆ 1.1
     Listing āļ—āļĩāđˆ 1.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html
     <html><head><title> Add Customer</title></head>
     <body><H1> Add a new customer profile</H1>
     <form action="addCustomer.do" method="POST">
            Customer ID : <input name="id" /> <br>
            Name: <input name="name" /> <br>
            Address: <textarea name="addr" rows="4" cols="20"></textarea> <br>
            Mobile: <input name="mobile" size="9" /> <br>
            Fax: <input name="fax" size="9" /> <br>
            E-mail: <input name="email" size="25" /> <br><br>
            <input type="submit" value="Add" />
     </form>
     </body>
     </html>


     āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 2 āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļĨāļēāļ Icon āļ›āļĢāļ°āđ€āļ āļ— HTML Forms
     āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Palette āļĄāļēāđƒāļŠāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļˆāļ­ Design āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ HTML āļ”āļąāļ‡āļ™āļĩāđ‰
               - āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­ HTML āđ€āļ”āļīāļĄ
               - āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ File addCustomer.html
               - āđ€āļĨāļ·āļ­āļ Open With āđāļĨāļ°āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ Web Page Editor āļ”āļąāļ‡āļĢāļđāļ› 1.12




                          āļĢāļđāļ›āļ—āļĩāđˆ 1.12 āļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļ›āļīāļ” HTML āļāļąāļš Editor āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Design view




                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
12

                   - āļ„āļĨāļīāļāđ€āļĨāļ·āļ­āļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ§āđˆāļēāļ‡āļŠāđˆāļ§āļ™āļšāļ™āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āđ€āļĨāļ·āļ­āļ Show āđāļĨāļ° Palette




                                     āļĢāļđāļ›āļ—āļĩāđˆ 1.13 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ HTML Forms Icon āđƒāļ™ Palette Tools

                   - āļˆāļ°āđ„āļ”āđ‰ Tab āļŠāļ·āđˆāļ­ Palette āļ­āļĒāļđāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļˆāļ­āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ„āļĨāļīāļāļ—āļĩāđˆ HTML 4.0 āļˆāļ°āļĄāļĩ Icons āđƒāļŦāđ‰
                    āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° Drag & Drop āļ‚āļķāđ‰āļ™āđ„āļ›āļ§āļēāļ‡āļ”āđ‰āļēāļ™āļšāļ™āļŠāļļāļ” (āļĨāļģāļ”āļąāļšāļ—āļĩāđˆ3 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.14)
                    āđāļĨāļ°āļ›āļĢāļąāļšāļ„āđˆāļē Attribute āļ‚āļ­āļ‡ Object āļ™āļąāđ‰āļ™āđ† āđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ Tab Properties (Tab āļ­āļĒāļđāđˆāļ–āļąāļ”āđ„āļ›āļ—āļēāļ‡āļ‚āļ§āļē)




                                   āļĢāļđāļ›āļ—āļĩāđˆ 1.14 āļāļēāļĢ Drag and Drop Forms Icon āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design

Thanachart Numnonda and Thanisa Kruawaisayawan
13


1.4    āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ (Deploy) Web Project āļšāļ™ Tomcat WebServer
           āđ‚āļ”āļĒāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđāļ—āļ› Server āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Tomcat Server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Add and Remove āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.15




                             āļĢāļđāļ›āļ—āļĩāđˆ 1.15 āļāļēāļĢ Drag and Drop Forms Icon āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design

           āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ WebApp āđāļĨāđ‰āļ§ āļāļ”āļ›āļļāđˆāļĄ Add āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆ Web   Server āđāļĨāļ°āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.16




                               āļĢāļđāļ›āļ—āļĩāđˆ 1.16 āļāļēāļĢ Deploy Project āļŠāļđāđˆ Web Application Server

      2. Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebApp        āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ addCustomer.html → Run As → Run on Server āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.17




                                        āļĢāļđāļ›āļ—āļĩāđˆ 1.17 āļāļēāļĢāļĢāļąāļ™ File āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ Test
                                                                                           āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
14


     3.   āļˆāļ°āļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āļĢāļąāļ™ file āļ™āļĩāđ‰āļ—āļĩāđˆ Server āđ„āļŦāļ™ (āļāļĢāļ“āļĩāđ€āļĢāļēāļ™āļĩāđ‰āļĄāļĩ Server āđ€āļ”āļĩāļĒāļ§) āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.18




                                  āļĢāļđāļ›āļ—āļĩāđˆ 1.18 āļāļēāļĢāđ€āļĨāļ·āļ­āļ Web Application Server āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļĢāļąāļ™

     4.   āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.19




                              āļĢāļđāļ›āļ—āļĩāđˆ 1.19 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļĢāļąāļ™ File addCustomer.html
āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ āļŠāļąāļ‡āđ€āļāļ•āļ—āļĩāđˆāļ—āđ‰āļēāļĒ hostname āļˆāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• āļ‹āļķāđˆāļ‡āļāđ‡āļ„āļ·āļ­ port āļ—āļĩāđˆ Tomcat Server āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ­āļĒāļđāđˆ
         āđ‚āļ”āļĒ Default āļˆāļ°āđ€āļ›āđ‡āļ™ 8080 āļĒāļāđ€āļ§āđ‰āļ™āļ§āđˆāļēāļˆāļ°āļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļ·āđˆāļ™




Thanachart Numnonda and Thanisa Kruawaisayawan
15


            Exercise 2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML
        āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™
āđ€āļ‚āđ‰āļēāļĄāļēāļ­āļ­āļāļ—āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāļ­āļ­āļāļ­āļ­āļāļ—āļēāļ‡ Web Browser
2.1     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java
      āđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ addCustomer.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add
āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ™āļģāļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ addCustomer.html
      2.   āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†
2.1.1      āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addCustomer.html
           āđ€āļ§āđ‡āļšāđ€āļžāļˆ addCustomer.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰
                ● id āļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļĨāļđāļāļ„āđ‰āļē

                ● name āļŠāļ·āđˆāļ­āļĨāļđāļāļ„āđ‰āļē

                ● addr āļ—āļĩāđˆāļ­āļĒāļđāđˆāļĨāļđāļāļ„āđ‰āļē

                ● mobile āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­

                ● fax āļŦāļĄāļēāļĒāđ€āļĨāļ‚ fax

                ● email āļ‚āļ­āļ‡āļĨāļđāļāļ„āđ‰āļē


         āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ Http āđāļĨāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļē-āļĄāļīāđ€āļ•āļ­āļĢāđŒ
āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ”āđ‰āļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” getParameter( ) āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰
                  String    id = request.getParameter("id");
                  String    name = request.getParameter("name");
                  String    addr = request.getParameter("addr");
                  String    mobile = request.getParameter("mobile");
                  String    fax = request.getParameter("fax");
                  String    email = request.getParameter("email");




                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
16


2.1.2    āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†
     āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļœāļĨāļ­āļ­āļāļ—āļēāļ‡ Web Browser āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ” HTML
     āļ āļēāļĒāđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡ out.println( ) āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āđ€āļĄāļ˜āļ­āļ” processRequest( ) āļ”āļąāļ‡āļ™āļĩāđ‰
         protected void processRequest(HttpServletRequest request,
         HttpServletResponse response) throws IOException
         {

                   PrintWriter out = response.getWriter();

                   response.setContentType("text/html;charset=UTF-8");

                   out.println("<html>");
                   out.println("<head>");
                   out.println("<title>Customer Information</title>");
                   out.println("</head>");
                   out.println("<body>");

                   String    id = request.getParameter("id");
                   String    name = request.getParameter("name");
                   String    addr = request.getParameter("addr");
                   String    mobile = request.getParameter("mobile");
                   String    fax = request.getParameter("fax");
                   String    email = request.getParameter("email");

                   out.println("<h1> Customer Information </h1>");
                   out.println("<b>ID: </b>" + id + "<BR>");
                   out.println("<b>Name: </b>" + name + "<BR>");
                   out.println("<b>Address: </b>" + addr + "<BR>");
                   out.println("<b>Mobile: </b>" + mobile + "<BR>");
                   out.println("<b>Fax: </b>" + fax + "<BR>");
                   out.println("<b>E-mail: </b>" + email + "<BR>");

                   out.println("</body>");
                   out.println("</html>");

                   out.close();
         }




Thanachart Numnonda and Thanisa Kruawaisayawan
17


2.2    āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java
           āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebApp → New → Servlet āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.1




                                          āļĢāļđāļ›āļ—āļĩāđˆ 2.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— Servlet
      2.   āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Class Name āđ€āļ›āđ‡āļ™ CustomerServlet āđāļĨāļ° Package āđ€āļ›āđ‡āļ™ servlet āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āđāļĨāđ‰āļ§āļāļ” Next




                             āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Package āđāļĨāļ° āļŠāļ·āđˆāļ­ File Servlet
                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
18


     3.    āļāļģāļŦāļ™āļ”āļ„āđˆāļē URL Pattern(āļŦāļĢāļ·āļ­ URL Mappings) āđ€āļ›āđ‡āļ™ /addCustomer.do
          āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāđ€āļĨāļ·āļ­āļāļŠāļ·āđˆāļ­ CustomerServlet āđāļĨāđ‰āļ§ āļāļ”āļ›āļļāđˆāļĄ Edit
          āđāļĨāđ‰āļ§āđ€āļ›āļĨāļĩāđˆāļĒāļ™ URL Mapping āđ€āļ›āđ‡āļ™ addCustomer.do āđāļĨāļ°āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.3




                                            āļĢāļđāļ›āļ—āļĩāđˆ 2.3 āļāļēāļĢāļāļģāļŦāļ™āļ” URL Pattern
     4.   āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļžāļīāđˆāļĄāđ€āļĄāļ˜āļ­āļ”āļ—āļĩāđˆāđ„āļŸāļĨāđŒ CustomerServlet.java
          āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļš action āļ—āļĩāđˆSubmit āļĄāļēāļˆāļēāļ Http-Request (HTML Form) āļ—āļąāđ‰āļ‡āļŠāļ™āļīāļ” POST āđāļĨāļ° GET
          āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđ€āļĄāļ˜āļ­āļ”āļ§āđˆāļē processRequest( ) āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ āļŦāļąāļ§āļ‚āđ‰āļ­ 2.1.2
          protected void processRequest(HttpServletRequest
          request,HttpServletResponse response)
          throws IOException {

                   // āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ āļŦāļąāļ§āļ‚āđ‰āļ­ 2.1.2
          }




Thanachart Numnonda and Thanisa Kruawaisayawan
19


      5.   āđ€āļ‚āļĩāļĒāļ™ source Code āđ€āļžāļīāđˆāļĄāđƒāļ™āđ€āļĄāļ˜āļ­āļ” doGet(),doPost()
           āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­ Http-Request āđ„āļ›āļĒāļąāļ‡āđ€āļĄāļ˜āļ­āļ” processRequest() āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ code āļ”āļąāļ‡āļ™āļĩāđ‰
           protected void doGet(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
                       processRequest(request, response); //āđ€āļžāļīāđˆāļĄ Code āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļ™āļĩāđˆ
                 }

                   protected void doPost(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException {
                         processRequest(request, response); //āđ€āļžāļīāđˆāļĄ Code āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļ™āļĩāđˆ
           }


2.3    āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1. Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebApp      āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ addCustomer.html
           āđ€āļĨāļ·āļ­āļ Run As → Run on Server → āļāļ”āļ›āļļāđˆāļĄ Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.4




                                      āļĢāļđāļ›āļ—āļĩāđˆ 2.4 āļāļēāļĢāļĢāļąāļ™āļ—āļ”āļŠāļ­āļš addCustomer Servlet



                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
20


     2.   āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.5




                                 āļĢāļđāļ›āļ—āļĩāđˆ 2.5 āļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļ”āļŠāļ­āļš Servlet āļœāđˆāļēāļ™āļŦāļ™āđ‰āļē addCustomer.html

     3.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.6




                                āļĢāļđāļ›āļ—āļĩāđˆ 2.6 āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet




Thanachart Numnonda and Thanisa Kruawaisayawan
21


                          Exercise 3 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāđ‚āļžāļĨ
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
       āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ—āļģ Poll āđ‚āļ”āļĒāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ‚āļŦāļ§āļ•āđ€āļĨāļ·āļ­āļāļ āļēāļĐāļē
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ­āļšāđ„āļ”āđ‰ āđāļĨāđ‰āļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•āļ—āļēāļ‡ Web Browser
3.1   āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html
        āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ—āļĩāđˆāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļ§āļ•āđ€āļĨāļ·āļ­āļāļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰
āļāļ”āļ›āļļāđˆāļĄ Vote āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļāđ‡āļˆāļ°āđ„āļ›āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ processVote āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļĄāļĩāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.1




                                āļĢāļđāļ›āļ—āļĩāđˆ   3.1 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html


3.2   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java
         āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ vote.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Vote āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģ
āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āļ™āļģāļ„āđˆāļēāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ‚āļŦāļ§āļ•āļĄāļēāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„āļ·āļ­
    1. āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang
    2. āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
    3. āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•




                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
22


3.2.1    āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang
        āļ•āļąāļ§āđāļ›āļĢ count āđ€āļ›āđ‡āļ™āļ­āļ°āđ€āļĢāļĒāđŒāđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļˆāļģāļ™āļ§āļ™āļœāļĨāđ‚āļŦāļ§āļ•āļ‚āļ­āļ‡āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļĨāļ°āļ āļēāļĐāļē āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢ lang
āđ€āļ›āđ‡āļ™āļ­āļ°āđ€āļĢāļĒāđŒāļ‚āļ­āļ‡ String āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļŠāļ·āđˆāļ­āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ•āļąāļ§āđāļ›āļĢāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļˆāļ°āļ›āļĢāļ°āļāļēāļĻ
āļ™āļ­āļāđ€āļĄāļ˜āļ­āļ” (Instance Variable) āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ›āļĢāļ°āļāļēāļĻāļ”āļąāļ‡āļ™āļĩāđ‰
                   String []lang ={"Java", "C#", "C", "Pascal"};
                   int []count = new int[4];



3.2.2    āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
          āđ€āļ§āđ‡āļšāđ€āļžāļˆ vote.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļāļēāļĢāđ‚āļŦāļ§āļ• āđ„āļ›āļāļąāļšāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ lang āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨ 1-4
āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ request.getParameter āđ€āļžāļ·āđˆāļ­āļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāđ‚āļŦāļ§āļ•āļĄāļē āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āļ„āđˆāļēāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ String āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āđˆāļē
āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ Wrapper class āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļˆāļģāļ™āļ§āļ™āđ‚āļŦāļ§āļ•āđƒāļ™āļ•āļąāļ§āđāļ›āļĢ count āļ•āļēāļĄāļ„āđˆāļē index āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš
āļ āļēāļĐāļēāļ—āļĩāđˆāđ‚āļŦāļ§āļ•āļĄāļē āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰
                      String vote = request.getParameter("lang");
                      int voteNum = Integer.parseInt(vote) – 1;
                      count[voteNum]++;


3.2.3    āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•
         āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ count āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
                    for (int i = 0; i < count.length; i++) {
                      out.println(lang[i] +" = " + count[i] + "<BR>");
                    }




Thanachart Numnonda and Thanisa Kruawaisayawan
23

3.3     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter
           āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļ—āļĩāđˆāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1. āļŠāļĢāđ‰āļēāļ‡ New Project āļŠāļ™āļīāļ” Dynamic Web Application āļŠāļ·āđˆāļ­ Voter āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.2




                                  āļĢāļđāļ›āļ—āļĩāđˆ 3.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļŠāļ·āđˆāļ­ Voter


                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
24

     2.   āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML āļŠāļ·āđˆāļ­ vote āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.3




                                          āļĢāļđāļ›āļ—āļĩāđˆ 3.3 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ HTML Page āļŠāļ·āđˆāļ­ vote.html

     3.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ vote.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.1
          Listing āļ—āļĩāđˆ 3.1 āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html

          <html>
          <head><title>Web Voting</title></head>
          <body>
            <form action="processVote" method="POST">
              Select a computer language <BR>
              <input type="radio" name="lang" value="1"                    />     Java <br>
              <input type="radio" name="lang" value="2"                    />     C# <br>
              <input type="radio" name="lang" value="3"                    />     C <br>
              <input type="radio" name="lang" value="4"                    />     Pascal <br>
              <input type="submit" value="Vote" />
            </form>
          </body>
          </html>



Thanachart Numnonda and Thanisa Kruawaisayawan
25

4.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects Explorer āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” Voter āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New > Servlet
     āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ controller āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ VoteServlet āđāļĨāđ‰āļ§āļāļ” Next
     āļāļģāļŦāļ™āļ” URL Mapping āđ€āļ›āđ‡āļ™ /processVote āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.4




          āļĢāļđāļ›āļ—āļĩāđˆ 3.4 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Java Servlet āļŠāļ·āđˆāļ­ VoteServlet.java āđāļĨāļ°āļāļģāļŦāļ™āļ” URL Pattern (URL Mapping)



                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
26

          āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ VoteServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.2
          Listing āļ—āļĩāđˆ 3.2 āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java

     package controller;

     import java.io.IOException;
     import java.io.PrintWriter;

     import   javax.servlet.ServletException;
     import   javax.servlet.http.HttpServlet;
     import   javax.servlet.http.HttpServletRequest;
     import   javax.servlet.http.HttpServletResponse;


     @WebServlet("/processVote")
     public class VoteServlet extends HttpServlet {

          private static final long serialVersionUID = 1L;
          String []lang ={"Java", "C#", "C", "Pascal"};
          int []count = new int[4];

      protected void processRequest(HttpServletRequest request,HttpServletResponse response)
      throws ServletException, IOException {

       PrintWriter out = response.getWriter();
       response.setContentType("text/html;charset=UTF-8");

       String vote = request.getParameter("lang");
       int voteNum = Integer.parseInt(vote) - 1;
       count[voteNum]++;
       out.println("<html>");
       out.println("<head>");
       out.println("<title>Servlet VoteServlet</title>");
       out.println("</head>");
       out.println("<body>");
       out.println("<h1>Servlet VoteServlet at " +request.getContextPath() + "</h1>");
          for (int i = 0; i < count.length; i++) {
              out.println(lang[i] +" = " + count[i] + "<BR>");
          }

           out.println("</body>");
           out.println("</html>");

           out.close();
      }

      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
          processRequest(request, response);
      }

      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
          processRequest(request, response);
      }
}




Thanachart Numnonda and Thanisa Kruawaisayawan
27


5.   āļ—āļģāļāļēāļĢ Deploy Web Project āļ—āļĩāđˆ Apache Tomcat
     āđ„āļ›āļ—āļĩāđˆ Tab Server āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ„āļĨāļīāđŠāļāļ‚āļ§āļē āļ—āļĩāđˆ Tomcat Server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Add and Remove āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.5




                  āļĢāļđāļ›āļ—āļĩāđˆ 3.5 āļāļēāļĢ Deploy Project āđ„āļ›āļ—āļĩāđˆ Apache Tomcat āđāļšāļš Manual

6.   āļāļ” Save āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆ
     http://localhost:8080/Voter/vote.html āđ‚āļ”āļĒāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 3.6




                               āļĢāļđāļ›āļ—āļĩāđˆ 3.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter
                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
28


3.4     āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java
         āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļŦāļ§āļ•āļ‹āđ‰āļģāļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļˆāļ°āđ„āļĄāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰ āļœāļđāđ‰āđƒāļŠāđ‰
āļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļŦāļ§āļ•āļ‹āđ‰āļģāđ„āļ”āđ‰ āđ‚āļ”āļĒāļˆāļ°āđ€āļāđ‡āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ‚āļŦāļ§āļ•āđāļĨāđ‰āļ§āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HashSet āļāļēāļĢ
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰
      1. āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters
      2. āļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđ‚āļŦāļ§āļ•āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļ„āļ°āđāļ™āļ™āļāļēāļĢāđ‚āļŦāļ§āļ• āļŦāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āđ„āļĄāđˆāđ€āļ„āļĒāđ‚āļŦāļ§āļ•


3.4.1    āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters
        āļ•āļąāļ§āđāļ›āļĢ voters āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ™āļīāļ” HashSet ( Set āđ„āļĄāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‹āđ‰āļģ āđ„āļĄāđˆāļˆāļģāļĨāļģāļ”āļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ§āđˆāļēāđ€āļ‚āđ‰āļēāļāđˆāļ­āļ™āļŦāļĢāļ·āļ­āļŦāļĨāļąāļ‡
āđāļĨāļ°āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļĨāļģāļ”āļąāļš) āđ€āļāđ‡āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđ‚āļŦāļ§āļ• āđ‚āļ”āļĒāļˆāļ°āļ›āļĢāļ°āļāļēāļĻāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢ āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ›āļĢāļ°āļāļēāļĻāļ”āļąāļ‡āļ™āļĩāđ‰
                HashSet voters = new HashSet();

3.4.2    āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰
        āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļ„āļģāļŠāļąāđˆāļ‡ getRemoteAddr() āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ€āļĄāļ·āđˆāļ­āļ—āļĢāļēāļš
āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āļ§āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ™āļĩāđ‰āđ€āļ„āļĒāđ‚āļŦāļ§āļ•āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āđ‚āļ”āļĒāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ voters
āļĄāļĩāļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ contain() āļŦāļēāļāļĒāļąāļ‡āđ„āļĄāđˆāđ€āļ„āļĒāđ‚āļŦāļ§āļ•āļāđ‡āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļ„āđˆāļēāļ•āļąāļ§āļ™āļąāļšāđāļĨāļ°āđ€āļžāļīāđˆāļĄāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āđƒāļ™
āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ voters āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
         String ip = request.getRemoteAddr();
         if(voter.contains(request.getRemoteAddr())){
            out.print("This IP Address has been voted");
         } else {
            count[voteNum]++;
            voter.add(request.getRemoteAddr());
         }




Thanachart Numnonda and Thanisa Kruawaisayawan
29

āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāļĄāđˆāļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.3 āđƒāļŦāđ‰āļĨāļ­āļ‡āļ—āļ”āļĨāļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ•āļēāļĄāļ™āļĩāđ‰ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆ
Listing āļ—āļĩāđˆ 3.3 āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļŦāļ§āļ•āļ‹āđ‰āļģ
package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;

import   javax.servlet.ServletException;
import   javax.servlet.http.HttpServlet;
import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

@WebServlet("/processVote")
public class VoteServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;

         HashSet<String> voter = new HashSet<String>();
         String[] lang = { "Java", "C#", "C", "Pascal" };
         int[] count = new int[4];

         protected void processRequest(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {

               PrintWriter out = response.getWriter();
               response.setContentType("text/html;charset=UTF-8");

               String vote = request.getParameter("lang");
               int voteNum = Integer.parseInt(vote) - 1;

               if (voter.contains(request.getRemoteAddr())) {
                      out.print("<font color=red>This IP Address has been voted</font>");
               } else {
                      voter.add(request.getRemoteAddr());
                      count[voteNum]++;
               }
               out.println("<html>");
               out.println("<head>");
               out.println("<title>Servlet VoteServlet</title>");
               out.println("</head>");
               out.println("<body>");
               out.println("<h1>Servlet VoteServlet at " + request.getContextPath()
                             + "</h1>");
               for (int i = 0; i < count.length; i++) {
                      out.println(lang[i] + " = " + count[i] + "<BR>");
               }
               out.println("</body>");
               out.println("</html>");
               out.close();
         }
         protected void doGet(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
                processRequest(request, response);
         }
         protected void doPost(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
                processRequest(request, response);
         }

         public String getServletInfo() {
                return "Short description";
         }
}



                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
30


                       Exercise 4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MySQL Database
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ -
        āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™ Database Tool āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Table test āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL
āļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™ āđ€āļŠāđˆāļ™āļ›āļāļ•āļīāļ–āđ‰āļēāļˆāļ° create table āļāđ‡āļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ SQL āđāļ•āđˆ Tool āļ™āļĩāđ‰āļĄāļĩ GUI āļĄāļēāļŠāđˆāļ§āļĒ
āļ—āļģāđƒāļŦāđ‰āļĨāļ”āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” āđāļĨāļ° āļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļāļēāļĢāļ—āļģāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ download āđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL āđāļĨāļ° MySQL Workbench āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ download āđ„āļ”āđ‰āļˆāļēāļāđ€āļ§āđ‡āļš http://dev.mysql.com/
4.1    āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ MySQL āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench

           āđƒāļŦāđ‰āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰




                                 āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Program MySQL Workbench
      1.   āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Connection Name āđƒāļŠāđˆ Password āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™āļ•āļ­āļ™āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™
           root āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.2




                      āļĢāļđāļ›āļ—āļĩāđˆ 4.2 āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ Connection āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢ Database




Thanachart Numnonda and Thanisa Kruawaisayawan
31

4.2    āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ books
     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ”āļĒāđƒāļŦāđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ Schema āļ—āļĩāđˆāļŠāļ·āđˆāļ­ test āđ‚āļ”āļĒ Table āļ™āļĩāđ‰āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩ
Column āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1

āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1 Table books

 āļŠāļ·āđˆāļ­ Column             āļŠāļ™āļīāļ”              āļ‚āļ™āļēāļ”          Primary Key        Index
       isbn            varchar              20                Y                Y
       title           varchar              70                 -               -
      author           varchar              50                 -               -
      price              float               -                 -               -


           āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL WorkBench āđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡ Table āļ™āļĩāđ‰āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ icon āļŠāļ·āđˆāļ­ Add Table... āđāļĨāđ‰āļ§āđƒāļŠāđˆāļŠāļ·āđˆāļ­ table āđāļĨāļ° āļŠāļ·āđˆāļ­ field āļ•āļēāļĄāļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Apply




                                                  āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡

                                                                                              āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
32

     2.   āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL Statement āļāđ‡āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ™āļģāđ„āļ›āđƒāļŠāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Query1 āđāļĨāđ‰āļ§ āļāļ” icon āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™
          CREATE TABLE BOOKS (
          ISBN VARCHAR(20) NOT NULL ,
          TITLE VARCHAR(70) NULL ,
          AUTHOR VARCHAR(50) NULL ,
          PRICE FLOAT NULL ,
          PRIMARY KEY (ISBN) );


     3.   āđ€āļ›āļīāļ” Tables books āļˆāļ°āđ€āļŦāđ‡āļ™ Column āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.4




                                            āļĢāļđāļ›āļ—āļĩāđˆ 4.4 āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡




Thanachart Numnonda and Thanisa Kruawaisayawan
33


4.3    āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđƒāļ™ MySQL WorkBench
          āļ āļēāļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Table books āļ”āđ‰āļēāļ™āļ‚āļ§āļē āļˆāļ°āđ„āļ”āđ‰ SQL Editor āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ€āļ›āđ‡āļ™
           INSERT INTO books VALUES ('123', 'JAVA', 'Numnonda', 2500.00);
           INSERT INTO books VALUES ('456', 'SOA', 'Numnonda', 3000.00) ;


           āđāļĨāđ‰āļ§ āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ icon āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āļŦāļĢāļ·āļ­āļāļ” Ctrl+Shift+Enter āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ SQL āļ—āļąāđ‰āļ‡āļŦāļĄāļ”




                                        āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āļāļēāļĢ Execute āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ•āļēāļĢāļēāļ‡




                                                                                          āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
34

     2.   āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰
          āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ€āđāļĨāđ‰āļ§āļĨāļ·āļ­āļ Select Rows – Limit1000 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.6




                                           āļĢāļđāļ›āļ—āļĩāđˆ 4.6 āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Table āļŠāļ·āđˆāļ­ books




Thanachart Numnonda and Thanisa Kruawaisayawan
35


                 Exercise 5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Tool āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MySQL Database
          āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāđƒāļŠāđ‰ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđƒāļŠāđ‰āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL āļ‹āļķāđˆāļ‡āļĄāļĩ Database āļŠāļ·āđˆāļ­ test āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ„āļ§āđ‰āđāļĨāđ‰āļ§āļˆāļēāļ āļ—āļĩāđˆ Exercise 4 (āļŦāļ™āđ‰āļē 34)
          āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ
āļœāđˆāļēāļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāļŠāļ·āđˆāļ­ addBook.html āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ„āļ›āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­
AddBookServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļ­āđˆāļēāļ™āļ„āđˆāļē parameter āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļēāđāļĨāļ°āļ—āļģāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table books āļ‹āļķāđˆāļ‡
āđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ SQL āļœāđˆāļēāļ™ JDBC API
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
      1. Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver
      2.   āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB
      3.   āļžāļąāļ’āļ™āļē Web page addBook.html
      4.   āļžāļąāļ’āļ™āļē Web page Thankyou.html
      5.   āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java
5.1   āļāļēāļĢ Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver
          āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Driver āļ—āļĩāđˆāļŠāļ·āđˆāļ­ MySQL Connector/J āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ JDBC Driver āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MySQL
File āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āļ„āļ·āļ­ mysql-connector-java-5.1.15-bin.jar āđ‚āļ”āļĒāđƒāļŦāđ‰ Copy āđ„āļ›āļ§āļēāļ‡āļ—āļĩāđˆ directory /lib āļ‚āļ­āļ‡ Apache Tomcat
Default āļ­āļĒāļđāđˆāļ—āļĩāđˆ C:Program FilesApache Software FoundationTomcat 6.0lib āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.1




                 āļĢāļđāļ›āļ—āļĩāđˆ   5.1 āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡ File JDBC Driver āđƒāļ™ Folder lib āļ‚āļ­āļ‡ Apache Tomcat


           āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ– Download MySQL Connector/J āđ„āļ”āđ‰āļ—āļĩāđˆ
http://mysql.cs.pu.edu.tw/Downloads/Connector-J/mysql-connector-java-5.1.15.zip




                                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
36

5.2    āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project
           āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New Project     →Dynamic Web
           Application
           āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Project Name āđ€āļ›āđ‡āļ™ WebBaseDB (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Dynamic Web Application āļŦāļ™āđ‰āļē 23)
           āđāļĨāđ‰āļ§āļāļ” Finish
5.3    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html
         āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
books āļ‹āļķāđˆāļ‡āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.2 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html




                                         āļĢāļđāļ›āļ—āļĩāđˆ   5.2 āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆ addBook.html


           āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → HTML File (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļŦāļ™āđ‰āļē 24)
           āļāļģāļŦāļ™āļ” File Name: āđ€āļ›āđ‡āļ™ addBook āđāļĨāđ‰āļ§āļāļ” Finish
      2.   āđ€āļ‚āļĩāļĒāļ™ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ addBook.html āļ•āļēāļĄ Listing āļ—āļĩāđˆ 5.1
           āļŦāļĢāļ·āļ­ āļĨāļēāļ icon āļ›āļĢāļ°āđ€āļ āļ— HTML Forms āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Palette āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™
           (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļŦāļ™āđ‰āļē 9 āđ‚āļ”āļĒāļ—āļģāļ•āļēāļĄ āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 2) āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.3




Thanachart Numnonda and Thanisa Kruawaisayawan
37




                        āļĢāļđāļ›āļ—āļĩāđˆ 5.3 āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Palette āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ HTML

Listing āļ—āļĩāđˆ 5.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html

<html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Add a new book</title>
      </head>
   <body><h1>Add a new book</h1><P>
    <form action="addBook.do" method="POST">
       ISBN : <input type="text" name="isbn" value="" size="15"/> <BR>
       Title : <input type="text" name="title" value="" size="50"/> <BR>
      Author : <input type="text" name="author" value="" size="50"/> <BR>
      Price : <input type="text" name="price" value="" size="10"/> <BR>
      <input type="submit" value="Add" />
    </form>
   </body>
</html>


5.4   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html
        āđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ–āļđāļāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļĄāļĩ
source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 5.2 āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
addBook.html




                                                                                  āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
38

Listing āļ—āļĩāđˆ 5.2 āđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html



5.5     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java
      āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ addBook.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add
āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
   1. āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ addBook.html
   2. āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.4




                                      āļĢāļđāļ›āļ—āļĩāđˆ 5.4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡ Servlet āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ

      3.   āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books
      4.   āđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ Thankyou.html
5.5.1      āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addBook.html
           āđ€āļ§āđ‡āļšāđ€āļžāļˆ addBook.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰
                ● isbn āļŦāļĄāļēāļĒāđ€āļĨāļ‚ ISBN āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­

                ● title āļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­

                ● author āļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡

                ● price āļĢāļēāļ„āļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­


         āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ Http āđāļĨāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ”āđ‰āļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” getParameter() āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰
                   String     isbn = request.getParameter("isbn");
                   String     author = request.getParameter("author");
                   String     title = request.getParameter("title");
                   String     priceStr = request.getParameter("price");




5.5.2      āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
               ●   āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” Data source āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Container āļ‚āļ­āļ‡ Tomcat
               ●   āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” executeQuery() āļŦāļĢāļ·āļ­ executeUpdate()

Thanachart Numnonda and Thanisa Kruawaisayawan
39

        1.     āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” DataSource āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Tomcat
        āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡ file context.xml āļ—āļĩāđˆ Folder WebBaseDBWebContentMETA-INF āđ‚āļ”āļĒāđ€āļĢāļēāļĄāļēāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ
Folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebContent > META-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ New > Others > XML File āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™
context.xml āđāļĨāđ‰āļ§āđ€āļ‚āļĩāļĒāļ™ sourcecode āļ”āļąāļ‡āļ™āļĩāđ‰

        <?xml version="1.0" encoding="UTF-8"?>
        <Context>
        <Resource
               name="jdbc/test"
               auth="Container"
               driverClassName="com.mysql.jdbc.Driver"
               type="javax.sql.DataSource"
               url="jdbc:mysql://localhost:3306/test"
               username="root"
               password="root" >
        </Resource>
        </Context>


        2.   āļāļēāļĢāļ‚āļ­ Data source āļˆāļ°āđƒāļŠāđ‰ @annotation āđāļĨāļ°āļšāļ­āļāļŠāļ·āđˆāļ­āļ‚āļ­āļ‡ Data source āļ•āļąāļ§āļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ
             āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ source code āđ€āļŠāđˆāļ™
                 @Resource(name = "jdbc/test")
                 private DataSource jdbcTest;


        āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰ Data source āđāļĨāđ‰āļ§ āđ€āļĢāļēāļāđ‡āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļ—āļēāļ‡āļ•āļīāļ”āļ•āđˆāļ­ āđ‚āļ”āļĒ getConnection āļˆāļēāļāļĄāļąāļ™āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ„āđˆāļēāđ„āļ§āđ‰āļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ conn
        āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ source code āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļ—āļĩāđˆ method init( )
                 private Connection conn;

                 public void init() {
                        try {
                               conn = jdbcTest.getConnection();
                        } catch (Exception ex) {System.out.println(ex);}
                  }


5.5.3   āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
        āđ€āļĄāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ„āļ”āđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” Connection āļĄāļēāđāļĨāđ‰āļ§ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡
        āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡ INSERT āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
        INSERT INTO books VALUES(....)

        āđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āļ„āđˆāļēāļˆāļēāļāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļĢāļąāļšāļĄāļē āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļēāļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­
āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
        Statement stmt = conn.createStatement();
        String sql = "INSERT INTO books VALUES('"
                     + isbn + "','" + title +"','"
                     + author +"',"+ price +")";
        int numRow = stmt.executeUpdate(sql);


5.5.4   āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ thankyou.html
        āđ€āļĄāļ·āđˆāļ­āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ–āļđāļāđ€āļžāļīāđˆāļĄāļĨāļ‡āđ„āļ›āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāđ‰āļ§ āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ
        thankyou.html āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ RequestDispatcher āļ”āļąāļ‡āļ™āļĩāđ‰


                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
40


           RequestDispatcher obj = request.getRequestDispatcher("thankyou.html");
            if (numRow == 1 && obj != null) {
                  obj.forward(request,response);
            }


5.6    āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java
           āđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
           āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ AddBookServlet āđāļĨāļ°
           URL Mapping āđ€āļ›āđ‡āļ™ /addBook.do āđāļĨāđ‰āļ§āļāļ” Finish
      2.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AddBookServlet.java
           āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 5.3
           Listing āļ—āļĩāđˆ 5.3 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java

           package controller;

           import   java.io.IOException;
           import   java.io.PrintWriter;
           import   java.sql.Connection;
           import   java.sql.SQLException;
           import   java.sql.Statement;

           import   javax.annotation.Resource;
           import   javax.servlet.RequestDispatcher;
           import   javax.servlet.ServletException;
           import   javax.servlet.http.HttpServlet;
           import   javax.servlet.http.HttpServletRequest;
           import   javax.servlet.http.HttpServletResponse;
           import   javax.sql.DataSource;

           @WebServlet("/addBook.do")
           public class AddBookServlet extends HttpServlet {


              private static final long serialVersionUID = 1L;
              @Resource(name = "jdbc/test")
              private DataSource jdbcTest;
              private Connection conn;

              public void init() {
                  try {
                         conn = jdbcTest.getConnection();
                  } catch (Exception ex) {
                         System.out.println(ex);
                  }
              }

              protected void processRequest(HttpServletRequest request,
                  HttpServletResponse response) throws ServletException, IOException {

                    response.setContentType("text/html;charset=UTF-8");
                    PrintWriter out = response.getWriter();
                    out.println("<html>");
                    out.println("<head>");
                    out.println("<title>Add a new book</title>");
                    out.println("</head>");
                    out.println("<body>");


Thanachart Numnonda and Thanisa Kruawaisayawan
41

                   out.println("<h1> Add a new book </h1>");

                   try {
                            String isbn = request.getParameter("isbn");
                            String author = request.getParameter("author");
                            String title = request.getParameter("title");
                            String priceStr = request.getParameter("price");
                            float price = Float.parseFloat(priceStr);
                            Statement stmt = conn.createStatement();
                            String sql = "INSERT INTO books VALUES('"
                            + isbn + "','" + title
                            + "','" + author + "'," + price + ")";


                            int numRow = stmt.executeUpdate(sql);

                            RequestDispatcher obj =request.getRequestDispatcher("thankyou.html");
                                   if (numRow == 1 && obj != null) {
                                          obj.forward(request, response);
                                   }
                            } catch (SQLException ex) {
                                   out.println("Error " + ex);
                                   return;
                            }
                            out.println("</body>");
                            out.println("</html>");
                            out.close();
                   }

                   protected void doGet(HttpServletRequest request,
                   HttpServletResponse response) throws ServletException, IOException {
                          processRequest(request, response);
                   }

                   protected void doPost(HttpServletRequest request,
                   HttpServletResponse response) throws ServletException, IOException {
                          processRequest(request, response);
                   }
           }


      3.   āļšāļēāļ‡āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļĨāļ·āļĄ import āļŦāļĢāļ·āļ­āļžāļš Error āļŦāļĢāļ·āļ­āļžāļš Warning āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļš import file
           āđ‚āļ”āļĒāļāļ” Ctrl+Shift+O Eclipse āļˆāļ°āļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ° import āđ„āļŸāļĨāđŒāļˆāļēāļāđāļžāđ‡āļ„āđ€āļāđ‡āļˆāđƒāļ” āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.5 āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļāļēāļĢāļ—āļģ
           Organize Imports




                           āļĢāļđāļ›āļ—āļĩāđˆ 5.5 Ctrl+Shift+O āđƒāļŦāđ‰ Eclipse āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡ Import file

5.7    āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB āļ‹āļķāđˆāļ‡āđƒāļ™ Eclipse āļ—āļģāđ‚āļ”āļĒ Click āļ‚āļ§āļēāļ—āļĩāđˆ Add and Remove
      2.   āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđ‰āļē addBook.html āđāļĨāđ‰āļ§āļ—āļ”āļŠāļ­āļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.6

                                                                                      āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
42




                                          āļĢāļđāļ›āļ—āļĩāđˆ 5.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Books

     3.   āđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Database āđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.7




                                       āļĢāļđāļ›āļ—āļĩāđˆ 5.7 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđāļŠāļ”āļ‡āļ—āļēāļ‡ Web Browser
     4.   āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ MySQLWorkbench āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Select Rows -... āļˆāļēāļ          Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books   āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.8




                                          āļĢāļđāļ›āļ—āļĩāđˆ 5.8 āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļē Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books




Thanachart Numnonda and Thanisa Kruawaisayawan
43


               Exercise 6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
       āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāđƒāļŠāđ‰ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆ
āđ€āļ›āđ‡āļ™ NoSQL āļ­āļĒāđˆāļēāļ‡ MongoDB āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Document āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ JSON āđāļĨāļ°āļĄāļĩāļŠāļēāļĄāļēāļĢāļ–
āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ„āļ”āđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
     1. āļ•āļīāļ”āļ•āļąāđ‰āļ‡ MongoDB
     2. āļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰ MongoDB
     3. āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB


6.1       āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡   MongoDB

        āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ—āļąāđ‰āļ‡ Windows, Mac OS
āļŦāļĢāļ·āļ­ Linux āļŠāļģāļŦāļĢāļąāļšāļšāļ™āļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢ Windows āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ Binary āļˆāļēāļāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ
http://www.mongodb.org/downloads āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ unzip āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ„āļ§āđ‰āđƒāļ™
āđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļĢāļđāļ›




                                      āļĢāļđāļ›āļ—āļĩāđˆ 6.1 āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāđˆāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡   MongoDB

            āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļāđ‡āļ„āļ·āļ­
      â€Ē     mongod.exe āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Database Server
      â€Ē     mongo.exe āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āđˆāļēāļˆāļ­āļ‚āļ­āļ‡ admin


            āđ‚āļ”āļĒ Default MongoDB āļˆāļ°āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ§āđ‰āļ—āļĩāđˆāđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆ datadb āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ āļēāļĒāđƒāļ•āđ‰
 Drive C

                                                                                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
44


6.2   āļāļēāļĢāđƒāļŠāđ‰ MongoDB
       āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļĨāļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ MongoDB āđ‚āļ”āļĒāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Mongo.exe āļ‹āļķāđˆāļ‡āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
command shell āļ‚āļ­āļ‡ administrator āđāļĨāļ°āđ‚āļ”āļĒ Default āļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŠāđ‰ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļ·āđˆāļ­ test āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡
āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡
         > db

         āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (database)āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ„āļ·āļ­
         >show dbs

         āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē   mydatabase   āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
         >use mydatabase

         āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡ Tables āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ„āļ·āļ­
         >show collections

         āđāļĨāļ°āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāđˆāļ§āļĒāđ€āļŦāļĨāļ·āļ­āđ‚āļ”āļĒ
         >help

         āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļ—āļģāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āļŠāļ­āļ‡āđ€āļĨāđˆāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
         > db.books.insert({isbn:"555123", author:"thanachart", title:"Introduction to MongoDB", price:1200})

         āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
         > new_book = {isbn:"555124", author:"James Gosling", title: "Java SE", price: 1400}
         > db.books.insert(new_book)

         āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡
         > db.books.find()

         āļ‹āļķāđˆāļ‡āļāđ‡āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ™āļĩāđ‰
{ "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart", "title" :
"Introduction to MongoDB", "price" : 1200 }
{ "_id" : ObjectId("511fb24e7c199204a9f733a6"), "isbn" : "555124", "author" : "James Gosling", "title" : "Java
SE", "price" : 1400 }

      āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰ id āļˆāļ°āđ€āļ›āđ‡āļ™ index āđƒāļ™āļāļēāļĢāļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ™āļ­āļāļˆāļēāļāļ™āļĩāđˆāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļģāļŦāļĢāļąāļšāļĢāļēāļĒ
āļāļēāļĢāđƒāļ”āđ†āđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļēāļĄāļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡
         > db.books.find({author:"thanachart"})

         āļŦāļĢāļ·āļ­āļ­āļēāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĄāļĩāļ„āļģāļ§āđˆāļē   Mongo


Thanachart Numnonda and Thanisa Kruawaisayawan
45


            > db.books.find({title:/Mongo/})

            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° update āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļŠāđˆāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļēāļ„āļēāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāđāļ•āđˆāļ‡āđ‚āļ”āļĒ    thanachart    āđ€āļ›āđ‡āļ™   1300 āđ‚āļ”āļĒ
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
            > db.books.update({author:"thanachart"},{$set: {price:1300}})

       āđ€āļĢāļēāļˆāļ°āļĨāļ­āļ‡āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄ comment āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļŠāđˆāļ™āļĄāļĩāļœāļđāđ‰āļ­āđˆāļēāļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Somchai āļ­āļēāļˆāļĄāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ‚āļ­āļ‡
James Gosling āđ€āļ›āđ‡āļ™ â€œgood reading book” āđ‚āļ”āļĒāđ€āļĢāļēāļ­āļēāļˆāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

            > new_comment = {reader:"Somchai", date: new Date(), text: "good reading book"}
            > db.books.update({author:/James/},{$push: {comment:new_comment}})

            āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļĩāđ‰āđƒāļŦāļĄāđˆāđ€āļ›āđ‡āļ™
{ "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart", "title" :
"Introduction to MongoDB", "price" : 1300 }
{ "_id" : ObjectId("511fb24e7c199204a9f733a6"), "author" : "James Gosling", "comment" : [           {
         "reader" : "Somchai", "date" : ISODate("2013-02-16T16:45:07.309Z"), "text" : "good reading
book" } ], "isbn" : "555124", "price" : 1400, "title" : "Java SE" }




6.3    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB
      āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļ™āļĩāđˆāļˆāļ°āđƒāļŠāđ‰
MongoDB Driver āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĄāļēāđ„āļ”āđ‰āļˆāļēāļ https://github.com/mongodb/mongo-java-driver/downloads

      āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļŠāļēāļ˜āļīāļ•āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ MongoDB āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđƒāļŦāđ‰āļĄāļĩ
āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 5.1 āđāļ•āđˆāđƒāļŦāđ‰āđāļāđ‰ tag action āļ”āļąāļ‡āļ™āļĩāđ‰
            <form action="MongoDBServlet" method="POST">

āđāļĨāļ°āļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ           Servlet āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰


      1.    āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ MongoDBServlet āđāļĨāđ‰āļ§āļāļ” Finish
      2.    copy āđ„āļŸāļĨāđŒ mongo-2.10.1.jar āđ„āļ›āđ„āļ§āđ‰āļ—āļĩāđˆāđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆ āđ‚āļ”āļĒāđƒāļŦāđ‰ Copy āđ„āļ›āļ§āļēāļ‡āļ—āļĩāđˆ directory /lib āļ‚āļ­āļ‡ Apache Tomcat
            āļ‹āļķāđˆāļ‡ Default āļ­āļĒāļđāđˆāļ—āļĩāđˆ C:Program FilesApache Software FoundationTomcat 6.0lib
      3.    āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ MongoDBServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 6.1

Listing āļ—āļĩāđˆ 6.1 āđ‚āļ›āļĢāđāļāļĢāļĄ MongoDBServlet.java

package controller;

import java.io.IOException;


                                                                                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
46

import    java.io.PrintWriter;
import    java.net.UnknownHostException;
import    java.sql.SQLException;
import    java.sql.Statement;

import    javax.servlet.RequestDispatcher;
import    javax.servlet.ServletException;
import    javax.servlet.annotation.WebServlet;
import    javax.servlet.http.HttpServlet;
import    javax.servlet.http.HttpServletRequest;
import    javax.servlet.http.HttpServletResponse;

import    com.mongodb.BasicDBObject;
import    com.mongodb.DB;
import    com.mongodb.DBCollection;
import    com.mongodb.Mongo;

/**
 * Servlet implementation class MongoDBServlet
 */
@WebServlet("/MongoDBServlet")
public class MongoDBServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
       Mongo m = null;

     /**
       * @see HttpServlet#HttpServlet()
       */
     public MongoDBServlet() {
          super();
          // TODO Auto-generated constructor stub
     }

     public void init() {
              try {
                     m = new Mongo( "localhost" );
                     System.out.println("Connected");
              } catch (Exception ex) {
                     System.out.println(ex);
              }
           }

     protected void processRequest(HttpServletRequest request,
              HttpServletResponse response) throws ServletException, IOException {

                   response.setContentType("text/html;charset=UTF-8");
                   PrintWriter out = response.getWriter();
                   out.println("<html>");
                   out.println("<head>");
                   out.println("<title>Add a new book</title>");
                   out.println("</head>");
                   out.println("<body>");
                   out.println("<h1> Add a new book </h1>");

           try {
                            String isbn = request.getParameter("isbn");
                            String author = request.getParameter("author");
                            String title = request.getParameter("title");
                            String priceStr = request.getParameter("price");
                            float price = Float.parseFloat(priceStr);

                            DB db = m.getDB( "test" );
                            BasicDBObject book = new BasicDBObject();
                            book.put("isbn", isbn);
                            book.put("author", author);
                            book.put("title", title);
                            book.put("price", price);
                            DBCollection coll = db.getCollection("books");
                            coll.insert(book);


Thanachart Numnonda and Thanisa Kruawaisayawan
47

                          RequestDispatcher obj =request.getRequestDispatcher("thankyou.html");
                          obj.forward(request, response);

                  } catch (UnknownHostException ex) {
                               out.println("Error " + ex);
                               return;
                  }
                  out.println("</body>");
                  out.println("</html>");
                  out.close();
      }

       protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
              processRequest(request, response);
       }


       protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
              processRequest(request, response);
       }

}



6.4    āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB
      2.   āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđ‰āļē addBook.html āđāļĨāđ‰āļ§āļ—āļ”āļŠāļ­āļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ
      3.   āđ„āļ›āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ admin āļ‚āļ­āļ‡ MongoDB āđāļĨāđ‰āļ§āđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ db.books.find() āļˆāļ°āđ€āļŦāđ‡āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē




                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
48


                     Exercise 7 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
        āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āļ˜āļīāļšāļēāļĒāļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāđ€āļ§āđ‡āļš (Object Scope) āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļŠāļĩāđˆāđāļšāļšāļ„āļ·āļ­ Page, Request, Session āđāļĨāļ° Web (Application) āđ‚āļ”āļĒāļˆāļ°āļ—āļ”āļĨāļ­āļ‡
āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļœāđˆāļēāļ™āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļŠāļ­āļ‡āļŠāļļāļ”
7.1   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request
       āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđƒāļ™āđāļ•āđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĄāļĩāļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ (scope) āļ­āļĒāļđāđˆāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆ
āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āđ† (URL āļ™āļąāđ‰āļ™āđ†) āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ•āļąāļ§āļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļāļēāļĢ
āļˆāļ°āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļŦāļĢāļ·āļ­ JSP āļ­āļ·āđˆāļ™āđ† āđ€āļĢāļĩāļĒāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļ”āđ† āđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ source code āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­
āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ™āļąāđ‰āļ™āđ„āļ›āļĒāļąāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ­āļ·āđˆāļ™āđ† āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āļ­āļĩāļ 3 āđāļšāļšāļ„āļ·āļ­
            ● Request āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet/JSP āļ­āļ·āđˆāļ™

            ● Session āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ Session āļ‚āļ­āļ‡ Web Browser āļ•āļĢāļēāļšāđ€āļ—āđˆāļēāļ—āļĩāđˆāļĒāļąāļ‡āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ

            ● Application āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet/JSP āđƒāļ”āđ†

                āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
        āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļēāļ URL āļŦāļ™āļķāđˆāļ‡āļĄāļēāļĒāļąāļ‡ URL āļ­āļ·āđˆāļ™āļ—āļģāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™
āļ–āļķāļ‡āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ HTML āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđ‚āļ”āļĒ āļ„āļģāļŠāļąāđˆāļ‡
request.getParameter()

         āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āđ€āļĢāļēāļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđ„āļ›āļĒāļąāļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ­āļ·āđˆāļ™āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
setAttribute() āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ String āļŠāļ·āđˆāļ­āļ§āđˆāļē name āđ‚āļ”āļĒāļˆāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ RequestName āđāļĨāļ°āļĄāļĩāļĢāļđāļ›
āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
                   String name = “Numnonda”;
                   request.setAttribute(“RequestName”, name);

       āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰ URL āļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ–āļąāļ”āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ RequestName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ
name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰

                   String name = (String) request.getAttribute(“RequestName”);

āļŠāđˆāļ§āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ° forward āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āđ„āļ› URL āļ­āļ·āđˆāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰
         RequestDispatcher obj = request.getRequestDispatcher("SecondServlet");
         obj.forward(request,response);

         āđ‚āļ”āļĒāļ—āļĩāđˆ SecondServlet āļ„āļ·āļ­āļŠāļ·āđˆāļ­ URL āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ forward
         āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš
request āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ source
code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.1 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāđāļĨāđ‰āļ§āļ™āļģāļĄāļē
āđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.2

Thanachart Numnonda and Thanisa Kruawaisayawan
49

Listing āļ—āļĩāđˆ 7.1 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstServlet.java

package servlet;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class FirstServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
       throws ServletException, IOException {

          PrintWriter out = response.getWriter();
          response.setContentType("text/html;charset=UTF-8");

          try {
             String name = "Numnonda";
             request.setAttribute("RequestName", name);
             RequestDispatcher obj = request.getRequestDispatcher("SecondServlet");
             obj.forward(request, response);
          } finally {
              out.close();
          }
     }

     protected void doGet(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
         processRequest(request, response);
     }

     protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
         processRequest(request, response);
     }

     public String getServletInfo() {
         return "Short description";
     }
}


Listing āļ—āļĩāđˆ 7.2 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondServlet.java

package servlet;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SecondServlet extends HttpServlet {

     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {

          PrintWriter out = response.getWriter();
          response.setContentType("text/html;charset=UTF-8");

          try {
             String name = (String) request.getAttribute("RequestName");
             out.println(name);
          } finally {
              out.close();


                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
50

              }
        }

        protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            processRequest(request, response);
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            processRequest(request, response);
        }

        public String getServletInfo() {
            return "Short description";
        }
}


7.1.1       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request
            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
     1.     āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Application
            āļāļģāļŦāļ™āļ”āļ„āđˆāļē Project Name āđ€āļ›āđ‡āļ™ ScopeDemo
     2.     āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo → New → Servlet
            āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish
            āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 7.1 āđāļĨāđ‰āļ§ Save
     3.     āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
            āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish
     4.     āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 7.2 āđāļĨāđ‰āļ§ Save
7.1.2       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request
            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
     1.     āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Apache Tomcat āđāļĨāđ‰āļ§ Add and Remove Project āđ€āļ‚āđ‰āļēāđ„āļ›
            āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 7.1




Thanachart Numnonda and Thanisa Kruawaisayawan
51




                       āļĢāļđāļ›āļ—āļĩāđˆ 7.1 āļāļēāļĢ Add Project āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Apache Tomcat āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļāļēāļĢ Deploy

      2.   āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo
      3.   āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstServlet āļŠāļąāļ‡āđ€āļāļ•āļļāļœāļĨāļĨāļąāļžāļ˜āđŒ
      4.   āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondServlet āđ‚āļ”āļĒāļ•āļĢāļ‡ āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
           āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē āļ„āđˆāļēāļ—āļĩāđˆāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™ null āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡ request āļĄāļēāļˆāļēāļ FirstServlet
7.2    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session
         āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđāļšāļš Request āļˆāļ°āļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ•āļēāļĄ request āļ‚āļ­āļ‡ URL āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ„āļĄāđˆ
āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļ URL āļ™āļąāđ‰āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļŠāđˆāļ‡ request āļĄāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°
āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āđƒāļ™ session āļ‚āļ­āļ‡ Web Browser āđ„āļ”āđ‰ (āļ•āļĢāļēāļšāđ€āļ—āđˆāļēāļ—āļĩāđˆ Browser āļĒāļąāļ‡
āđƒāļŠāđ‰ session āļ™āļąāđ‰āļ™āļ­āļĒāļđ) āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ” Attribute āļĨāļ‡āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ
                   āđˆ
session āļ‚āļ­āļ‡ Web Browser āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āđ€āļāđ‡āļšāļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ String āļŠāļ·āđˆāļ­āļ§āđˆāļē name āđ„āļ§āđ‰āđƒāļ™ attribute āļ‚āļ­āļ‡ session āļ—āļĩāđˆāļŠāļ·āđˆāļ­
SessionName āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

           String name = "Numnonda";
           HttpSession session = request.getSession();
           session.setAttribute("SessionName", name);

        āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ‚āļ­āļ‡ Session āļ—āļĩāđˆāļŠāļ·āđˆāļ­ SessionName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡
āļ•āļąāļ§āđāļ›āļĢ name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļˆāļēāļ Session āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰
           HttpSession session = request.getSession();
           String name = (String) session.getAttribute("SessionName");



                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
52

         āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš
session āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstSessionServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ
source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.3 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondSessionServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļē
āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.4
Listing āļ—āļĩāđˆ 7.3 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstSessionServlet.java

package servlet;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FirstSessionServlet extends HttpServlet {

     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.setContentType("text/html;charset=UTF-8");
         PrintWriter out = response.getWriter();
         try {
             String name = "Numnonda";
             HttpSession session = request.getSession();
             session.setAttribute("SessionName", name);
         } finally {
             out.close();
         }
     }

     protected void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         processRequest(request, response);
     }

     protected void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         processRequest(request, response);
     }

     public String getServletInfo() {
         return "Short description";
     }

}


Listing āļ—āļĩāđˆ 7.4 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondSessionServlet.java

package servlet;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;


public class SecondSessionServlet extends HttpServlet {


     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.setContentType("text/html;charset=UTF-8");
         PrintWriter out = response.getWriter();
         try {
             HttpSession session = request.getSession();
             String name = (String) session.getAttribute("SessionName");


Thanachart Numnonda and Thanisa Kruawaisayawan
53

                  out.println(name);
              } finally {
                  out.close();
              }
        }


        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }

        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }


        public String getServletInfo() {
            return "Short description";
        }

}


7.2.1       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session
            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    1.      āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Dynamic Web Application
            āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ ScopeDemo
    2.      āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish
    3.      āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstSessionServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.3 āđāļĨāđ‰āļ§ Save
    4.      āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
            āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish
            āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondSessionServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.4 āđāļĨāđ‰āļ§ Save
7.2.2       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session
            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    1.      āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo
    2.      āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo
    3.      āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstSessionServlet
    4.      āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondSessionServlet āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ
    5.      āļ—āļ”āļĨāļ­āļ‡āļ›āļīāļ” Web Browser āđāļĨāđ‰āļ§āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­
            http://localhost:8080/ScopeDemo/SecondSessionServlet āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ




                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
54

7.3    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application
          āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļš Application āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļąāļš
āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ—āļļāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Web Application āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ•āļĢāļēāļšāđƒāļ”āļ—āļĩāđˆ Web Server āļĒāļąāļ‡
deploy āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ­āļĒāļđāđˆ āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē Web Browser āļ‚āļ­āļ‡āļāļąāđˆāļ‡ client āļˆāļ°āļ›āļīāļ”āđ„āļ›āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄ āļāļēāļĢāļāļģāļŦāļ™āļ”
āļ‚āļ­āļšāđ€āļ‚āļ•āđāļšāļš Application āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ setAttribute() āļāļąāļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„
āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Web Application āļ‹āļķāđˆāļ‡āđƒāļ™āđāļ•āđˆāļĨāļ° Web Application āļˆāļ°āļĄāļĩāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ­āļĒāļđāđˆāļŦāļ™āļķāđˆāļ‡āļ•āļąāļ§ āđāļĨāļ°
āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļĄāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getServletContext()
        āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” String āļ—āļĩāđˆāļŠāļ·āđˆāļ­ name āđ„āļ§āđ‰āđƒāļ™ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ AppName āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āļŠāļ™āļīāļ”
ServletContext āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

                 String name = "Numnonda";
                 ServletContext context = getServletContext();
                 context.setAttribute("AppName", name);


        āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ—āļĩāđˆāļŠāļ·āđˆāļ­
AppName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ”
ServletContext āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰

        ServletContext context = getServletContext();
           String name = (String) context.getAttribute("AppName");
           out.println(name);


         āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš
application āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstAppServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ
source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.5 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondAppServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļē
āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.6
Listing āļ—āļĩāđˆ 7.5 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstAppServlet.java
package servlet;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class FirstAppServlet extends HttpServlet {
      protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
       throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String name = "Numnonda";
            ServletContext context = getServletContext();
            context.setAttribute("AppName", name);
        } finally {
            out.close();
        }
    }

      protected void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
           processRequest(request, response);


Thanachart Numnonda and Thanisa Kruawaisayawan
55

        }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
         processRequest(request, response);
     }

        public String getServletInfo() {
            return "Short description";
        }
}


Listing āļ—āļĩāđˆ 7.6 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondAppServlet.java

package servlet;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SecondAppServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ServletContext context = getServletContext();
            String name = (String) context.getAttribute("AppName");
            out.println(name);
        } finally {
            out.close();
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}


7.3.1       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Application
            āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    1.      āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Dynamic Web Application
            āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ ScopeDemo
    2.      āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish
    3.      āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstAppServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.5 āđāļĨāđ‰āļ§ Save
    4.      āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
            āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
            āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish
            āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondAppServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.6 āđāļĨāđ‰āļ§ Save


                                                                                      āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
56

7.3.2     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application
          āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
     1.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo
     2.   āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo
     3.   āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstAppServlet
     4.   āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondAppServlet āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ
     5.   āļ—āļ”āļĨāļ­āļ‡āļ›āļīāļ” Web Browser āđāļĨāđ‰āļ§āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­
          http://localhost:8080/ScopeDemo/SecondAppServlet āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ




Thanachart Numnonda and Thanisa Kruawaisayawan
57


           Exercise 8 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
         āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebBaseDB āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļēāļ™
āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡ Table āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ—āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļ”āļīāļĄāļ—āļĩāđˆ
āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āđ€āļĄāļ˜āļ­āļ” init()
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java
      2.   āđāļāđ‰āđ„āļ‚āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java
8.1    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java
       āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet āļāļģāļŦāļ™āļ”āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļĄāļ˜āļ­āļ” init() āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāđ„āļĄāđˆ
āđ€āļŦāļĄāļēāļ°āļŠāļĄāļ™āļąāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ—āļļāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡
āđ€āļĄāļ˜āļ­āļ” init() āļ—āļĩāđˆāļ‹āđ‰āļģāļāļąāļ™
         āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļˆāļ°āļĄāļĩ Listener āļ­āļĒāļđāđˆāļŠāļ­āļ‡āļŠāļ™āļīāļ”āļ„āļ·āļ­ 1. Context Listener āđāļĨāļ° 2. Session Listener
āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ Context Listener āļ‹āļķāđˆāļ‡āļĄāļąāļ™āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­ Web Application
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļŦāļĢāļ·āļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™
           āđ€āļĢāļēāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— Context Listener āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āđ€āļ‚āļĩāļĒāļ™ āļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Listener ( āļ„āļ·āļ­ Class āļ—āļĩāđˆ implements interface ServletContextListener )
      2.   Implements method āļ—āļĩāđˆāļšāļąāļ‡āļ„āļąāļšāđƒāļ™ Interface āļ‚āļ­āļ‡ Listener āļ™āļąāđ‰āļ™āđ†


         āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ ServletContextListener āļĄāļąāļ™āļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āđ€āļĄāļ·āđˆāļ­ Web Application āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ Connection āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™ ServletContext āđ€āļžāļ·āđˆāļ­āļĨāļ”āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āđƒāļ™āļāļēāļĢ
āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
         āđ€āļ‚āļĩāļĒāļ™āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļģāļ—āļĩāđˆ Method contextInitialized( ) āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­ Web Application āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
āļāļēāļĢāļ—āļģāļ‡āļēāļ™




                                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
58


  āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java
     1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Listener
          āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ listener āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ Init āļāļ” Next
          āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļŠāđˆāļ­āļ‡ Lifecycle āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 8.1




                                     āļĢāļđāļ›āļ—āļĩāđˆ 8.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener


     2.   āļ•āļĢāļ§āļˆāļŠāļ­āļš context.xml āļ§āđˆāļēāļĄāļĩāļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ–āđ‰āļēāđ„āļĄāđˆāļĄāļĩāđƒāļŦāđ‰ āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” DataSource āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Tomcat
          āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡ file context.xml āļ—āļĩāđˆ Folder WebContentMETA-INF
          <Context>
          <Resource


Thanachart Numnonda and Thanisa Kruawaisayawan
59

                name="jdbc/test"
                auth="Container"
                driverClassName="com.mysql.jdbc.Driver"
                type="javax.sql.DataSource"
                url="jdbc:mysql://localhost:3306/test"
                username="root"
                password="root" >
         </Resource>
         </Context>

    3.   āđ€āļ‚āļĩāļĒāļ™ source code āļ­āļĒāļđāđˆāļ™āļ­āļāđ€āļĄāļ˜āļ­āļ”āđƒāļ”āđ† āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āđƒāļ™āđ€āļĄāļ˜āļ­āļ” contextInitialized āđāļĨāļ° contextDestroyed āđ€āļžāļ·āđˆāļ­
         āļ—āļģāļāļēāļĢāļ‚āļ­ Datasource āļˆāļēāļ Container āļŠāđˆāļ§āļ™āļ•āļąāļ§āđāļ›āļĢ ds āļ—āļĩāđˆāļĢāļąāļšāđ€āļ›āđ‡āļ™ Instance Member
                 @Resource(name="jdbc/test")
                 private DataSource jdbcTest;

                 private Connection conn;

         āđ€āļžāļīāđˆāļĄ source code (āļ‚āđ‰āļ­ 4 - 5) āđƒāļ™ āđ€āļĄāļ˜āļ­āļ” contextInitialized āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄ connection āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™
    4.   āļ‚āļ­ Connection āļˆāļēāļ Datasource
                 conn = ds.getConnection();

    5.   āļ™āļģ Connection āđ„āļ›āđ€āļāđ‡āļšāļ—āļĩāđˆ ServletContext āđāļĨāđ‰āļ§ āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ context variable āđ€āļ›āđ‡āļ™ connection
         (arg0 āļ„āļ·āļ­ instance āļ‚āļ­āļ‡ ServletContextEvent āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāđƒāļŦāđ‰āļ—āļēāļ‡ argument)
                 arg0.getServletContext().setAttribute("connection", conn);

    6.   āđ€āļžāļīāđˆāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđƒāļ™āđ€āļĄāļ˜āļ­āļ” contextDestroyed āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļĨāļēāļĒ Database Connection
         āļāļĢāļ“āļĩ Web Application āļŦāļĒāļļāļ”āđƒāļŠāđ‰āļ‡āļēāļ™
         public void contextDestroyed(ServletContextEvent arg0) {
             try{
                  conn.close();
             } catch (SQLException ex) {
                  Logger.getLogger(Init.class.getName()).log(Level.SEVERE, null, ex);
             }
         }

āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ Init.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ   8.1


Listing āļ—āļĩāđˆ 8.1 āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java

package listener;

import java.sql.Connection;
import java.sql.SQLException;

import   javax.annotation.Resource;
import   javax.servlet.ServletContextEvent;
import   javax.servlet.ServletContextListener;
import   javax.sql.DataSource;

public class Init implements ServletContextListener {

         @Resource(name="jdbc/test")
         private DataSource jdbcTest;

         private Connection conn;




                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
60

      public void contextInitialized(ServletContextEvent arg0) {
         try {

                  conn = jdbcTest.getConnection();
                  arg0.getServletContext().setAttribute("connection", conn);
           } catch (SQLException e) {
                  e.printStackTrace();
           }
      }

      public void contextDestroyed(ServletContextEvent arg0) {
         try {
                conn.close();
         } catch (SQLException e) {
           e.printStackTrace();
         }
      }
}


8.2    āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java
         āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āļˆāļ°āļĄāļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĢāļēāļˆāļķāļ‡āļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļēāļ™
āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒ AddBookServlet.java āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āđƒāļŦāđ‰āļĨāļšāļ„āļģāļŠāļąāđˆāļ‡
           @Resource(name = "jdbc/test")
           private DataSource jdbcTest;

      2.   āđāļāđ‰āđ„āļ‚āđ€āļĄāļ˜āļ­āļ” init() āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
           public void init() {
                 conn = (Connection) getServletContext().getAttribute("connection");
           }



āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđƒāļŦāļĄāđˆāļ”āļąāļ‡ Listing āļ—āļĩāđˆ 8.2
Lisitng āļ—āļĩāđˆ 8.2 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java

package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/addBook.do")
public class AddBookServlet extends HttpServlet {

           private static final long serialVersionUID = 1L;

           private Connection conn;

           public void init() {
                 conn = (Connection) getServletContext().getAttribute("connection");


Thanachart Numnonda and Thanisa Kruawaisayawan
61

           }

protected void processRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Add a new book</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h1> Add a new book </h1>");

           try {
                   String isbn = request.getParameter("isbn");
                   String author = request.getParameter("author");
                   String title = request.getParameter("title");
                   String priceStr = request.getParameter("price");
                   float price = Float.parseFloat(priceStr);

                   Statement stmt = conn.createStatement();

                   String sql = "INSERT INTO books VALUES('" + isbn + "','" + title
                               + "','" + author + "'," + price + ")";
                   int numRow = stmt.executeUpdate(sql);

                   RequestDispatcher obj = request
                               .getRequestDispatcher("Thankyou.html");
                   if (numRow == 1 && obj != null) {
                         obj.forward(request, response);
                   }

           } catch (SQLException ex) {
                 out.println("Error " + ex);
                 return;
           }
           out.println("</body>");
           out.println("</html>");
                 out.close();
           }

           protected void doGet(HttpServletRequest request,
                 HttpServletResponse response) throws ServletException, IOException {
                 processRequest(request, response);
           }

           protected void doPost(HttpServletRequest request,
                 HttpServletResponse response) throws ServletException, IOException {
                 processRequest(request, response);
           }
}

8.3    āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB
      2.   Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĢāļąāļ™ MySQL Database Server āļāđˆāļ­āļ™
      3.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļē addBook.html āđƒāļŦāđ‰āđ€āļĢāļēāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ
           āļ‹āļĩāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļāļ” OK āļœāļĨāļĨāļąāļžāļ˜āđŒāļāđ‡āļˆāļ°āļ–āļđāļāļšāļąāļ™āļ—āļķāļāļĨāļ‡ Table books āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđāļšāļšāļāļķāļāļŦāļąāļ”āļ—āļĩāđˆ 5

                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
62


                       Exercise 9 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
      āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ€āļžāļ·āđˆāļ­āļ­āļ˜āļīāļšāļēāļĒāļāļēāļĢāđƒāļŠāđ‰ Servlet Filter āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆ
āļŠāļ­āļšāļāļēāļĢ login āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļšāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āļˆāļ°āļ–āļđāļ Filter āđ€āļĢāļĩāļĒāļāđ€āļžāļ·āđˆāļ­
āļ•āļąāļ§āļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢ login āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āđ„āļ”āđ‰
9.1   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter
        āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™ Web Application āļ‹āļķāđˆāļ‡āļˆāļ°āļ”āļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđƒāļ”āđ† āđāļĨāđ‰āļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđāļāđ‰āđ„āļ‚āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” request āđāļĨāļ° response āļāđˆāļ­āļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ Java
Servlet āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ•āđˆāļ­āđ„āļ› āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āļ„āļ·āļ­

              ●    āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet āļŦāļĢāļ·āļ­āļāļēāļĢāļ—āļģ Authentication
              ●    āļāļēāļĢāļšāļĨāđ‡āļ­āļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet āļŦāļĢāļ·āļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet
              ●    āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request
          āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āļˆāļ°āđ€āļ›āđ‡āļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ Java āļ—āļĩāđˆ implements āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļŸāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Filter āđāļĨāļ°āļĄāļĩāđ€āļĄāļ˜āļ­āļ”āļŦāļĨāļąāļāļ„āļ·āļ­
init( ), destroy( ) āđāļĨāļ° doFilter( )

       āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ URL āđƒāļ”āđ† āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ–āļđāļ Filter āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter
āđƒāļ”āđ† āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē annotation āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļ„āļģāļŠāļąāđˆāļ‡
         @WebFilter("*")
         public class LoginFilter implements Filter {
            â€Ķ
         }


         āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ URL āļ—āļļāļāļ•āļąāļ§āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āļ™āļĩāđ‰ āļ•āđ‰āļ­āļ‡āļ–āļđāļāļ”āļąāļāđ‚āļ”āļĒ Servlet Filter āļ—āļĩāđˆ
āļŠāļ·āđˆāļ­ LoginFilter
āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩ Web Page āļ—āļĩāđˆāļŠāļ·āđˆāļ­ login.html āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļš
āļ„āđˆāļē username āđāļĨāļ° password āļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āļŦāļēāļāļ–āļđāļāļ•āđ‰āļ­āļ‡āļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāļ·āđˆāļ­ loginFlag āđ€āļ›āđ‡āļ™ true
(āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ loginFlag āđ€āļ›āđ‡āļ™āđāļšāļš Session āđ‚āļ”āļĒāļāļēāļĢ setAttribute āđƒāļŦāđ‰āļāļąāļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ”
HttpSession )

       āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ™āļĩāđ‰āļĒāļąāļ‡āļĄāļĩ Servlet Filter āļ—āļĩāđˆāļŠāļ·āđˆāļ­ LoginFilter āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„
LoginFlag āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āļ–āđ‰āļēāļŦāļēāļāđ„āļĄāđˆāļžāļšāļŦāļĢāļ·āļ­āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ false āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĢāļ°āļšāļļ HTTP Error 401
(This request requires HTTP authentication . )

         āļŠāļļāļ”āļ—āđ‰āļēāļĒāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ ShowServlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē HelloWorld āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡
āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ–āļđāļāļ”āļąāļāđ‚āļ”āļĒ LoginFilter

Thanachart Numnonda and Thanisa Kruawaisayawan
63

9.2   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļē Login
        āļŦāļ™āđ‰āļē Login āļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ login.html āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™ web page āļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.1 āđāļĨāļ°āļĄāļĩ
source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 9.1 āļ™āļ­āļāļˆāļēāļāļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­
username āđāļĨāļ° password āļžāļĢāđ‰āļ­āļĄāļ—āļąāđ‰āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ thana āđāļĨāļ° secret āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļŦāļēāļāđƒāļŠāđˆāļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āļ„āđˆāļē āļ•āļąāļ§āđāļ›āļĢ
loginFlag āđ€āļ›āđ‡āļ™ true āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.2




                                         āļĢāļđāļ›āļ—āļĩāđˆ 9.1 āđ€āļ§āđ‡āļšāļŦāļ™āđ‰āļē Login
Listing āļ—āļĩāđˆ 9.1 āđ‚āļ›āļĢāđāļāļĢāļĄ login.html

<html>
  <head><title>Login Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <form action="LoginServlet" method="POST">
       UserName: <input name="username" /> <br>
       Password: <input type="password" name="password" /> <br>
       <input type="submit" value="Login" />
    </form>
  </body>
</html>


Listing āļ—āļĩāđˆ 9.2 āđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet.java

package controller;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
             boolean loginflag=false;
             try{
             String username =request.getParameter("username");
             String password =request.getParameter("password");
             System.out.println("input username="+username + ": password="+password);
             if(username.equals("thana") && password.equals("secret")){
                    loginflag=true;
             }
             request.getSession().setAttribute("loginFlag", loginflag);
             response.sendRedirect("show.do");
             }catch (Exception e) {
                    e.printStackTrace();
             }


                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
64

           }

      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
          processRequest(request, response);
      }

      protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
          processRequest(request, response);
      }

      public String getServletInfo() {
          return "Short description";
      }
}


           āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ” Project āđ€āļ›āđ‡āļ™
           FilterDemo āđāļĨāđ‰āļ§āļāļ” Finish
      2.   āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ login.html āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → HTML File
           āļāļģāļŦāļ™āļ” HTML File Name āđ€āļ›āđ‡āļ™ login āđāļĨāđ‰āļ§āļāļ” Finish
      3.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ login.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.1 āđāļĨāđ‰āļ§ Save
      4.   āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ LoginServlet.java āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
           āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ controller āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ LoginServlet.java āđāļĨāđ‰āļ§āļāļ” Finish
           āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ LoginServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.2 āđāļĨāđ‰āļ§ Save
9.3    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Servlet Filter
           āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ loginFlag āđāļĨāļ°āļŦāļēāļāđ„āļĄāđˆāļžāļšāļŦāļĢāļ·āļ­āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™
false āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĢāļ°āļšāļļ HTTP Error 401 (Unauthorize) āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter āļˆāļ°āļĄāļĩ source code āļŦāļĨāļąāļ
āļ­āļĒāļđāđˆāļ—āļĩāđˆ āđ€āļĄāļ˜āļ­āļ” doFilter() āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.3
           āļāļĢāļ“āļĩāļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ URL āđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ *.do āļˆāļķāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Filter āļ—āļĩāđˆāļŠāļ·āđˆāļ­ LoginFilter āđƒāļŦāđ‰āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ
Eclipse āļŠāļĢāđ‰āļēāļ‡ Filter


Listing āļ—āļĩāđˆ 9.3 āđ€āļĄāļ˜āļ­āļ” doFilter() āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter.java

package filter;

import javax.servlet.*;
import javax.servlet.http.*;

@WebFilter("*.do")
public class LoginFilter implements Filter {
       public void destroy() {
       }

           public void doFilter(ServletRequest request, ServletResponse response, FilterChain
              chain) throws IOException, ServletException {

                   HttpServletRequest req = (HttpServletRequest) request;
                   HttpSession session = req.getSession();



Thanachart Numnonda and Thanisa Kruawaisayawan
65

                Boolean flag = (Boolean) session.getAttribute("loginFlag");
                boolean loginFlag;
                 if (flag == null) {
                     loginFlag = false;
                 } else {
                     loginFlag = flag;
                 }
                 if (!loginFlag) {
                     HttpServletResponse res = (HttpServletResponse) response;
                     res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                     return;
                 }
                chain.doFilter(request, response);
         }
         public void init(FilterConfig fConfig) throws ServletException {
         }
}


         āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
    1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” FilterDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New > Other..
    2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New File āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Categories āļ—āļĩāļŠāļ·āđˆāļ­ Web āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡ File Types āļ•āđˆāļēāļ‡āđ† āļ āļēāļĒāđƒāļ•āđ‰
         Category āļ™āļĩāđ‰ āđƒāļŦāđ‰āđ€āļĢāļēāđ€āļĨāļ·āļ­āļ Filter āđāļĨāđ‰āļ§āļāļ” Next
    3.   āļāļģāļŦāļ™āļ” Class Name: āđ€āļ›āđ‡āļ™ LoginFilter āđāļĨāļ° Java Package āđ€āļ›āđ‡āļ™ filter āđāļĨāđ‰āļ§āļāļ” Next
    4.   āđƒāļ™āļŦāļ™āđ‰āļēāļ–āļąāļ”āđ„āļ› āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āđˆāļēāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.2 āđāļĨāđ‰āļ§āļāļ” Finish




                                                                              āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
66




                                            āļĢāļđāļ›āļ—āļĩāđˆ 9.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ‚āļ­āļ‡ Filter
     5.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡āđ€āļĄāļ˜āļ­āļ” doFilter() āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ LoginFilter.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ
          9.3 āđāļĨāđ‰āļ§ Save




Thanachart Numnonda and Thanisa Kruawaisayawan
67


9.4    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet
     āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē Hello World āđāļĨāļ°āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ Filter
source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.4

Listing āļ—āļĩāđˆ 9.4 āđ€āļĄāļ˜āļ­āļ” processRequest() āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet.java

    protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
    throws ServletException, IOException {
       PrintWriter out = response.getWriter();
       response.setContentType("text/html;charset=UTF-8");

           try {
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet ShowServlet</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<h1> Hello World </h1>");
                out.println("</body>");
                out.println("</html>");
            } finally {
                out.close();
            }
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
}


           āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet
           āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ view āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ ShowServlet
      2.   āļāļģāļŦāļ™āļ” URL Mapping āđ€āļ›āđ‡āļ™ /show.do āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.3 āđāļĨāđ‰āļ§āļāļ” Finish




                                                                               āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
68




                                           āļĢāļđāļ›āļ—āļĩāđˆ 9.3 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē URL pattern
      3.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ ShowServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.4 āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Save
9.5    āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ FilterDemo
      2.   āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ FilterDemo
      3.   āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/FilterDemo/show.do
           āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” HTTP 401
      4.   āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/FilterDemo/login.html
           āđāļĨāđ‰āļ§āļ›āđ‰āļ­āļ™ username āđ€āļ›āđ‡āļ™ thana āđāļĨāļ° password āđ€āļ›āđ‡āļ™ secret āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢ
Thanachart Numnonda and Thanisa Kruawaisayawan
69


                 Exercise 10 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
      āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ­āļ­āļāļ—āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web
Browser āđ‚āļ”āļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB āđ€āļžāļ·āđˆāļ­āđ€āļ•āļīāļĄ

10.1    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ     hello.jsp

       āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āļ§āļąāļ™āđ€āļ§āļĨāļēāļ‚āļ­āļ‡ Web Server āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°
āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđāļšāļš dynamic content āļˆāļķāļ‡āļ•āđ‰āļ­āļ‡āļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļē JSP āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļ”āļīāļĄ
(WebBaseDB) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰

   1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File
        āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ hello āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.1




                                                āļĢāļđāļ›āļ—āļĩāđˆ 10.1 āļŠāļĢāđ‰āļēāļ‡ JSP file

   2.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ hello.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 10.1
   3.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB
   4.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ hello.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄ
   5.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.2




                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
70

Listing āļ—āļĩāđˆ 10.1 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
    <head><title>Hello JSP</title></head>
    <body>
    <h1>My First JSP</h1>
        Hello : Current time is : <%= new java.util.Date() %>
    </body>
</html>




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 10.2 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ hello.jsp

10.2     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ        viewBook.jsp

         āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
standard tags āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™ JSTL āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ source code āļ āļēāļĐāļē Java āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡
āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰
10.2.1     āļāļēāļĢāļāļģāļŦāļ™āļ” Tag Library
         āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JSTL āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ Taglib āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ›āļĢāļ°āļāļēāļĻ Library āļ”āļąāļ‡āļ™āļĩāđ‰
         (Project āļŦāļĢāļ·āļ­ Web Server āļ•āđ‰āļ­āļ‡āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™ Library .jar āļ‚āļ­āļ‡ JSTL āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™ āļ­āļēāļˆāļ•āđ‰āļ­āļ‡ download āđ€āļžāļīāđˆāļĄ)
                   <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
                   <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>



10.2.2     āļāļēāļĢāļāļģāļŦāļ™āļ” Datasource
      āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ DataSource āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–
āļāļģāļŦāļ™āļ”āđ„āļ”āđ‰āļŠāļ­āļ‡āļ§āļīāļ˜āļĩ
         1. āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩ datasource āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ­āļąāļ™āđ€āļ”āļīāļĄāđ„āļ”āđ‰āđ€āļĨāļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
jdbc/test āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ dataSource āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆāļ­āļĩāļ
         2. āļāļĢāļ“āļĩāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩ datasource āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ setDataSource āđ€āļ›āđ‡āļ™ Tag āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš
āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļ•āļēāļĄāļŠāļ·āđˆāļ­āļ—āļĩāđˆāļāļģāļŦāļ™āļ”

      āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB āļˆāļ°āļĄāļĩ Datasource āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āđāļ•āđˆāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ” Datasource āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ
āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļŠāļ·āđˆāļ­ newdatasource āļ”āļąāļ‡āļ™āļĩāđ‰

Thanachart Numnonda and Thanisa Kruawaisayawan
71

         <sql:setDataSource var="newdatasource" driver="com.mysql.jdbc.Driver"
         url="jdbc:mysql:///test" user="root" password="root"/>

āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ—āļĩāđˆ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ jdbc:mysql:///test
*āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ URL āļ‚āļ­āļ‡ DB āđ„āļ”āđ‰ 2 āđāļšāļš āļ„āļ·āļ­ jdbc:mysql://localhost:3306/test āļŦāļĢāļ·āļ­ jdbc:mysql:///test

         āļ„āļģāļŠāļąāđˆāļ‡ sql:query āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™ DataSource āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ jdbc/test āļŦāļĢāļ·āļ­
āļ•āļąāļ§āđāļ›āļĢ newdatasource āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āđ€āļĢāļēāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āļ„āļ·āļ­ select * from books āđ‚āļ”āļĒāđƒāļŠāđ‰
āļ„āļģāļŠāļąāđˆāļ‡ sql:query āļ”āļąāļ‡āļ™āļĩāđ‰
<sql:query var="db" dataSource="jdbc/test">
SELECT * FROM books
</sql:query>
āļŦāļĢāļ·āļ­
<sql:query var="db" dataSource="${newdatasource}">
SELECT * FROM books
</sql:query>



10.2.3   āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ c:forEach āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨ
         āļāļēāļĢāđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢ Query āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰ āļāļēāļĢāđāļˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāļĨāļ°āđāļ–āļ§āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
         c:forEach āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāļ°āļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡ āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰

                 <c:forEach var="row" items="${db.rows}">
                   ${row.title} : ${row.author} <br>
                 </c:forEach>

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰ āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP
         āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ viewBook āđāļĨāđ‰āļ§āļāļ” Finish
    2.   āđ€āļžāļīāđˆāļĄ JSTL Library āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ JSP āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰
         (Download file jstl-1.2.jar āđāļĨāļ° jstl-api-1.2.jar āļˆāļēāļ http://jstl.java.net/download.html)
         āļ™āļģ .Jar File āļ—āļąāđ‰āļ‡ 2 āđ„āļ›āđ„āļ§āđ‰āļ—āļĩāđˆ folder {$TOMCAT}lib āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ path āļ‚āļ­āļ‡āļ—āļĩāđˆ install Apache Tomcat āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.3




                             āļĢāļđāļ›āļ—āļĩāđˆ 10.3 āļāļēāļĢāđ€āļžāļīāđˆāļĄ JSTL Library āļšāļ™ Apache Tomcat




                                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
72

          āđ€āļĄāļ·āđˆāļ­āļ”āļđāļ—āļĩāđˆ   Project → Java Resource → Libraries → Apache Tomcat v6.0 āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩ JSTL āđ€āļžāļīāđˆāļĄāđāļĨāđ‰āļ§ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāļĩāđˆ
10.4




                                 āļĢāļđāļ›āļ—āļĩāđˆ 10.4 JSTL Library āļ—āļĩāđˆ Apache Tomcat āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰

     3.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ viewBook.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 10.2
     4.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB
     5.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ viewBook.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄ
     6.   āļ—āļĩāđˆ Web Browser āđ€āļ›āļĨāļĩāđˆāļĒāļ™ URL āđ€āļ›āđ‡āļ™ http://localhost:8080/WebBaseDB/viewBook.jsp āļˆāļ°āđ„āļ”āđ‰
          āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 10.5




                                           āļĢāļđāļ›āļ—āļĩāđˆ 10.5 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ viewBook.jsp

Listing āļ—āļĩāđˆ 10.2 āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html> <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>JSP Page</title>
    </head>
  <body>
  <h1>JSP Page</h1>
       <sql:setDataSource var="newdatasource" driver="com.mysql.jdbc.Driver"
       url="jdbc:mysql:///test" user="root" password="root" />

          <sql:query var="db" dataSource="${newdatasource}">
             SELECT * FROM books
          </sql:query>

        <c:forEach var="row" items="${db.rows}">
           ${row.title} : ${row.author} <br>
        </c:forEach>
  </body>
</html>


Thanachart Numnonda and Thanisa Kruawaisayawan
73


             Exercise 11 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Online Book Store

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°
                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ
        āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ Web Form āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ
āđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļ­āļ­āļāļĄāļēāļ—āļēāļ‡āđ€āļ§āđ‡āļšāđ€āļžāļˆ
11.1     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp
        āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books
āļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ Web Form āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.6 āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰ Web Form āļ™āļĩāđ‰
āļˆāļ°āđ€āļĢāļĩāļĒāļ url āļ—āļĩāđˆāļŠāļ·āđˆāļ­ processSelection āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ Select āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ SQL tags āļ‚āļ­āļ‡ JSTL āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡
āļĢāļēāļĒāļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™ Listing āļ—āļĩāđˆ 11.1 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web-Base Application āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    2.   āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.1




                                     āļĢāļđāļ›āļ—āļĩāđˆ 11.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application

    3.   āđ€āļĨāļ·āļ­āļāļĢāļđāļ› Folder āļŠāļ·āđˆāļ­ Web āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Dynamic Web Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.2




                                     āļĢāļđāļ›āļ—āļĩāđˆ 11.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application

                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
74

     4.   āđƒāļŦāđ‰āļāļģāļŦāļ™āļ” Project Name: āđ€āļ›āđ‡āļ™ BookOnline
          āļŠāđˆāļ§āļ™āļāļēāļĢāđ€āļāđ‡āļš File Eclipse āļˆāļ°āđƒāļŠāđ‰ Directory āļ—āļĩāđˆāļ–āļēāļĄāđ€āļĄāļ·āđˆāļ­āļ„āļĢāļąāđ‰āļ‡āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™ Default
          āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāļīāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļ­āļ (Uncheck) āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļ Directory āđƒāļŦāļĄāđˆāđ„āļ”āđ‰
          āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.3 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next




                                                 āļĢāļđāļ›āļ—āļĩāđˆ11.3 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„
     5.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Folder āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output folder (āļ—āļĩāđˆāđ€āļāđ‡āļš Class file)
          āļ„āļ·āļ­ [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]src āđāļĨāļ° [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]buildclasses
          āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.4 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Next




                                  āļĢāļđāļ›āļ—āļĩāđˆ 11.4 āđāļŠāļ”āļ‡āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output directory



Thanachart Numnonda and Thanisa Kruawaisayawan
75

6.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Context root āđāļĨāļ° Content directory āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.5 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Finish




                          āļĢāļđāļ›āļ—āļĩāđˆ 11.5 āđāļŠāļ”āļ‡āļŠāļ·āđˆāļ­ Context root āđāļĨāļ° Content directory

7.  āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project BookOnline āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File
    āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ selectBooks āđāļĨāđ‰āļ§āļāļ” Finish
8. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ selectBooks.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.1
9. āļāļ”āļ›āļļāđˆāļĄ Save
10. āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 11.6




                                                                               āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
76




Thanachart Numnonda and Thanisa Kruawaisayawan
77




āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
78




Thanachart Numnonda and Thanisa Kruawaisayawan
79




                        āļĢāļđāļ›āļ—āļĩāđˆ 11.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp




Listing āļ—āļĩāđˆ 11.1 āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>


<!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>JSP Page</title>
    </head>

     <body>

     <sql:setDataSource var="ds" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql:///test" user="root" password="root" />

     <sql:query var="rs" dataSource="${ds}">
         select * from books
     </sql:query>

     <h1>Select Books</h1>
     <form action="ProcessSelection" method="POST">


                                                                                āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
80

        <table border="1">
            <thead>
                 <tr>
                      <th></th>
                      <th> Title </th>
                      <th> Author </th>
                      <th> Price</th>
                 </tr>
            </thead>
            <tbody>
                 <c:forEach var="book" items="${rs.rows}">
                      <tr>
                           <td><input type="checkbox" name="isbn"
                             value="${book.isbn}" /> </td>
                           <td>${book.title}</td>
                           <td>${book.author}</td>
                           <td>${book.price}</td>
                      </tr>
                 </c:forEach>
            </tbody>
        </table>
        <input type="submit" value="Select" />
    </form>
    </body>
</html>




11.2    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java
        āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļĄāļĩ attribute āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡
Listing āļ—āļĩāđˆ 11.2 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
     1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Class..
     2. āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ model āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ Book āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.7




Thanachart Numnonda and Thanisa Kruawaisayawan
81




         āļĢāļđāļ›āļ—āļĩāđˆ 11.7 āļāļēāļĢ New Class Book.java āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ JavaBean āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļš Table

3.   āđ€āļžāļīāđˆāļĄ attribute āļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ BookActionForm āļ”āļąāļ‡āļ™āļĩāđ‰
             private    String   isbn;
             private    String   author;
             private    String   title;
             private    double   price;
             āļŦāļĢāļ·āļ­
             private String isbn,author,title;
             private double price;




4.   āļ—āļģāļāļēāļĢ encapsulate attribute (āļŠāļĢāđ‰āļēāļ‡āđ€āļĄāļ˜āļ­āļ” getter āđāļĨāļ° setter)
     āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āļ‚āļ­āļ‡ source code
     āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source > Generate Getters and Setters... āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.8




                                                                                  āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
82




                     āļĢāļđāļ›āļ—āļĩāđˆ 11.8 āļāļēāļĢ New Class Book.java āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ JavaBean āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļš Table
     5.   āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ°āļŠāļĢāđ‰āļēāļ‡ getters āļŦāļĢāļ·āļ­ setters āļŦāļĢāļ·āļ­āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ­āļĒāđˆāļēāļ‡ āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļ Check box āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.9 āđāļĨāđ‰āļ§āļāļ” OK




Thanachart Numnonda and Thanisa Kruawaisayawan
83


                          āļĢāļđāļ›āļ—āļĩāđˆ 11.9 āļāļģāļŦāļ™āļ” Encapsulation āđƒāļŦāđ‰ Attribute āļŦāļĢāļ·āļ­ Instance Member

Listing āļ—āļĩāđˆ 11.2 āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java

package model;

public class Book {

       private String isbn,author,title;
       private double price;

       public String getIsbn() {
           return isbn;
       }
       public void setIsbn(String isbn) {
           this.isbn = isbn;
       }
       public String getAuthor() {
           return author;
       }
       public void setAuthor(String author) {
           this.author = author;
       }

       public String getTitle() {
           return title;
       }
       public void setTitle(String title) {
           this.title = title;
       }
       public double getPrice() {
           return price;
       }
       public void setPrice(double price) {
           this.price = price;
       }
}


11.3     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java
         āđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒāļāļąāļš shopping cart āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” Book āļ•āļēāļĄāļĢāļēāļĒāļāļēāļĢ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļ āđ‚āļ”āļĒāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ isbn āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ„āđ‰āļ™āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļˆāļēāļ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books
āļŦāļĄāļēāļĒāđ€āļĨāļ‚ isbn āļ—āļĩāđˆāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ āđāļĨāđ‰āļ§āļˆāļ°āđāļ›āļĨāļ‡āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” books āļāđˆāļ­āļ™āļˆāļ°āđƒāļŠāđˆāļĨāļ‡āđƒāļ™ cart āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code
āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.3 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Class
         āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ model , Class Name āđ€āļ›āđ‡āļ™ Cart.java āļāļ” Finish
    2.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ Cart.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.3 āđāļĨāđ‰āļ§ Save
Listing āļ—āļĩāđˆ 11.3 āđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java

package model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;


                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
84

import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;

public class Cart {
    List <Book> books;
    Connection conn;

       public void addItem(String isbn) {
           try {
               Statement stmt = conn.createStatement();
               String sql = "SELECT * from books where isbn='" + isbn + "'";
               ResultSet rs = stmt.executeQuery(sql);
               while (rs.next()) {
                    Book bk = new Book();
                    bk.setIsbn(isbn);
                    bk.setAuthor(rs.getString("author"));
                    bk.setTitle(rs.getString("title"));
                    bk.setPrice(rs.getFloat("price"));
                    books.add(bk);
               }
           } catch (SQLException ex) {
                 ex.printStackTrace();
           }
       }

       public List<Book> getBooks() {
           return books;
       }

       public Cart(Connection conn) {
           this.conn = conn;
           books = new LinkedList<Book>();
       }

       public void removeItem(String isbn) {
            books.remove(isbn);
       }
}




11.4    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java
       āđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ isbn āļ‹āļķāđˆāļ‡
āļŠāđˆāļ‡āļĄāļēāļˆāļēāļāļŦāļ™āđ‰āļē Web Form āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.java āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getParameterValues āļ”āļąāļ‡āļ™āļĩāđ‰
                   String[] isbn = request.getParameterValues("isbn");


         āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ session āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āļ­āļ­āļāļĄāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
         (āļ—āļģ Casting āđ€āļ›āđ‡āļ™ Cart āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ HttpSession.getAttribute āļĄāļąāļ™ Return Reference āļŠāļ™āļīāļ” Object āļ­āļ­āļāļĄāļē)

                   HttpSession session = request.getSession(true);
                   Cart cart = (Cart) session.getAttribute("cart");


         āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļžāļš attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļāđ‡āļš attribute āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
           if (cart == null) {
               ServletContext ctx = getServletContext();
               Connection conn = (Connection) ctx.getAttribute("connection");
               cart = new Cart(conn);
               session.setAttribute("cart", cart);


Thanachart Numnonda and Thanisa Kruawaisayawan
85

          }


       āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ„āđˆāļē attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āļĄāļēāđāļĨāđ‰āļ§ āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļāļēāļĢāļŠāļ·āđˆāļ­ isbn āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĨāļ‡āđƒāļ™
āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‚āļ­āļ‡ cart āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
           for (int i = 0; i < isbn.length; i++) {
              cart.addItem(isbn[i]);
          }


         āđ€āļĄāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ„āļ›āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ view.cart āļ•āđˆāļ­āđ„āļ› āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
          RequestDispatcher pg = request.getRequestDispatcher("viewCart.jsp");
          pg.forward(request, response)


         āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code āļ‚āļ­āļ‡āđ€āļĄāļ˜āļ­āļ” processRequest āļ”āļąāļ‡ Listing āļ—āļĩāđˆ      11.4


         āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Servlet
         āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ ProcessSelection
    2.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ ProcessSelection.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.4 āđāļĨāđ‰āļ§ Save




                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
86

Listing āļ—āļĩāđˆ 11.4 āđ€āļĄāļ˜āļ­āļ” processRequest() āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java

package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import    javax.servlet.RequestDispatcher;
import    javax.servlet.ServletContext;
import    javax.servlet.ServletException;
import    javax.servlet.http.HttpServlet;
import    javax.servlet.http.HttpServletRequest;
import    javax.servlet.http.HttpServletResponse;
import    javax.servlet.http.HttpSession;

import model.Cart;

public class ProcessSelection extends HttpServlet {
       private static final long serialVersionUID = 1L;

     public ProcessSelection() {
         super();
     }

     protected void doGet(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
         processRequest(request, response);
     }

     protected void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {
         processRequest(request, response);
     }

     protected void processRequest(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException {

           PrintWriter out = response.getWriter();
           response.setContentType("text/html;charset=UTF-8");

           String[] isbn = request.getParameterValues("isbn");

           HttpSession session = request.getSession(true);
           Cart cart = (Cart) session.getAttribute("cart");
           if (cart == null) {
               ServletContext ctx = getServletContext();
               Connection conn = (Connection) ctx.getAttribute("connection");
               cart = new Cart(conn);
               session.setAttribute("cart", cart);
           }
           for (int i = 0; i < isbn.length; i++) {
               cart.addItem(isbn[i]);
           }
           cart = (Cart) session.getAttribute("cart");
           RequestDispatcher pg = request.getRequestDispatcher("viewCart.jsp");
           pg.forward(request, response);

           out.close();
     }
}




Thanachart Numnonda and Thanisa Kruawaisayawan
87

11.5     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java
         āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— ServletContextListener āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĄāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ connection āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™ ServletContext āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
Init.java āđƒāļ™ Exercise 7 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener (āļŦāļ™āđ‰āļē 55)
āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ context.xml āđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Exercise āļ”āļąāļ‡āļāļĨāđˆāļēāļ§
Listing āļ—āļĩāđˆ 11.5 Source Code āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java

package listener;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;
public class Init implements ServletContextListener {

         public Init() {
                // TODO Auto-generated constructor stub
         }
         @Resource(name = "jdbc/test")
         private DataSource ds;
         private Connection conn;
         public void contextInitialized(ServletContextEvent arg0) {
                try {
                       Connection conn;
                       conn = ds.getConnection();
                       arg0.getServletContext().setAttribute("connection", conn);
                       System.out.println("Book Online : MySQL Connection Created ");
                } catch (SQLException e) {
                       e.printStackTrace();
                }
         }
         public void contextDestroyed(ServletContextEvent arg0) {
                try {
                       conn.close();
                       System.out.println("Book Online : MySQL Connection Destroyed");

                 } catch (SQLException ex) {
                        Logger.getLogger(Init.class.getName()).log(Level.SEVERE, null, ex);
                 }
         }
}


11.6     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp
         āđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļ āđāļĨāļ°āđ€āļāđ‡āļšāđƒāļ™
shopping cart āļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Expression Language āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ session āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.6
āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → JSP File
         āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ viewCart āđāļĨāđ‰āļ§āļāļ” Finish
    2.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ viewCart.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.6 āđāļĨāđ‰āļ§ Save

                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
88

Listing āļ—āļĩāđˆ 11.6 āđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>Cart</title>
    </head>
    <body>
    <h1>Selected Books in Cart</h1>
    <c:forEach var="book" items="${sessionScope.cart.books}">
     ${book.title} <br>
    </c:forEach>
    </body>
</html>




11.7      āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
     1.   āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ BookOnline
     2.   āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/BookOnline/selectBooks.jsp
          āļ—āļ”āļĨāļ­āļ‡āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Select
          āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/BookOnline/processSelection
          āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđƒāļ™ Cart āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.10
     3.   āļ—āļ”āļĨāļ­āļ‡āļāļĨāļąāļšāđ„āļ›āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­
          http://localhost:8080/BookOnline/viewCart.jsp āđ‚āļ”āļĒāļ•āļĢāļ‡āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 11.10 āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Cart




Thanachart Numnonda and Thanisa Kruawaisayawan
89


            Exercise 12 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tags āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ JSP
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ -
           āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ custom tag āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļīāđˆāļĄāđāļŠāļ”āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ JSP āđ‚āļ”āļĒāđ„āļĄāđˆāđƒāļŠāđ‰ custom tags āđāļĨāđ‰āļ§āļŠāļĢāđ‰āļēāļ‡ tag āđ‚āļ”āļĒāđƒāļŠāđ‰ Tag Handler āđāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡
tag āđ‚āļ”āļĒāđƒāļŠāđ‰ Tag File āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāļ—āļĩāđˆ xxxx āļ„āļ·āļ­
āļŠāļ·āđˆāļ­āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ name
12.1   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp
        āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ scriptlet āđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĐāļēāļˆāļēāļ§āļē āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢ
āļ­āđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āļ—āļĩāđˆāļŠāļ·āđˆāļ­ name āđāļĨāđ‰āļ§āļˆāļ°āļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰
āļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.1 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
    1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project
        āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ JSPDemo
    2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File
        āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ hello
    3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ hello.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.1
    4. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ JSPDemo
    5. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ hello.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŦāđ‰āļŠāđˆāļ‡āļœāđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļēāļ‡ URL āđ€āļŠāđˆāļ™
        http://localhost:8080/JSPDemo/hello.jsp?name=Thanisa āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļāļēāļĢāļĢāļąāļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.1




                                                                                 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
90

Listing āļ—āļĩāđˆ 12.1 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Demo</title>
    </head>
    <body>
       <h1>JSP Demo</h1>
        <% String name = request.getParameter("name"); %>
        <% for (int i = 0; i < 10; i++) { %>
        Hello <%= name %> <br>
        <% } %>
    </body>
</html>




Thanachart Numnonda and Thanisa Kruawaisayawan
91




āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
92




Thanachart Numnonda and Thanisa Kruawaisayawan
93




āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
94




                                        āļĢāļđāļ›āļ—āļĩāđˆ 12.1 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp




Thanachart Numnonda and Thanisa Kruawaisayawan
95


12.2    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp
         āđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđāļ•āđˆāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
JSP Standard Tag Library āđƒāļ™āļāļēāļĢāļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxx āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđāļ—āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ„āļģāļŠāļąāđˆāļ‡ scriptlet āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°
āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.2 āđāļĨāļ°āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
   1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āđ€āļĨāļ·āļ­āļ New → JSP File
        āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ helloJSTL āđāļĨāđ‰āļ§āļāļ” Finish
   2.   āļ•āļĢāļ§āļˆāļŠāļ­āļš JSTL Libraries āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ‡āļēāļ™ āļ–āđ‰āļēāđ„āļĄāđˆāļĄāļĩāđƒāļŦāđ‰āļ—āļģāļāļēāļĢ import āđ€āļ‚āđ‰āļēāļĄāļē
        āļ•āļēāļĄāļŦāļąāļ§āļ‚āđ‰āļ­ 2. āđ€āļžāļīāđˆāļĄ JSTL Library āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ JSP āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ (āļŦāļ™āđ‰āļēāļ—āļĩāđˆ 66)




                                        āļĢāļđāļ›āļ—āļĩāđˆ 12.2 āļ•āļĢāļ§āļˆāļŠāļ­āļš Library āļ‚āļ­āļ‡ JSTL

   3.   āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloJSTL.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.2
   4.   āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ
        āđ‚āļ”āļĒāļāļģāļŦāļ™āļ” URL āđ€āļ›āđ‡āļ™ http://localhost:8080/JSPDemo/helloJSTL.jsp?name=Thanisa
        āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp
Listing āļ—āļĩāđˆ 12.2 āđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
    <head>
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
         <title>JSP Demo</title>
    </head>
    <body>
    <h1>JSP Demo</h1>
    <c:forEach begin="1" end="10">
       Hello ${param.name} <br>
    </c:forEach>
    </body>
</html>



                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
96


12.3      āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp
          JSP 2.0 āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļĢāļēāļŠāļĢāđ‰āļēāļ‡ custom tag āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļŸāļĨāđŒ html āļŦāļĢāļ·āļ­ JSP āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē
āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļžāļąāļ’āļ™āļē āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ custom tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­
NameTagFile āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ tag file āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰

12.3.1    āļŠāļĢāđ‰āļēāļ‡ Tag File
          āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Tag āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
     1.   āļŠāļĢāđ‰āļēāļ‡ Folder āļŠāļ·āđˆāļ­ tags āļ āļēāļĒāđƒāļ•āđ‰ WebContentWEB-INF
     2.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Folder tags āļāļģāļŦāļ™āļ” File Name āđ€āļ›āđ‡āļ™ NameTagFile āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.3




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 12.3 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Tag File




Thanachart Numnonda and Thanisa Kruawaisayawan
97

   3.    āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđƒāļŦāđ‰ implement source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ   12.3


Listing āļ—āļĩāđˆ 12.3 āđ‚āļ›āļĢāđāļāļĢāļĄ NameTagFile.tag

         <%@tag description="Tag Name" pageEncoding="UTF-8"%>
         <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
            <c:forEach begin="1" end="10">
               Hello ${param.name} <br>
            </c:forEach>


12.3.2    āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp
         āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTagFile āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
   1.    āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File
   2.    āļāļģāļŦāļ™āļ” File Name = helloTagFile āđāļĨāđ‰āļ§āļāļ” Finish
   3.    āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloTagFile.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.4
   4.    āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ
         āđ‚āļ”āļĒāļāļģāļŦāļ™āļ” URL āđ€āļ›āđ‡āļ™ http://localhost:8080/JSPDemo/helloTagFile.jsp?name=Thanisa
         āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp
Listing āļ—āļĩāđˆ 12.4 āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib tagdir="/WEB-INF/tags" prefix="myTags" %>
<!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>JSP Demo</title>
    </head>
    <body>
    <h1>JSP Demo</h1>
        <myTags:NameTagFile />
    </body>
</html>



12.4     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp
      āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđāļ•āđˆāļāļēāļĢāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTagHandler āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tag āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄ 3 āļŠāđˆāļ§āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰
   â€Ē  āļŠāļĢāđ‰āļēāļ‡ Java Class Tag Handler [NameTagHandler.java] āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļĄāļ·āđˆāļ­ Custom Tag āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
   â€Ē  āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor [MyTags.tld] āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļ˜āļīāļšāļēāļĒ aribut āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ element āļ‚āļ­āļ‡ tag
      āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ element āđāļĨāļ° attribute → element aribut1=”A” /element
   â€Ē  āļŠāļĢāđ‰āļēāļ‡ JSP file [helloTag.jsp] āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Custom Tag āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 12.4


                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
98




                                   āļĢāļđāļ›āļ—āļĩāđˆ 12.4 Overview āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Custom Tag Files

12.4.1     āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Java ClassTag Handler
          āđ„āļŸāļĨāđŒ Tag Handler āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ§āļēāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļē āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ tag āđāļĨāđ‰āļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āđ„āļĢ
āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Tag āđ€āļ›āđ‡āļ™ NameTag āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ§āļēāđ€āļ›āđ‡āļ™ NameTagHandler āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē
āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ name āđāļĨāļ°āļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Tag Handler āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
   1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Class
          āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ tags , Class Name āđ€āļ›āđ‡āļ™ NameTagHandler
          āđ€āļĨāļ·āļ­āļ SuperClass āđ€āļ›āđ‡āļ™ SimpleTagSupport




Thanachart Numnonda and Thanisa Kruawaisayawan
99




āļĢāļđāļ›āļ—āļĩāđˆ 12.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Java Tag Handler Class




                                              āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
100

    2.   āļ—āļģāļāļēāļĢ Implement Method āļŠāļ·āđˆāļ­ doTag( )
         āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āļ‚āļ­āļ‡ source code
         āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source  Override/Implement Methods ... āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ˜āļ­āļ” doTag() āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.6
         āđāļĨāļ° āļŠāļĢāđ‰āļēāļ‡ method āļ›āļĢāļ°āđ€āļ āļ— setter āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­ setName( )




                          āļĢāļđāļ›āļ—āļĩāđˆ 12.6 āļāļēāļĢ Implement method āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ Custom Tag
    3.   āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āļˆāļ°āđāļŠāļ”āļ‡āđ„āļŸāļĨāđŒ NameTagHandler.java āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.5
Listing āļ—āļĩāđˆ 12.5 āđ‚āļ›āļĢāđāļāļĢāļĄ NameTagHandler.java
package tags;

import java.io.IOException;

import    javax.servlet.jsp.JspException;
import    javax.servlet.jsp.JspWriter;
import    javax.servlet.jsp.tagext.JspFragment;
import    javax.servlet.jsp.tagext.SimpleTagSupport;

public class NameTagHandler extends SimpleTagSupport {

         String name;
         public void setName(String name) {
                this.name = name;
         }

         @Override
         public void doTag() throws JspException, IOException {
                super.doTag();
                JspWriter out = getJspContext().getOut();

                   try {
                      JspFragment f = getJspBody();


Thanachart Numnonda and Thanisa Kruawaisayawan
101

                    if (f != null) f.invoke(out);

                  for (int i = 0; i  10; i++) {
                      out.println(Hello  + name + br);
                  }
          } catch (java.io.IOException ex) {
              throw new JspException(Error in NameTagHandler tag, ex);
          }
     }
}



12.4.2    āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor
        āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđ€āļāđ‡āļš āļĢāļēāļĒāļŠāļ·āđˆāļ­ Tag āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āļ™āļģ tag āļ•āđˆāļēāļ‡āđ† āļĄāļēāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP
āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ %@taglib ...%
         āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āđ€āļĨāļ·āļ­āļ New → Folder
         āđ€āļĨāļ·āļ­āļ JSPDemo → WebContent → WEB-INF āđāļĨāđ‰āļ§ āļāļģāļŦāļ™āļ” Folder name = tlds




                             āļĢāļđāļ›āļ—āļĩāđˆ 12.7 āļŠāļĢāđ‰āļēāļ‡ Folder āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļš Tag Language Descriptor




                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
102


    2.   āđ€āļĨāļ·āļ­āļ Project JSPDemo → WebContent → WEB-INF → tlds
         āļ„āļĨāļīāļāļ‚āļ§āļēāļ—āļĩāđˆ Folder tlds āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → File
         āļāļģāļŦāļ™āļ” TLD Name = MyTag.tld ***āđƒāļŦāđ‰āđƒāļŠāđˆ āļ™āļēāļĄāļŠāļāļļāļĨ tld āļ”āđ‰āļ§āļĒ āđāļĨāđ‰āļ§ āļāļ” Finish




                                   āļĢāļđāļ›āļ—āļĩāđˆ 12.8 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ File Tag Library Descriptor

    3.   āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āļˆāļ°āđāļŠāļ”āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ MyTag.tld āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ WebContentWEB-INFtlds




Thanachart Numnonda and Thanisa Kruawaisayawan
103

   4. Implement code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.6


Listing āļ—āļĩāđˆ 12.6 āđ‚āļ›āļĢāđāļāļĢāļĄ MyTag.tld

?xml version=1.0 encoding=UTF-8?
taglib version=2.1 xmlns=http://java.sun.com/xml/ns/javaee
       xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
       xsi:schemaLocation=http://java.sun.com/xml/ns/javaee,
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd
       tlib-version1.0/tlib-version
       short-nameMyTags/short-name
       uri/WEB-INF/tlds/MyTag/uri
       tag
              nameNameTagHandler/name
              tag-classtags.NameTagHandler/tag-class
              body-contentscriptless/body-content
              attribute
                     namename/name
                     rtexprvaluetrue/rtexprvalue
                     typejava.lang.String/type
              /attribute
       /tag
/taglib


12.4.3    āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp
         āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTag āđ‚āļ”āļĒāļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.4 āđ‚āļ”āļĒāļāļēāļĢ
         āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
   1.    āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Other...
   2.    āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New File āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Categories āļ—āļĩāļŠāļ·āđˆāļ­ Web āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡ File Types āļ•āđˆāļēāļ‡āđ† āļ āļēāļĒāđƒāļ•āđ‰
         Category āļ™āļĩāđ‰ āđƒāļŦāđ‰āđ€āļĢāļēāđ€āļĨāļ·āļ­āļ JSP āđāļĨāđ‰āļ§āļāļ” Next
   3.    āļāļģāļŦāļ™āļ” JSP File Name: āđ€āļ›āđ‡āļ™ helloTag āđāļĨāđ‰āļ§āļāļ” Finish
   4.    āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloTag.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.7
   5.    āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp
Listing āļ—āļĩāđˆ 12.7 āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp

%@page contentType=text/html%
%@page pageEncoding=UTF-8%
%@taglib uri=/WEB-INF/tlds/MyTag prefix=test%

!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
titleJSP Demo/title
/head
body
       h1JSP Demo/h1
         test:NameTagHandler name=Thanisa /
/body
/html




                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
104

          Exercise 13 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
         āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
     1. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework
     2. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View]
     3. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model]
     4. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View]
     5. āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml


13.1     āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework
    1. Download Struts 2 Framework āļ—āļĩāđˆ http://archive.apache.org/dist/struts/binaries/struts-2.3.3-all.zip
    2.   āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ” File Zip āļ­āļ­āļāļĄāļē āļˆāļ°āđ€āļŦāđ‡āļ™ Folder āļŠāļ·āđˆāļ­ apps āļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩ war file āļŠāļ·āđˆāļ­ struts2-blank.war āđƒāļŦāđ‰
         āļ—āļģāļāļēāļĢ Extract āļ­āļ­āļāļĄāļēāđ„āļ§āđ‰āļ—āļĩāđˆ Temporary folder āđ€āļŠāđˆāļ™ D:temp āļāđˆāļ­āļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.1




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 13.1 āļāļēāļĢ Extract āđ„āļŸāļĨāđŒ Struts2-blank.war

    3.   āļ—āļģāļāļēāļĢ Import Template āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Eclipse āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄ Environment āļŠāļģāļŦāļĢāļąāļš Struts 2 Framework āđ‚āļ”āļĒāđƒāļŦāđ‰
         āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­ Web Project āđ€āļ›āđ‡āļ™ StrutsDBApp āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.2




Thanachart Numnonda and Thanisa Kruawaisayawan
105




                                            āļĢāļđāļ›āļ—āļĩāđˆ 13.2 āļāļēāļĢ import āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Eclipse

13.2   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View]
       āļŠāļĢāđ‰āļēāļ‡āđ€āļ§āđ‡āļšāđ€āļžāļˆāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆ āđ€āļ‚āđ‰āļēāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books āļ‹āļķāđˆāļ‡āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.3




                            āļĢāļđāļ›āļ—āļĩāđˆ 13.3 āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē JSP āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ
           1. File → New → JSP File āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ addBook.jsp
           2.   āđƒāļŠāđ‰āļāļēāļĢāļĨāļēāļāđāļ›āļ° Object āļĨāļ‡āđ„āļ›āļšāļ™āļŦāļ™āđ‰āļē Design view āđ€āļžāļ·āđˆāļ­āļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāđ€āļžāļˆ āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ
                Window → Show View → Palette āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.4




                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
106




                                          āļĢāļđāļ›āļ—āļĩāđˆ 13.4 Palette āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāđ€āļžāļˆ

              3.   āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Struts Tags āļˆāļ°āđ€āļŦāđ‡āļ™ Object āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ Drag and Drop āļĨāļ‡āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡
                   āļŦāļ™āđ‰āļēāđ€āļžāļˆāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.5 āđ‚āļ”āļĒāļĄāļĩāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ source āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 13.1




                                   āļĢāļđāļ›āļ—āļĩāđˆ 13.5 āļŠāļĢāđ‰āļēāļ‡ JSP Page āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ


Thanachart Numnonda and Thanisa Kruawaisayawan
107

Listing āļ—āļĩāđˆ 13.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp
%@taglib uri=/struts-tags prefix=s%
%@ page language=java contentType=text/html; charset=TIS-620
pageEncoding=TIS-620%
!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=ISO-8859-1
titleStruts2/title
/head
body
      s:labelADD A NEW BOOK/s:label
      s:form action=addBookAction method=POST
            tds:textfield name=isbn label=ISBN //td
            tds:textfield name=title label=TITLE//td
            tds:textfield name=author label=AUTHOR//td
            tds:textfield name=price label=PRICE//td
            tds:submit value=ADD //td
      /s:form
/body
/html

           4.   āđ€āļĄāļ·āđˆāļ­āļˆāļąāļ”āđāļ•āđˆāļ‡āļŦāļ™āđ‰āļē page āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ–āđ‰āļēāđƒāļ™āđ„āļŸāļĨāđŒ addBook.jsp āļĄāļĩ taglib āļ—āļĩāđˆāļĄāļĩ prefix=nested āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ
                āļĨāļšāļ­āļ­āļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļēāļ‡ Apache āđ„āļĄāđˆāļĄāļĩ URI āļ™āļĩāđ‰āđāļĨāđ‰āļ§ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.6




                                 āļĢāļđāļ›āļ—āļĩāđˆ 13.6 āļāļēāļĢāļĨāļš taglib āļ­āļ­āļāļˆāļēāļ addBook.jsp

           5.   āļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ context.xml āļ—āļĩāđˆāļĄāļĩ source āļ”āļąāļ‡ Listing āļ—āđˆāļĩāđˆ 13.2 āļˆāļēāļ Exercise 5 āļĄāļēāđ„āļ§āđ‰āđƒāļ™ Folder
                StrutsDBAppWebContentMETA-INF

Listing āļ—āļĩāđˆ 13.2 āđ‚āļ›āļĢāđāļāļĢāļĄ context.xml

?xml version=1.0 encoding=UTF-8?
Context
      Resource
            name=jdbc/test
            auth=Container
            driverClassName=com.mysql.jdbc.Driver
            type=javax.sql.DataSource
            url=jdbc:mysql://localhost:3306/test
            username=root
            password=root
      /Resource
/Context



                                                                                       āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
108

13.3    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model]
         AddBookAction.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāļĄāļĩāđ€āļĄāļ˜āļ­āļ”āļ›āļĢāļ°āđ€āļ āļ— getter āđāļĨāļ° setter āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē
āļœāđˆāļēāļ™āļ—āļēāļ‡ addBook.jsp āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.7 āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢ insert āļĨāļ‡āđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āļ āļēāļĒāđƒāļ™āđ€āļĄāļ˜āļ­āļ” execute




                                                                                            AddBookAction.java
                                                                                            [Model sourcecode]

                            āļĢāļđāļ›āļ—āļĩāđˆ 13.7 āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Struts2 tag āđāļĨāļ° AddBookAction

         āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
    1. File → New → Class
         āļāļģāļŦāļ™āļ” pagekage = model , name = AddBookAction
         āļāļģāļŦāļ™āļ” SuperClass = com.opensymphony.xwork2.ActionSupport āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.8




                                            āļĢāļđāļ›āļ—āļĩāđˆ 13.8 āļŠāļĢāđ‰āļēāļ‡ AddBookAction.java

Thanachart Numnonda and Thanisa Kruawaisayawan
109


2.   āđƒāļ™āļ„āļĨāļēāļŠ AddBookAction.java āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ isbn, title, author āđ‚āļ”āļĒāļĄāļĩāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™ String āđāļĨāļ°
     price āļ—āļĩāđˆāļĄāļĩāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™ float āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ map attribute āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AddBookAction.java āļāļąāļšāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡
     āđ„āļŸāļĨāđŒ addBook.jsp āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļĄāļ˜āļ­āļ”āļ›āļĢāļ°āđ€āļ āļ— Getters and Setters āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.9




                               āļĢāļđāļ›āļ—āļĩāđˆ 13.9 āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Generate Getters and Setters

3. Override āđ€āļĄāļ˜āļ­āļ” execute āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ source code
     āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source → Override/Implement Methods... āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāđ€āļĄāļ˜āļ­āļ” execute āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.10




                      āļĢāļđāļ›āļ—āļĩāđˆ 13.10 āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Override Method execute āļ‚āļ­āļ‡ ActionSupport

                                                                                 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
110


      4.   āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ Source code āđƒāļ™āđ€āļĄāļ˜āļ­āļ” execute() āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 13.2


Listing āļ—āļĩāđˆ 13.2 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java

package model;

import      java.sql.*;
import      javax.naming.InitialContext;
import      javax.sql.DataSource;
import      com.opensymphony.xwork2.ActionSupport;

public class AddBookAction extends ActionSupport {

           private String isbn, title, author;
           private float price;

           public String getIsbn() {
                 return isbn;
           }

           public void setIsbn(String isbn) {
                 this.isbn = isbn;
           }

           public String getTitle() {
                 return title;
           }

           public void setTitle(String title) {
                 this.title = title;
           }

           public String getAuthor() {
                 return author;
           }
           public void setAuthor(String author) {
                 this.author = author;
           }

           public float getPrice() {
                 return price;
           }

           public void setPrice(float price) {
                 this.price = price;
           }

           @Override
           public String execute() throws Exception {

                   InitialContext ctx = new InitialContext();
                   DataSource ds = (DataSource)ctx.lookup(java:comp/env/jdbc/test);

                   Connection conn = ds.getConnection();
                   Statement stmt = conn.createStatement();
                   String sql = insert into books (isbn,title,author,price) values 
                               + (' + getIsbn() + ',' + getTitle()
                               + ',' + getAuthor() + ', + getPrice()
                               + );
                   System.out.println(Executed SQL =  + sql);
                   stmt.execute(sql);

                   return super.execute();


Thanachart Numnonda and Thanisa Kruawaisayawan
111

         }

}



13.4     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View]
         html
         headtitleResult Inserting Book/title/head
         body
               h3New Book record added!!!/h3
               bISBN: /bs:property value=isbn /br
               bTitle: /bs:property value=title /br
               bAuthor: /bs:property value=author /br
               bPrice: /bs:property value=price /br
         /body
         /html


13.5     āļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml
         āđ„āļŸāļĨāđŒ struts.xml āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Struts
             â€Ē    āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ /src/struts.xml āđāļĨāđ‰āļ§āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ action tag āļ”āļąāļ‡āļ™āļĩāđ‰
             action name=addBookAction class=model.AddBookAction
                 result name=successsuccess.jsp/result
                 result name=errorerror.jsp/result
             /action

         *struts2-blank.war āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒ page error.jsp āļĄāļēāđƒāļŦāđ‰āđāļĨāđ‰āļ§


13.6     āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
    1.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Restart Tomcat
    2.   Run āđ‚āļ›āļĢāđāļāļĢāļĄ StrutDBApp āļŦāļĢāļ·āļ­āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ file āđ€āļĨāļ·āļ­āļ Run → Run As Server
    3.   āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­ http://localhost:8080/StrutDBApp/addBook.jsp āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ
    4.   āđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Database
    5.   āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰ āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ Tool āļ‚āļ­āļ‡ MySQL āļŠāļ·āđˆāļ­ MySQL Workbench
         āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.11




                                                                                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
112

                           āļĢāļđāļ›āļ—āļĩāđˆ 13.11 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table Books




Thanachart Numnonda and Thanisa Kruawaisayawan
113

          Exercise 14 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
        āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ SpringMVC Framework
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
     1. āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework
     2. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller
     3. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP
     4. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml
     5. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml
     6. āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ


14.1    āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework
   1.   āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Dynamic Web Project āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ File → New → Dynamic Web Project
   2.   āļāļģāļŦāļ™āļ” Project Name: āđ€āļ›āđ‡āļ™ HelloWebSpring āđ€āļĨāļ·āļ­āļ Dynamic web module version āđ€āļ›āđ‡āļ™ 3.0 āđāļĨāļ°āļŦāļ™āđ‰āļē
        Web Module āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Generate web.xml deployment descriptor āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ āđāļĨāđ‰āļ§āļāļ” Finish




                                  āļĢāļđāļ›āļ—āļĩāđˆ 14.1 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļŠāļĢāđ‰āļēāļ‡ web.xml
   3.   āļ—āļģāļāļēāļĢ Download Spring Library āļˆāļēāļāđ€āļ§āđ‡āļš http://www.springsource.org/spring-community-download

                                                                            āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
114

           āđāļĨāđ‰āļ§ unzip āđ„āļŸāļĨāđŒ
      4.   āļāđ‡āļ­āļšāļ›āļĩāđ‰āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™ Spring Libraries āļĨāļ‡āđƒāļ™ folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebCentent  WEB-INF  lib


14.2       āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller
      āđ„āļŸāļĨāđŒ Controller āđƒāļ™ Spring MVC Framework āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ§āđˆāļē           RequestMapping āļ‚āļ­āļ‡ url āđ‚āļ”āļĒāļĄāļĩ
      āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
      1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ HelloWebSpring āđ€āļĨāļ·āļ­āļ New  Class
      2.   āļāļģāļŦāļ™āļ”āļ„āđˆāļē Package āđ€āļ›āđ‡āļ™ web.controller āđāļĨāļ° Name: āđ€āļ›āđ‡āļ™ MainController
      3.   āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.1

Listing āļ—āļĩāđˆ 14.1 āđ‚āļ›āļĢāđāļāļĢāļĄ MainController.java

package web.controller;

import         org.springframework.stereotype.Controller;
import         org.springframework.ui.ModelMap;
import         org.springframework.web.bind.annotation.RequestMapping;
import         org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(/welcome)
public class MainController {

           @RequestMapping(method = RequestMethod.GET)
           public String printWelcome(ModelMap model) {

                   model.addAttribute(message, Spring 3 MVC Hello World);
                   return hello;

           }

}


14.3       āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP
       āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļœāļĨ āļ—āļĩāđˆāļ—āļēāļ‡ Spring āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļˆāļēāļāļāļēāļĢ            return āļ‚āļ­āļ‡
RequestMapping āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰

      1.   āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Folder āļŠāļ·āđˆāļ­ pages āļ āļēāļĒāđƒāļ•āđ‰ Folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebContent  WEB-INF
      2.   āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ hello.jsp āļ—āļĩāđˆ folder āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  JSP File
      3.   āļāļģāļŦāļ™āļ” File Name āđ€āļ›āđ‡āļ™ hello.jsp āđāļĨāđ‰āļ§āļāļ” Finish
      4.   āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.2




Thanachart Numnonda and Thanisa Kruawaisayawan
115

Listing āļ—āļĩāđˆ 14.2 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp

html
body
      h1Message : ${message}/h1
/body
/html


14.4     āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml
       āđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml āļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ configuration āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļēāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ­āļĒāļđāđˆāļ—āļĩāđˆāđƒāļ” āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ
āļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āđ€āļĨāļ·āļ­āļāđ‚āļŦāļ™āļ” WebContent  WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Other... XML File
    2.   āļāļģāļŦāļ™āļ”āļ„āđˆāļē File Name: āđ€āļ›āđ‡āļ™ mvc-dispatcher-servlet.xml
    3.   āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.3

Listing āļ—āļĩāđˆ 14.3 āđ‚āļ›āļĢāđāļāļĢāļĄ mvc-dispatcher-servlet.xml

beans xmlns=http://www.springframework.org/schema/beans
      xmlns:context=http://www.springframework.org/schema/context
      xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:schemaLocation=
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd

         context:component-scan base-package=web.controller /

         bean

         class=org.springframework.web.servlet.view.InternalResourceViewResolver
               property name=prefix
                     value/WEB-INF/pages//value
               /property
               property name=suffix
                     value.jsp/value
               /property
         /bean

/beans


14.5     āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml
         āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡Listing āļ—āļĩāđˆ 14.4
Listing āļ—āļĩāđˆ 14.4 āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml

web-app id=WebApp_ID 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


                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
116

           http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd

           display-nameSpring MVC Application/display-name

           servlet
                 servlet-namemvc-dispatcher/servlet-name
                 servlet-class
                             org.springframework.web.servlet.DispatcherServlet
                      /servlet-class
                 load-on-startup1/load-on-startup
           /servlet

           servlet-mapping
                 servlet-namemvc-dispatcher/servlet-name
                 url-pattern//url-pattern
           /servlet-mapping

           context-param
                 param-namecontextConfigLocation/param-name
                 param-value/WEB-INF/mvc-dispatcher-servlet.xml/param-value
           /context-param

           listener
                 listener-class
                            org.springframework.web.context.ContextLoaderListener
                      /listener-class
           /listener

/web-app




14.6       āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ
      1.   āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ
      2.   āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ url āļŠāļ·āđˆāļ­     http://localhost:8080/HelloWebSpring/welcome āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ› 14.2




                                             āļĢāļđāļ›āļ—āļĩāđˆ 14.2 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ

14.7       āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
           Spring MVC āđ€āļ›āđ‡āļ™ Framework āļ—āļĩāđˆāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™       Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ


Thanachart Numnonda and Thanisa Kruawaisayawan
117

āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰
     â€Ē    āļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book.java āļ āļēāļĒāđƒāļ•āđ‰ package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ model āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ Book
     â€Ē    āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MainController āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩ RequestMapping āļ—āļĩāđˆāļŠāļ·āđˆāļ­ /addbook āđāļĨāļ° /showbooks
     â€Ē    āļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ BookService.java āļ āļēāļĒāđƒāļ•āđ‰ package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ web.controller āļ—āļĩāđˆāļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļŠāļ™āļīāļ”
          Service āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ DataSource
     â€Ē    āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ mvn-dispatcher-servlet.xml āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđāļ—āđ‡āļ„ Bean āļŠāļ­āļ‡āļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļš id āļ—āļĩāđˆāļŠāļ·āđˆāļ­ dataSource
          āđāļĨāļ° bookService
     â€Ē    āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ addedpage.jsp āđāļĨāļ° bookpages.jsp āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ pages āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨ
          āđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰   source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰


Listing āļ—āļĩāđˆ 14.5 āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java

package model;

public class Book {
      private String isbn;
      private String title;
      private String author;
      private float price;
      public String getIsbn() {
            return isbn;
      }
      public void setIsbn(String isbn) {
            this.isbn = isbn;
      }
      public String getTitle() {
            return title;
      }
      public void setTitle(String title) {
            this.title = title;
      }
      public String getAuthor() {
            return author;
      }
      public void setAuthor(String author) {
            this.author = author;
      }
      public float getPrice() {
            return price;
      }
      public void setPrice(float price) {
            this.price = price;
      }
}


Listing āļ—āļĩāđˆ 14.6 āđ‚āļ›āļĢāđāļāļĢāļĄ MainController.java āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļ‡āđƒāļŦāļĄāđˆ

package web.controller;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;


                                                                                    āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
118

import        org.springframework.ui.Model;
import        org.springframework.ui.ModelMap;
import        org.springframework.web.bind.annotation.RequestMapping;
import        org.springframework.web.bind.annotation.RequestMethod;
import        org.springframework.web.bind.annotation.RequestParam;

import model.Book;

import web.controller.BookService;

@Controller
public class MainController {
      @RequestMapping(value = /welcome, method = RequestMethod.GET)
      public String printWelcome(ModelMap model) {
            model.addAttribute(message, Spring 3 MVC Hello World);
            return hello;
      }



          @Resource(name = bookService)
          private BookService bookService;

         @RequestMapping(value = /addbook, method = RequestMethod.GET)
       public String add(
         @RequestParam(value=isbn, required=true) String isbn,
         @RequestParam(value=title, required=true) String title,
         @RequestParam(value=author, required=true) String author,
         @RequestParam(value=price, required=true) Float price) {

           bookService.add(isbn, title, author, price);
           return addedpage;
      }

          @RequestMapping(value = /showbooks, method = RequestMethod.GET)
          public String showBooks(Model model) {

                   ListBook bks = bookService.getAll();
                   model.addAttribute(books, bks);
                   return bookpages;
          }

}

Listing āļ—āļĩāđˆ 14.7 āđ‚āļ›āļĢāđāļāļĢāļĄ BookService.java

package web.controller;

import        java.sql.Connection;
import        java.sql.ResultSet;
import        java.sql.SQLException;
import        java.sql.Statement;
import        java.util.ArrayList;
import        java.util.HashMap;
import        java.util.List;
import        java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import        org.springframework.jdbc.core.RowMapper;
import        org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import        org.springframework.stereotype.Service;
import        org.springframework.transaction.annotation.Transactional;

import model.Book;

@Service(bookService)
@Transactional


Thanachart Numnonda and Thanisa Kruawaisayawan
119

public class BookService {

        private DataSource dataSource;

        @Resource(name = dataSource)
        public void setDataSource(DataSource dataSource) {
              this.dataSource = dataSource;;
        }

        public ListBook getAll() {

                // Prepare our SQL statement
                ListBook books = new ArrayListBook();
                String sql = select * from books;
                Connection conn = null;
                try {
                      conn = dataSource.getConnection();
                      Statement stmt = conn.createStatement();
                      ResultSet rs = stmt.executeQuery(sql);
                      while (rs.next()) {
                            Book bk = new Book();
                            bk.setIsbn(rs.getString(isbn));
                            bk.setAuthor(rs.getString(author));
                            bk.setTitle(rs.getString(title));
                            bk.setPrice(rs.getFloat(price));
                            books.add(bk);
                      }
                      stmt.close();
                } catch (SQLException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                }

                // Retrieve all
                return books;
        }

        public void add(String isbn, String title, String author, float price) {


                String sql = insert into books values  + (' + isbn + ',' +
title
                            + ',' + author + ', + price + );
                Connection conn = null;
                try {
                      conn = dataSource.getConnection();
                      Statement stmt = conn.createStatement();
                      stmt.executeUpdate(sql);
                      stmt.close();
                } catch (SQLException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                }

        }
}

Listing āļ—āļĩāđˆ 14.8 āđ‚āļ›āļĢāđāļāļĢāļĄ mvc-dispatcher-servlet.xml āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡

beans xmlns=http://www.springframework.org/schema/beans
      xmlns:context=http://www.springframework.org/schema/context
      xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:schemaLocation=
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd

        â€Ķ


                                                                        āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
120

bean id=dataSource
   class=org.springframework.jdbc.datasource.DriverManagerDataSource 
   property name=driverClassName value=com.mysql.jdbc.Driver /
   property name=url value=jdbc:mysql://localhost:3306/test /
   property name=username value=root /
   property name=password value=root /
/bean

 bean id=bookService class=web.controller.BookService 
    property name=dataSource  ref bean=dataSource /
    /property
 /bean

/beans

Listing āļ—āļĩāđˆ 14.9 āđ‚āļ›āļĢāđāļāļĢāļĄ addedpage.jsp

%@ page language=java contentType=text/html; charset=ISO-8859-1
    pageEncoding=ISO-8859-1%
!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=ISO-8859-1
titleAdd Data/title
/head
body
 Added Book successfully..
/body
/html

Listing āļ—āļĩāđˆ 14.10 āđ‚āļ›āļĢāđāļāļĢāļĄ bookpages.jsp

%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c %
%@ 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
titleAll Books/title
/head
body

c:forEach items=${books} var=bk
 ${bk.title} ${bk.author} br
/c:forEach
/body
/html

         āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™   Books āđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
                   http://localhost:8080/HelloWebSpring/addbook?isbn=134title=SpringMVC
         author=Thanaprice=400.0

         āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™    Books   āđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
                   http://localhost:8080/HelloWebSpring/showbooks




Thanachart Numnonda and Thanisa Kruawaisayawan
121


                 Exercise 15 āļāļēāļĢ Authentication āđ‚āļ”āļĒāđƒāļŠāđ‰ Tomcat
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™   -

       āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ—āļģ Authentication āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē configuration āļ‚āļ­āļ‡
Tomcat Web Server āđ‚āļ”āļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ Basic Configuration āđāļĨāļ° Form Based Configuration
āđāļĨāļ° āļˆāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™ realm āļ‚āļ­āļ‡ Tomcat āļˆāļēāļāđ„āļŸāļĨāđŒ tomcat-users.xml āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰ MySQL Database
15.1     āļŠāļĢāđ‰āļēāļ‡ Web Application Project
    1.   āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project
         āļāļģāļŦāļ™āļ” Project Name = SecurityWebApp
    2.   āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ admin.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.1
    3.   āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ user.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.2
Listing āļ—āļĩāđˆ 15.1 āđ‚āļ›āļĢāđāļāļĢāļĄ admin.html

         html
           head
             titleADMIN/title
           /head
           body
           h1Admin Page/h1
           /body
         /html


Listing āļ—āļĩāđˆ 15.2 āđ‚āļ›āļĢāđāļāļĢāļĄ user.html

         html
           head
             titleUSER/title
           /head
           body
           h1User Page/h1
           /body
         /html


15.2     āđ€āļžāļīāđˆāļĄ User āļ‚āļ­āļ‡   Tomcat Web Server

       āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› Tomcat-Web-Server āļˆāļ°āđƒāļŠāđ‰ Realm āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Flat File āđ‚āļ”āļĒāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ File āļ—āļĩāđˆāļŠāļ·āđˆāļ­ tomcat-users.xml āļ‚āļąāđ‰āļ™
āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄ User āđ‚āļ”āļĒāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰




                                                                                      āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
122


    1.   āđƒāļ™ Project Explorer āđƒāļŦāđ‰āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ Servers  Tomcat  tomcat-users.xml
         āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 15.1 āđāļĨāļ°āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄ user password āļĨāļ‡āđ„āļ›āđƒāļ™ Tomcat Server
         āļ”āļąāļ‡āđƒāļ™ Listing āļ—āļĩāđˆ 15.3




                                   āļĢāļđāļ›āļ—āļĩāđˆ 15.1 āđ€āļžāļīāđˆāļĄ user āđāļĨāļ° roles āļ—āļĩāđˆ Apache Tomcat

Listing āļ—āļĩāđˆ 15.3 āđ„āļŸāļĨāđŒ tomcat-users.xml

         .......
         role rolename=admin/
         role rolename=user/
         user username=admin password=admin roles=admin /
         user username=tomcat password=tomcat roles=admin /
         user username=user password=user roles=user /
         .......


    2. Restart Tomcat āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™ config āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļĢāļēāđāļāđ‰āđ€āļ‚āđ‰āļēāđ„āļ›
         āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ tab Server → āļ„āļĨāļīāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ restart
15.3     āļāļēāļĢ Config āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Web Application āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ Tomcat user
         āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ—āļģ Authenticate āđāļĨāļ° Authorization āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļē URL āđƒāļ”āđ†āļ‚āļ­āļ‡ Web
Application āđāļĨāļ°āļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāđ‚āļ”āļĒāļ­āļīāļ‡āļāļąāļš role (Role Based Authorization)āđ‚āļ”āļĒ config āđ„āļŸāļĨāđŒ web-xml
āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ role āđ€āļ›āđ‡āļ™ admin āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļŸāļĨāđŒ admin.html āđāļĨāļ° user.html āđ„āļ”āđ‰
āļŠāđˆāļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ role āđ€āļ›āđ‡āļ™ user āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļ‰āļžāļēāļ°āđ„āļŸāļĨāđŒ user.html āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ Configuration
    1.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Deployment Descriptor: SecurityWebApp āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp
    2.   āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ Generate Deployment Descriptor Stub āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.2

                                                 āļĢāļđāļ›āļ—āļĩāđˆ 15.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ web.xml
Thanachart Numnonda and Thanisa Kruawaisayawan
123



    3.   āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Project āļ—āļĩāđˆāļŠāļ·āđˆāļ­ SecurityWebApp
         āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” āđ€āļžāļ·āđˆāļ­āļšāļ­āļāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļēāļĢ authen āđāļšāļš Basic
                 login-config
                        auth-methodBASIC/auth-method
                 /login-config


    4.   āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” āļĢāļ°āļšāļļ Security Roles = 2 roles āļ„āļ·āļ­ user āđāļĨāļ° admin
                 security-role
                        role-nameadmin/role-name
                 /security-role
                 security-role
                        role-nameuser/role-name
                 /security-role


    5.   āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Web page āļ‚āļ­āļ‡ Project āļāļąāļš User āļšāļ™ Tomcat
         @@ āļāļĢāļ“āļĩāļŦāļ™āđ‰āļē admin.html āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāļœāļđāđ‰āļĄāļĩ role āđ€āļ›āđ‡āļ™ admin āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™

                 āļāļģāļŦāļ™āļ”URL Pattern āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļģāļāļąāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ›āđ‡āļ™ /admin.html
                 āļāļģāļŦāļ™āļ” Name āđ€āļ›āđ‡āļ™ Admin Page
                 āļāļģāļŦāļ™āļ” āļœāļđāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ URL āļ™āļĩāđ‰āđ„āļ”āđ‰ āļ„āļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Roles = admin āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
                          security-constraint
                                 web-resource-collection
                                        url-pattern/admin.html/url-pattern
                                        web-resource-nameAdmin Page/web-resource-name
                                 /web-resource-collection
                                 auth-constraint
                                        role-nameadmin/role-name
                                        /auth-constraint
                          /security-constraint


         @@ āļāļĢāļ“āļĩāļŦāļ™āđ‰āļē user.html āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāļœāļđāđ‰āļĄāļĩ role āđ€āļ›āđ‡āļ™ user āđāļĨāļ° admin

                 āļāļģāļŦāļ™āļ”URL Pattern āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļģāļāļąāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ›āđ‡āļ™ /user.html
                 āļāļģāļŦāļ™āļ” Name āđ€āļ›āđ‡āļ™ User Page
                 āļāļģāļŦāļ™āļ” āļœāļđāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ URL āļ™āļĩāđ‰āđ„āļ”āđ‰ āļ„āļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Roles = admin
                          security-constraint
                                 web-resource-collection
                                        url-pattern/user.html/url-pattern
                                        web-resource-nameUser Page/web-resource-name
                                 /web-resource-collection
                                 auth-constraint
                                        role-nameuser/role-name
                                        role-nameadmin/role-name
                                 /auth-constraint
                          /security-constraint


    6.   āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.4

Listing āļ—āļĩāđˆ 15.4 āđ„āļŸāļĨāđŒ web.xml

                                                                                      āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
124

         .......
         login-config
                auth-methodBASIC/auth-method
         /login-config

         security-role
            role-nameadmin/role-name
                /security-role
                security-role
            role-nameuser/role-name
         /security-role

         security-constraint
                web-resource-collection
                       web-resource-nameAdmin Page/web-resource-name
                       url-pattern/admin.html/url-pattern
                /web-resource-collection
                auth-constraint
                       role-nameadmin/role-name
                /auth-constraint
         /security-constraint

         security-constraint
                web-resource-collection
                       web-resource-nameUser Page/web-resource-name
                       url-pattern/user.html/url-pattern
                /web-resource-collection
                auth-constraint
                       role-nameuser/role-name
                       role-nameadmin/role-name
                /auth-constraint
         /security-constraint
         .......



15.4     āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Basic Authenticate
    1.   āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp
    2.   āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ http://localhost:8080/SecurityWebApp/admin.html āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Browser āļˆāļ°āđāļŠāļ”āļ‡
         āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļāļĨāđ‡āļ­āļāļ­āļīāļ™āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.3




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 15.3 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļĨāđ‡āļ­āļāļ­āļīāļ™

    3.   āđƒāļŦāđ‰āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđ€āļ›āđ‡āļ™ admin āđāļĨāļ° admin āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļš
         admin.html āđ„āļ”āđ‰
    4.   āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Browser āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđ€āļ›āđ‡āļ™ user āđāļĨāļ° user
         āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ™āļĩāđ‰āđ„āļ”āđ‰

Thanachart Numnonda and Thanisa Kruawaisayawan
125

    5.   āļ—āļ”āļĨāļ­āļ‡āļ—āļģāļ‹āđ‰āļģāļāļąāļš URL āļŠāļ·āđˆāļ­     http://localhost:8080/SecurityWebApp/user.html āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē url āļ™āļĩāđ‰āļˆāļ°āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰
         user āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđƒāļŠāđ‰āđ„āļ”āđ‰

15.5     āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰ Login Form
        āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp āđƒāļŦāđ‰āļĄāļĩāļ—āļģāļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ Form āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāđƒāļŠāđ‰
āđ„āļŸāļĨāđŒ Login.html āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĨāđ‡āļ­āļāļ­āļīāļ™āđ„āļ”āđ‰ āđƒāļŦāđ‰āļŠāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ—āļĩāđˆ Error.html āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
    1. āļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē page āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ login āļŠāļ·āđˆāļ­ login.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.4
    2. āļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē error.html āđ€āļĄāļ·āđˆāļ­āļāļĢāļ“āļĩāļ›āđ‰āļ­āļ™ username āļŦāļĢāļ·āļ­ password āđ„āļĄāđˆāļ–āļđāļ āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.5
    3. āđāļāđ‰āđ„āļ‚ web.xml āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļĢāļđāļ›āđāļšāļšāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Form āđ‚āļ”āļĒāđƒāļŠāđ‰āļŦāļ™āđ‰āļē Form āļ„āļ·āļ­ login.html āļĢāļąāļšāļ„āđˆāļē username
        āđāļĨāļ° password āđ‚āļ”āļĒāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļˆāļēāļ
         login-config
         auth-methodBASIC/auth-method
         /login-config
         āđ€āļ›āđ‡āļ™āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.7
Listing āļ—āļĩāđˆ 15.5 āđ‚āļ›āļĢāđāļāļĢāļĄ login.html
html
head
title/title
meta http-equiv=Content-Type content=text/html; charset=UTF-8
/head
body
       H1Login Form : Sample/H1

       FORM ACTION=j_security_check METHOD=POST
              User name :
              INPUT TYPE=TEXT NAME=j_username / br
              Password :
              INPUT TYPE=PASSWORD NAME=j_password / br
              input type=submit value=Login /
       /FORM
/body
/html


Listing āļ—āļĩāđˆ 15.6 āđ‚āļ›āļĢāđāļāļĢāļĄ error.html

html
headtitleERROR/title/head
body
H1Error unauthorized user/H1
/body
/html


Listingāļ—āļĩāđˆ 15.7 āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml

         .......
         login-config
                auth-methodFORM/auth-method
                realm-nameAdminApplication/realm-name
                form-login-config
                       form-login-page/login.html/form-login-page
                       form-error-page/error.html/form-error-page
                /form-login-config
         /login-config
         .......


                                                                                     āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
126


15.6     āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Form Authenticate
         āđƒāļŠāđ‰āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Basic Authenticate āđāļ•āđˆāļŦāļ™āđ‰āļē login āļˆāļ°āđ€āļ›āđ‡āļ™ login.html āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.4




                                                 āļĢāļđāļ›āļ—āļĩāđˆ 15.4 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļĨāđ‡āļ­āļāļ­āļīāļ™

15.7     āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ Authenticate āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļˆāļēāļ Database MySQL
        āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļ Realm āļ‚āļ­āļ‡ Tomcat Web Server āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ­āļ·āđˆāļ™āđ† āđ„āļ”āđ‰āļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āđ„āļŸāļĨāđŒ
āđ€āļŠāđˆāļ™āļāļēāļĢāđƒāļŠāđ‰ Database āļŦāļĢāļ·āļ­ Directory Server āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ—āļ”āļĨāļ­āļ‡āļāļģāļŦāļ™āļ” Realm āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ MySQL
āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āļŠāļļāļ”āļ„āļ·āļ­ users āđāļĨāļ° userrole āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ table āļ‚āļķāđ‰āļ™āļĄāļē 2 tables
         āđ‚āļ”āļĒāđƒāļŠāđ‰ Tool āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Wizard āļŦāļĢāļ·āļ­ SQL Statement āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ table āļ”āļąāļ‡āļ™āļĩāđ‰
         create table users (
            user_name varchar(45) not null primary key,
            pass_word varchar(45) not null
         );

         create table userrole (
            user_name varchar(45) not null,
            role_name varchar(45) not null,
            primary key (user_name, role_name)
         );



         āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” Icon Execute SQL scripts (āļĢāļđāļ›āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡) āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™ āļŦāļĢāļ·āļ­ Highlight āļ„āļģāļŠāļąāđˆāļ‡āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Ctrl +
         Enter
    2.   āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŠāđˆāļĨāļ‡āđƒāļ™ Table āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ” password āđāļĨāļ° role
    3.   āđƒāļ™ Project Explorer āđƒāļŦāđ‰āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ Servers  Tomcat  server.xml āļ‚āļ­āļ‡ Apache Tomcat
    4.   āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ sourcecode āļ”āļąāļ‡āļ™āļĩāđ‰
                 āļĨāļš
                   Realm className=org.apache.catalina.realm.UserDatabaseRealm
                          resourceName=UserDatabase/
                   āđ€āļžāļīāđˆāļĄ
                   Realm className=org.apache.catalina.realm.JDBCRealm debug=99
                          driverName=com.mysql.jdbc.Driver
                          connectionURL=jdbc:mysql://localhost/test
                          connectionName=root
                          connectionPassword=root
                          userTable=users userRoleTable=userrole
                          userNameCol=user_name userCredCol=pass_word
                          roleNameCol=role_name /




Thanachart Numnonda and Thanisa Kruawaisayawan
127

   5.   āļ—āļģāļāļēāļĢ Restart Tomcat āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™ config āļ—āļĩāđˆāđāļāđ‰āđ„āļ›
15.8    āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Database Authenticate
        āđƒāļŠāđ‰āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Form Authenticate




                                                            āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
128


                 Exercise 16 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App
                                    Engine

      āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļšāļ™ Google
App Engine āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰ Infrastructure āļ‚āļ­āļ‡ Google āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āļˆāļąāļ”āđ€āļ›āđ‡āļ™ Cloud
Computing āļ›āļĢāļ°āđ€āļ āļ— Platform as a Service (PaaS) āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļšāļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāļ—āļēāļ‡ Google āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰ āđ‚āļ”āļĒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļāļģāļŦāļ™āļ” API āđ„āļ§āđ‰āļŠāļ­āļ‡āļ āļēāļĐāļēāļ„āļ·āļ­ Java āđāļĨāļ° Python
      āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Eclipse 3.6 (Helios) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļš Google App Engine āđāļĨāļ°āđƒāļŠāđ‰
Google App Engine Plugin Module āļ‚āļ­āļ‡ Eclipse āļĄāļēāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ

16.1     āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine
         Google App Engine āđ€āļ›āđ‡āļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™
āļšāļ™ Google's Infrastructure āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ account āļ‚āļ­āļ‡ Google āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Google App
Engine SDK āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāđ„āļ”āđ‰āļ—āļĩāđˆ
http://code.google.com/appengine/ āđ‚āļ”āļĒāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāļĢāļļāļ›āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļē
Google App Engine āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰

    1.   āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ App Engine Account āđ‚āļ”āļĒāđƒāļŠāđ‰ Google Account āļ—āļĩāđˆ
       http://code.google.com/appengine/
    2. āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse 3.7
    3.   āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ Help  Install New Software...
    4.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ Plugins āđ€āļĨāļ·āļ­āļāđāļ—āļ› Setting āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Add
    5.   āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ Install āļˆāļ°āđāļŠāļ”āļ‡āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āļāļģāļŦāļ™āļ”āļ„āđˆāļē Work with: āđ€āļ›āđ‡āļ™
         http://dl.google.com/eclipse/plugin/3.7 āđāļĨāđ‰āļ§āļāļ” Enter āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļāļˆāļ°āđāļŠāļ”āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Plugin āđāļĨāļ°
         SDKs āļ•āđˆāļēāļ‡āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Next
    6.   āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Google App Engines āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļīāđ‰āļ™āļŠāļļāļ”āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ Restart āđ‚āļ›āļĢāđāļāļĢāļĄ
         Eclipse āđƒāļŦāļĄāđˆ
    7.   āļ—āļĩāđˆ Toolbar āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āļˆāļ°āļĄāļĩāļ›āļļāđˆāļĄāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āļ”āļąāļ‡āļ™āļĩāđ‰




Thanachart Numnonda and Thanisa Kruawaisayawan
129




                  āļĢāļđāļ›āļ—āļĩāđˆ 16.1 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Plugin āđāļĨāļ° SDK āļ‚āļ­āļ‡ Google App Engines

16.2    āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project
        āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ‚āļ›āļĢāđāļāļĄ Web Application āđ€āļžāļ·āđˆāļ­āļ—āļ”āļĨāļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡ Google's Infrastructure āđ‚āļ”āļĒāļāļēāļĢ
āļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
   1.   āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File = New = Other...
   2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New āđƒāļŦāđ‰āļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” Google āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Web Application Project āđāļĨāđ‰āļ§āļāļ” Next
   3.   āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ BookGAE āļāļģāļŦāļ™āļ”āļ„āđˆāļē Package āđ€āļ›āđ‡āļ™ com.imcinstitute āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ
        Project Location āđ€āļ›āđ‡āļ™ Director āļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ„āļ§āđ‰ āđāļĨāļ°āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļĨāļ·āļ­āļāļ„āđˆāļē Use Google Web
        Toolkit āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āđ„āļĄāđˆāđ„āļ”āđ‰āđƒāļŠāđ‰ GWT āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.1 āđāļĨāđ‰āļ§āļāļ” Next




                                                                              āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
130




                  āļĢāļđāļ›āļ—āļĩāđˆ 16.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē Web Application Project āļ‚āļ­āļ‡ Google Application

    4.   āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ MMJTDemoServlwt.java āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŦāļ™āļ” src  guestbook āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰
         āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello, World
    5.   āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļĨāļ­āļšāļ—āļĩāđˆāļˆāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” MMJTDemo āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡
         Project Explorer āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Run As  Web Application āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser
         āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ” url āđ€āļ›āđ‡āļ™ http://localhost:8888/mmjtdemo āđ‚āļ”āļĒāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.3




                               āļĢāļđāļ›āļ—āļĩāđˆ 16.3 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ localhost server


Thanachart Numnonda and Thanisa Kruawaisayawan
131

6.   āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ MMJTDemo āļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒāļˆāļąāļ”āļāļēāļĢ configuration āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ deploy āđ„āļ›āļĒāļąāļ‡ Google App Engine
     āļ—āļĩāđˆāļŠāļ·āđˆāļ­ appengine-web.xml āđ‚āļ”āļĒāđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŦāļ™āļ” war  WEB-INF āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ
     16.4




                              āļĢāļđāļ›āļ—āļĩāđˆ 16.4 āđ„āļŸāļĨāđŒ appengine-web.xml
7.   āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āļĨāļ‡āļšāļ™ Google App Engine āđ‚āļ”āļĒāļāļēāļĢāđ„āļ› sign up āđ€āļ‚āđ‰āļē account
     āļ‚āļ­āļ‡āđ€āļĢāļēāļ—āļĩāđˆ Google App Engine āļ—āļĩāđˆ https://telecommunication/ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Create an Application
8.   āļāļģāļŦāļ™āļ”āļ„āđˆāļē Application Identifier: āđ€āļ›āđ‡āļ™ thaijavaapp āđāļĨāļ° Application Title: āđ€āļ›āđ‡āļ™ Thai Java
     Google App āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.5 āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Save




                  āļĢāļđāļ›āļ—āļĩāđˆ 16.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Application āļŠāļģāļŦāļĢāļąāļš Google App Engine
9.   Google App Engine āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­ Application āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.6




                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
132




                      āļĢāļđāļ›āļ—āļĩāđˆ 16.6 āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ My Applications āđƒāļ™ Google App Engine
    10. āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ appengine-web.xml āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āļ„āđˆāļē application
        āđ€āļ›āđ‡āļ™ thaijavaapp
    11. āļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” MMJTDemo āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Google 
        Deploy to App Engine āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ–āļēāļĄ e-mail (username) āđāļĨāļ° password āļ‚āļ­āļ‡ Google App
        Engine āļ‚āļ­āļ‡āđ€āļĢāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 16.7




                                    āļĢāļđāļ›āļ—āļĩāđˆ 16.7 āļāļēāļĢ Deploy āđƒāļ™ Google App Engine
    12. āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ”āļĒāļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļŦāđ‰āļāļĨāļąāļšāļĄāļēāļ—āļĩāđˆ Browser āđ€āļžāļ·āđˆāļ­āđ„āļ›āļ—āļĩāđˆ https://appengine.google.com/ āļ‹āļķāđˆāļ‡āļˆāļ°
         āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.8 āđƒāļŦāđ‰āđ€āļĢāļēāļāļ”āļ—āļĩāđˆāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™(1) āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›
         āļ—āļĩāđˆ 16.9 āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ MMJTDemo āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.10




Thanachart Numnonda and Thanisa Kruawaisayawan
133




                   āļĢāļđāļ›āļ—āļĩāđˆ 16.8 āļĢāļēāļĒāļāļēāļĢāđāļŠāļ”āļ‡ current versions āļŠāļ­āļ‡ My Applications




                  āļĢāļđāļ›āļ—āļĩāđˆ 16.9 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ thaijavaapp āļšāļ™ Google App Engine




                 āļĢāļđāļ›āļ—āļĩāđˆ 16.10 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ MMJTDemo āļšāļ™ Google App Engine
16.3   āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine


                                                                         āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
134

       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āđ€āļ§āļĨāļēāļ›āļąāļˆāļˆāļļāļšāļąāļ™āđāļĨāđ‰āļ§āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļšāļ™ Google App
Engine āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰


    1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āđāļĨāđ‰āļ§āļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo src
    2.   āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” guestbook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Class
    3.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āđƒāļŦāđ‰ āļāļģāļŦāļ™āļ”āļ„āđˆāļē Name āđ€āļ›āđ‡āļ™ TimerServlet āļŠāđˆāļ§āļ™āļ„āđˆāļēāļ­āļ·āđˆāļ™āđ†āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ”āļīāļĄ
         āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāđ‰āļ§āļāļ” Finish
    4.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 16.1
    5.   āļ—āļģāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āđ‚āļ”āļĒāļāļēāļĢāļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo  war  WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ
         web.xml āđāļĨāļ°āđāļ—āļ› source āđāļĨāđ‰āļ§āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ tag āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰

         servlet
               servlet-nameTimer/servlet-name
               servlet-classguestbook.TimerServlet/servlet-class
         /servlet
         servlet-mapping
               servlet-nameTimer/servlet-name
               url-pattern/timer/url-pattern
         /servlet-mapping


    6.   āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļšāļ™ localhost āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ url āļŠāļ·āđˆāļ­ http://localhost:8888/timer
    7.   āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ
         http://thaijavaapp.appspot.com /timer āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.11




                  āļĢāļđāļ›āļ—āļĩāđˆ 16.11 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢ y āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet āļšāļ™ Google App Engine

Listing āļ—āļĩāđˆ 16.1 āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet.java

package guestbook;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;


Thanachart Numnonda and Thanisa Kruawaisayawan
135

import java.util.Date;
import java.util.SimpleTimeZone;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Administrator
 */
public class TimerServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      response.setContentType(text/html;charset=UTF-8);
      PrintWriter out = response.getWriter();
      SimpleDateFormat fmt = new SimpleDateFormat(yyyy-MM-dd hh:mm:ss.SSSSSS);
      fmt.setTimeZone(new SimpleTimeZone(0, ));
      out.println(html);
      out.println(head);
      out.println(titleServlet TimerServlet/title);
      out.println(/head);
      out.println(body);
      out.println(h1Servlet TimerServlet at  + request.getContextPath() + /h1);
      out.println(pThe time is:  + fmt.format(new Date()) + /p);
      out.println(/body);
      out.println(/html);

        out.close();
    }

}

16.4         āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account
             Google App Engine āļĄāļĩāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ API āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Application āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Google
āđ„āļ”āđ‰ āļĢāļ§āļĄāļ–āļķāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Google Account āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™ Google API āļ‚āļ­āļ‡āļ„āļĨāļēāļŠ User āđāļĨāļ°
UserService āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰

        1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” guestbook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Class
        2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āđƒāļŦāđ‰ āļāļģāļŦāļ™āļ”āļ„āđˆāļē Name āđ€āļ›āđ‡āļ™ GoogleTimerServlet āļŠāđˆāļ§āļ™āļ„āđˆāļēāļ­āļ·āđˆāļ™āđ†āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™
             āđ„āļ›āļ•āļēāļĄāđ€āļ”āļīāļĄāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāđ‰āļ§āļāļ” Finish
        3.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 16.2
        4.   āļ—āļģāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āđ‚āļ”āļĒāļāļēāļĢāļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo  war  WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ
             web.xml āđāļĨāļ°āđāļ—āļ› source āđāļĨāđ‰āļ§āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ tag āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰

             servlet
                   servlet-nameMMJTDemo/servlet-name
                   servlet-classguestbook.GoogleTimerServlet/servlet-class
             /servlet
             servlet-mapping
                   servlet-nameMMJTDemo/servlet-name
                   url-pattern/googletimer/url-pattern
             /servlet-mapping



                                                                                 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
136

    5. āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ
       http://thaijavaapp.appspot.com /googletimer āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.12 āđāļĨāļ° 16.2




              āļĢāļđāļ›āļ—āļĩāđˆ 16.12 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet āļšāļ™ Google App Engine




                     āļĢāļđāļ›āļ—āļĩāđˆ 16.13 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ—āļģ signin
Listing āļ—āļĩāđˆ 16.2 āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet.java

package guestbook;

import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.SimpleTimeZone;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class GoogleTimerServlet extends HttpServlet {



Thanachart Numnonda and Thanisa Kruawaisayawan
137

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      response.setContentType(text/html;charset=UTF-8);
      PrintWriter out = response.getWriter();
      SimpleDateFormat fmt = new SimpleDateFormat(yyyy-MM-dd hh:mm:ss.SSSSSS);
      fmt.setTimeZone(new SimpleTimeZone(0, ));

        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
        String url = request.getRequestURI();
        String msg;
        if (user != null) {
            msg = pWelcome,  + user.getNickname() + ! You can a href= +
                 userService.createLogoutURL(url) +
                 sign out/a./p;
        } else {
            msg = pWelcome! a href= + userService.createLoginURL(url) +
                 Sign in or register/a to customize./p;
        }
        out.println(html);
        out.println(head);
        out.println(titleServlet TimerServlet/title);
        out.println(/head);
        out.println(body);
        out.println(msg);
        out.println(h1Servlet TimerServlet at  + request.getContextPath() + /h1);
        out.println(pThe time is:  + fmt.format(new Date()) + /p);
        out.println(/body);
        out.println(/html);

        out.close();
    }

}




                                                                                      āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
138


                Exercise 17 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine
                          āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA

āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™
     â€Ē    āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App Engine
    â€Ē    Java Persistence API

          āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļģāļ™āļ§āļ™āļĄāļēāļāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĒāļēāļ
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ Web Server āļˆāļģāļ™āļ§āļ™āļŦāļĨāļēāļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļķāļ‡āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ•āđˆāļĨāļ°
āļ„āļĢāļąāđ‰āļ‡āđƒāļŠāđ‰ Web Server āļ—āļĩāđˆāđ„āļĄāđˆāļ‹āđ‰āļģāļāļąāļ™ āđāļĨāļ° Web Server āļ—āļļāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļēāļˆāļāļĢāļ°āļˆāļēāļĒāļ­āļĒāļđāđˆāđƒāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļŦāļĨāļēāļĒāđ†āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļ”āđ‰ Google App Engine āļĄāļĩāļāļĨāđ„āļāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ Infrastructure āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļąāļ‡āļ§āļĨāļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđ‚āļ”āļšāļœāđˆāļēāļ™ API āļ—āļĩāđˆāļ—āļēāļ‡ Google
āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļŦāđ‰
         Google App Engine āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļāļēāļ™āđ„āļ§āđ‰āļŠāļ­āļ‡
āđāļšāļšāļ„āļ·āļ­ Java Data Objects (JDO) āđāļĨāļ° Java Persistence API (JPA) āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđāļšāļšāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡
DataNucleus Access āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āļ§āļīāļ˜āļĩāđāļšāļš Object Database āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ RDBMS āļ—āļąāđˆāļ§āđ†āđ„āļ› āļ”āļąāļ‡
āļ™āļąāđ‰āļ™āļœāļđāđ‰āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰ RDBMS āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļąāļ’āļ™āļē Google Web
Application āđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™

       āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Books āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡
Entity āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book āđāļĨāđ‰āļ§āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡ Book

17.1     āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Google App Engine
         āđāļšāļšāļāļķāļāļŦāļąāļ”āļˆāļ°āļŠāļĢāđ‰āļēāļ‡ Web Application āļ‚āļ­āļ‡ GAE āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ File  New  Other..
    2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New āđ€āļĨāļ·āļ­āļ Folder Google āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Web Application Project āđāļĨāđ‰āļ§āļāļ” Next
    3.   āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Package name āđ€āļ›āđ‡āļ™ com.imcinstitute āđāļĨāļ° Project name āđ€āļ›āđ‡āļ™ OnlineBook
    4.    āđ„āļĄāđˆāđ€āļĨāļ·āļ­āļāļŠāđˆāļ­āļ‡ Use Google Web Toolkit āđāļĨāđ‰āļ§āļāļ” Finish
         āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ OnlineBookServlet.java āđāļĨāļ° persistence.xml (āļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ     META-
         INF) .āđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī



17.2     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book            Entity Class

         āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java āļˆāļ°āđ€āļ›āđ‡āļ™ Entity Class āļ—āļĩāđˆāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŸāļīāļĨāļ”āđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš column āļ‚āļ­āļ‡

Thanachart Numnonda and Thanisa Kruawaisayawan
139

Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books   āđ‚āļ”āļĒāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļ­āļĒāļđāđˆ   package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Entity āđāļĨāļ°āļĄāļĩ sourcecode āļ”āļąāļ‡ Listing     āļ—āļĩāđˆ   17.1

Listing āļ—āļĩāđˆ 17.1 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java


package entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Book implements Serializable {
         @Id
         private String isbn;
         private String title;
         private String author;
         private float price;
         public String getIsbn() {
                  return isbn;
         }
         public void setIsbn(String isbn) {
                  this.isbn = isbn;
         }
         public String getTitle() {
                  return title;
         }
         public void setTitle(String title) {
                  this.title = title;
         }
         public String getAuthor() {
                  return author;
         }
         public void setAuthor(String author) {
                  this.author = author;
         }
         public float getPrice() {
                  return price;
         }
         public void setPrice(float price) {
                  this.price = price;
         }
}

17.3     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java
       āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš datastore āđ‚āļ”āļĒāđƒāļŠāđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” EntityManager āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡āļĄāļē
āļˆāļēāļ EntityManagerFactory āđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļĄāļĩ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
    1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” OnlineBook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Java Class...
    2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āļāļģāļŦāļ™āļ”āļ„āđˆāļē Class Name āđ€āļ›āđ‡āļ™ EMF āđāļĨāļ° Package āđ€āļ›āđ‡āļ™ entity āđāļĨāđ‰āļ§āļāļ”
         Finish
    3.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.2

                                                                                   āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
140

Listing āļ—āļĩāđˆ 17.2 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java

package entity;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EMF {

    private static final EntityManagerFactory emfInstance =
         Persistence.createEntityManagerFactory(transactions-optional);

    private EMF() {
    }

    public static EntityManagerFactory get() {
      return emfInstance;
    }
}




17.4      āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html
      āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļˆāļ°āđ€āļ›āđ‡āļ™āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ
OnlineBookServlet āļ—āļĩāđˆāļĄāļĩ url āđ€āļ›āđ‡āļ™ addBook.do āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡   Listing āļ—āļĩāđˆ 17.3

Listing āļ—āļĩāđˆ 17.3 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html

!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
         titleAdd a new book/title
         /head
  bodyh1Add a new book/h1P
   form action=addBook.do method=GET
    ISBN : input type=text name=isbn value= size=15/ BR
    Title : input type=text name=title value= size=50/ BR
         Author : input type=text name=author value= size=50/ BR
         Price : input type=text name=price value= size=10/ BR
         input type=submit value=Add /
   /form
  /body
/html


17.5      āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine
       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļĨāļ‡āđƒāļ™
datastore āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰

     1.   āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.4
     2.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml āđ‚āļ”āļĒāđāļāđ‰āđ„āļ‚ servlet-mapping āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ addBook.do āļ”āļąāļ‡āļ™āļĩāđ‰

Thanachart Numnonda and Thanisa Kruawaisayawan
141


         servlet-mapping
                servlet-nameOnlineBook/servlet-name
                url-pattern/addBook.do/url-pattern
         /servlet-mapping

    3.   āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰           url
         http://thaijavaapp.appspot.com/addBook.html



Listing āļ—āļĩāđˆ 17.4 āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java


package com.imcinstitute;

import java.io.IOException;
import java.io.PrintWriter;

import javax.persistence.EntityManager;
import javax.servlet.http.*;

import entity.Book;
import entity.EMF;

@SuppressWarnings(serial)
public class OnlineBookServlet extends HttpServlet {
         public void doGet(HttpServletRequest req, HttpServletResponse resp)
                           throws IOException {
                 resp.setContentType(text/html;charset=UTF-8);
                 PrintWriter out = resp.getWriter();
                 out.println(html);
                 out.println(head);
                 out.println(titleAdd a new book/title);
                 out.println(/head);
                 out.println(body);
                 out.println(h1 Add a new book /h1);
                 String isbn = req.getParameter(isbn);
                 String author = req.getParameter(author);
                 String title = req.getParameter(title);
                 String priceStr = req.getParameter(price);
                 float price = Float.parseFloat(priceStr);
                 Book bk = new Book();
                 bk.setIsbn(isbn);
                 bk.setAuthor(author);
                 bk.setTitle(title);
                 bk.setPrice(price);
                 EntityManager em = EMF.get().createEntityManager();
                 try {
                           em.persist(bk);
                           out.println(Book added);
                 } finally {
                           em.close();
                 }
                 out.println(/body);
                 out.println(/html);
                 out.close();

         }
}


                                                                                 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
142




17.6     āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Books
       āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ JPA āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡
datastore āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰

    1.   āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” OnlineBook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New  Servlet...
    2.   āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Servlet āļāļģāļŦāļ™āļ”āļ„āđˆāļē Class Name āđ€āļ›āđ‡āļ™ ShowBook āđāļĨāļ° Package āđ€āļ›āđ‡āļ™
         com.imcinstitute āđāļĨāđ‰āļ§āļāļ” Finish
    3.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ShowBook.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.5
    4.   āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ ShowBook āļ”āļąāļ‡āļ™āļĩāđ‰
         servlet
                servlet-nameShowBook/servlet-name
                servlet-classcom.imcinstitute.ShowBook/servlet-class
         /servlet
         servlet-mapping
                servlet-nameShowBook/servlet-name
                url-pattern/ShowBook/url-pattern
         /servlet-mapping

    5.   āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ
         http://thaijavaapp.appspot.com/ShowBook



Listing āļ—āļĩāđˆ 17.5 āđ‚āļ›āļĢāđāļāļĢāļĄ ShowBook.java

package com.imcinstitute;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.*;

import entity.Book;
import entity.EMF;

@SuppressWarnings(serial)
public class ShowBook extends HttpServlet {
         public void doGet(HttpServletRequest req, HttpServletResponse resp)
                          throws IOException {
                 resp.setContentType(text/html;charset=UTF-8);
                 PrintWriter out = resp.getWriter();
                 out.println(html);
                 out.println(head);
                 out.println(titleAdd a new book/title);


Thanachart Numnonda and Thanisa Kruawaisayawan
143

        out.println(/head);
        out.println(body);
        out.println(h1 Show all books /h1);

        EntityManager em = EMF.get().createEntityManager();
        try {
                  Query query = em.createQuery(SELECT o FROM Book AS o);
                  @SuppressWarnings(unchecked)
                  ListBook bks = (ListBook) query.getResultList();
                  for (Object obj: bks) {
                           Book bk = (Book) obj;
                           out.println(bk.getTitle() + : + bk.getAuthor() + br);
                  }
        } catch(Exception ex) {
                  out.println(ex);
        } finally {
                  em.close();
        }
        out.println(/body);
        out.println(/html);
        out.close();

    }
}




                                                                               āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
37th Floor, Sathorn Square Building,
98 North Sathorn Road, Silom, Bangrak, Bangkok 10500

         Tel: 02-105-6322, 088-192-7975

            contact@imcinstitute.com
             www.imcinstitute.com

        www.facebook.com/imcinstitute

        www.slideshare.net/imcinstitute

More Related Content

PDF
Java Web programming Using NetBeans
Software Park Thailand
 
PDF
Java Web programming Using Eclipse
Software Park Thailand
 
PDF
āļŠāļĢāđ‰āļēāļ‡ Soap web services āļ‡āđˆāļēāļĒāđ†
Utain Wongpreaw
 
PDF
Java Web Programming Using NetBeans 6.5
Thanachart Numnonda
 
PDF
Java Web Services and SOA Exercises [in Thai]
IMC Institute
 
PDF
āđ‡Hand-on Exercise: Java Web Services using Eclipse + Tomcat & NetBeans + Glas...
IMC Institute
 
PDF
Google App Engine Using Eclipse
Software Park Thailand
 
PPT
āļšāļ—10 depreciation
āļ•āđ‰āļ™ āļŠāļļāļĄāļžāļĨ
 
Java Web programming Using NetBeans
Software Park Thailand
 
Java Web programming Using Eclipse
Software Park Thailand
 
āļŠāļĢāđ‰āļēāļ‡ Soap web services āļ‡āđˆāļēāļĒāđ†
Utain Wongpreaw
 
Java Web Programming Using NetBeans 6.5
Thanachart Numnonda
 
Java Web Services and SOA Exercises [in Thai]
IMC Institute
 
āđ‡Hand-on Exercise: Java Web Services using Eclipse + Tomcat & NetBeans + Glas...
IMC Institute
 
Google App Engine Using Eclipse
Software Park Thailand
 

Similar to Hand-on Exercise Java Web Programming (20)

PDF
Java Web Programming [Servlet/JSP] Using GlassFish and NetBeans
IMC Institute
 
PDF
webprogramming eclipse-jsp
Weerasak Sriwongyang
 
PDF
Java Web Programming (JSP/Servlet) Using Eclipse and Tomcat
IMC Institute
 
PDF
Intermediate Java Programming Language (in Thai)
Thanachart Numnonda
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Nattawatking
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Thanakon504
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
jakkirt504
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ1
phatcharaphonjoy
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
kamonrat5626
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerachai504
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerachai504
 
PDF
āļĢāļēāļĒāļ‡āļēāļ™āļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ‡āļēāļ™āļŠāļŦāļāļīāļˆāļĻāļķāļāļĐāļē
Attaporn Ninsuwan
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Aunchisa Phongchana
 
PDF
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Yii framework 2 Web Application Basic āļ‰āļšāļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™
Manop Kongoon
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
bellsupphakon
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerapon0955652023
 
PDF
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
kitkatbody18
 
PDF
Tab10 1 manual
Ratchanee Sangkaew
 
PDF
Atomymaxsite25
Warapang Plodplong
 
Java Web Programming [Servlet/JSP] Using GlassFish and NetBeans
IMC Institute
 
webprogramming eclipse-jsp
Weerasak Sriwongyang
 
Java Web Programming (JSP/Servlet) Using Eclipse and Tomcat
IMC Institute
 
Intermediate Java Programming Language (in Thai)
Thanachart Numnonda
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Nattawatking
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Thanakon504
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
jakkirt504
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ1
phatcharaphonjoy
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
kamonrat5626
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerachai504
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerachai504
 
āļĢāļēāļĒāļ‡āļēāļ™āļāļēāļĢāļ›āļāļīāļšāļąāļ•āļīāļ‡āļēāļ™āļŠāļŦāļāļīāļˆāļĻāļķāļāļĐāļē
Attaporn Ninsuwan
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Aunchisa Phongchana
 
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Yii framework 2 Web Application Basic āļ‰āļšāļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™
Manop Kongoon
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
bellsupphakon
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
weerapon0955652023
 
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļēāļĒāļ‡āļēāļ™āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
kitkatbody18
 
Tab10 1 manual
Ratchanee Sangkaew
 
Atomymaxsite25
Warapang Plodplong
 
Ad

More from IMC Institute (20)

PDF
āļ™āļīāļ•āļĒāļŠāļēāļĢ Digital Trends āļ‰āļšāļąāļšāļ—āļĩāđˆ 14
IMC Institute
 
PDF
Digital trends Vol 4 No. 13 Sep-Dec 2019
IMC Institute
 
PDF
āļšāļ—āļ„āļ§āļēāļĄ The evolution of AI
IMC Institute
 
PDF
IT Trends eMagazine Vol 4. No.12
IMC Institute
 
PDF
āđ€āļžāļĢāļēāļ°āđ€āļŦāļ•āļļāđƒāļ” Digitization āđ„āļĄāđˆāļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒ Digital Transformation
IMC Institute
 
PDF
IT Trends 2019: Putting Digital Transformation to Work
IMC Institute
 
PDF
āļĄāļđāļĨāļ„āđˆāļēāļ•āļĨāļēāļ”āļ”āļīāļˆāļīāļ—āļąāļĨāđ„āļ—āļĒ 3 āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ
IMC Institute
 
PDF
IT Trends eMagazine Vol 4. No.11
IMC Institute
 
PDF
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ—āļģ Digital transformation
IMC Institute
 
PDF
āļšāļ—āļ„āļ§āļēāļĄ The New Silicon Valley
IMC Institute
 
PDF
āļ™āļīāļ•āļĒāļŠāļēāļĢ IT Trends āļ‚āļ­āļ‡ IMC Institute āļ‰āļšāļąāļšāļ—āļĩāđˆ 10
IMC Institute
 
PDF
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ—āļģ Digital transformation
IMC Institute
 
PDF
The Power of Big Data for a new economy (Sample)
IMC Institute
 
PDF
āļšāļ—āļ„āļ§āļēāļĄ Robotics āđāļ™āļ§āđ‚āļ™āđ‰āļĄāđƒāļŦāļĄāđˆāļŠāļđāđˆāļšāļĢāļīāļāļēāļĢāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡
IMC Institute
 
PDF
IT Trends eMagazine Vol 3. No.9
IMC Institute
 
PDF
Thailand software & software market survey 2016
IMC Institute
 
PPTX
Developing Business Blockchain Applications on Hyperledger
IMC Institute
 
PDF
Digital transformation @thanachart.org
IMC Institute
 
PDF
āļšāļ—āļ„āļ§āļēāļĄ Big Data āļˆāļēāļāļšāļĨāđ‡āļ­āļ thanachart.org
IMC Institute
 
PDF
āļāļĨāļĒāļļāļ—āļ˜āđŒ 5 āļ”āđ‰āļēāļ™āļāļąāļšāļāļēāļĢāļ—āļģ Digital Transformation
IMC Institute
 
āļ™āļīāļ•āļĒāļŠāļēāļĢ Digital Trends āļ‰āļšāļąāļšāļ—āļĩāđˆ 14
IMC Institute
 
Digital trends Vol 4 No. 13 Sep-Dec 2019
IMC Institute
 
āļšāļ—āļ„āļ§āļēāļĄ The evolution of AI
IMC Institute
 
IT Trends eMagazine Vol 4. No.12
IMC Institute
 
āđ€āļžāļĢāļēāļ°āđ€āļŦāļ•āļļāđƒāļ” Digitization āđ„āļĄāđˆāļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒ Digital Transformation
IMC Institute
 
IT Trends 2019: Putting Digital Transformation to Work
IMC Institute
 
āļĄāļđāļĨāļ„āđˆāļēāļ•āļĨāļēāļ”āļ”āļīāļˆāļīāļ—āļąāļĨāđ„āļ—āļĒ 3 āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ
IMC Institute
 
IT Trends eMagazine Vol 4. No.11
IMC Institute
 
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ—āļģ Digital transformation
IMC Institute
 
āļšāļ—āļ„āļ§āļēāļĄ The New Silicon Valley
IMC Institute
 
āļ™āļīāļ•āļĒāļŠāļēāļĢ IT Trends āļ‚āļ­āļ‡ IMC Institute āļ‰āļšāļąāļšāļ—āļĩāđˆ 10
IMC Institute
 
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ—āļģ Digital transformation
IMC Institute
 
The Power of Big Data for a new economy (Sample)
IMC Institute
 
āļšāļ—āļ„āļ§āļēāļĄ Robotics āđāļ™āļ§āđ‚āļ™āđ‰āļĄāđƒāļŦāļĄāđˆāļŠāļđāđˆāļšāļĢāļīāļāļēāļĢāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡
IMC Institute
 
IT Trends eMagazine Vol 3. No.9
IMC Institute
 
Thailand software & software market survey 2016
IMC Institute
 
Developing Business Blockchain Applications on Hyperledger
IMC Institute
 
Digital transformation @thanachart.org
IMC Institute
 
āļšāļ—āļ„āļ§āļēāļĄ Big Data āļˆāļēāļāļšāļĨāđ‡āļ­āļ thanachart.org
IMC Institute
 
āļāļĨāļĒāļļāļ—āļ˜āđŒ 5 āļ”āđ‰āļēāļ™āļāļąāļšāļāļēāļĢāļ—āļģ Digital Transformation
IMC Institute
 
Ad

Hand-on Exercise Java Web Programming

  • 1. IMC Institute Java Web Programming Using Cloud Platform By Associate Professor Dr. Thanachart Numnonda & Associate Professor Dr. Thanisa Kruawaisayawan Date 18 – 22 Feb 2013
  • 2. 1 Hand-on Exercises āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Java Servlet / JSP āđ‚āļ”āļĒāđƒāļŠāđ‰ Eclipse and TomCat Assoc.Prof.Dr.Thanachart Numnonda Software Park Thailand and Asst.Prof.Dr.Thanisa Kruawaisayawan King Mongkut's Institute of Technology Ladkrabang February 2013 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 3. 2 āļŠāļēāļĢāļšāļąāļ Exercise 1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āđ„āļŸāļĨāđŒ HTML..........................................................................5 1.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server...................................................................................................................... 5 1.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project.................................................................................................. 7 1.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html................................................................................................ 9 1.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...........................................................................................................................13 Exercise 2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ..........................................................................15 2.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java......................................................................................... 15 2.1.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addCustomer.html ............................................................................... 15 2.1.2 āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†.......................................................................................................16 2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java ................................................................................17 2.3 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...........................................................................................................................19 Exercise 3 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāđ‚āļžāļĨ......................................................................................................... 21 3.1 āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html....................................................................................................................... 21 3.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java................................................................................................. 21 3.2.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang ................................................................................................22 3.2.2 āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ........................................................... 22 3.2.3 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•...................................................................................................................22 3.3 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter ............................................................................................................ 23 3.4 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java............................................................................................... 28 3.4.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters................................................................................................................28 3.4.2 āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰.......................................................................................................... 28 Exercise 4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MySQL Database............................................................................................. 30 4.1 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ MySQL āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench....................................................................... 30 4.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ books....................................................................................................................... 31 4.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđƒāļ™ MySQL WorkBench........................................................................................33 Exercise 5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ........................................................................................ 35 5.1 āļāļēāļĢ Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver...............................................................35 5.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project................................................................................................ 36 5.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html..................................................................................................... 36 5.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html.................................................................................................... 37 5.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java......................................................................................... 38 5.5.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addBook.html ......................................................................................38 5.5.2 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ...............................................................................................................38 5.5.3 āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ ................................................................................................ 39 5.5.4 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ thankyou.html ................................................................................................ 39 5.6 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java ................................................................................40 5.7 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................41 Exercise 6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB.......................................................................... 43 6.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ MongoDB..................................................................................................................... 43 6.2 āļāļēāļĢāđƒāļŠāđ‰ MongoDB......................................................................................................................... 44 6.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB.......................................................................45 6.4 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................47 Exercise 7 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„............................................................................................ 48 7.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request ..................................................................... 48 7.1.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request .....................................................50 7.1.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request.................................................... 50 7.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session ......................................................................51 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 4. 3 7.2.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session ......................................................53 7.2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session .................................................... 53 7.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application................................................................ 54 7.3.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Application................................................................. 55 7.3.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application.............................................. 56 Exercise 8 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener............................................................... 57 8.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java.............................................................................................................. 57 8.2 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java ......................................................................................60 8.3 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ...............................................................................................................................61 Exercise 9 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter ...............................................................................................62 9.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter.......................................................................................................62 9.2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļē Login......................................................................................................................... 63 9.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Servlet Filter.................................................................................................................. 64 9.4 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet ........................................................................................................67 9.5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ ..................................................................................................................68 Exercise 10 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ...........................................................................................69 10.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp........................................................................................................... 69 10.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp................................................................................................... 70 10.2.1 āļāļēāļĢāļāļģāļŦāļ™āļ” Tag Library........................................................................................................ 70 10.2.2 āļāļēāļĢāļāļģāļŦāļ™āļ” Datasource......................................................................................................... 70 10.2.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ c:forEach āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨ ............................................................................................ 71 Exercise 11 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Online Book Store................................................................................. 73 11.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp.................................................................................................73 11.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java......................................................................................................... 80 11.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java........................................................................................................... 83 11.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java....................................................................................... 84 11.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java ............................................................................................................87 11.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp..................................................................................................... 87 11.7 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ ................................................................................................................88 Exercise 12 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tags āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ JSP................................................................................89 12.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp............................................................................................................ 89 12.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp................................................................................................... 95 12.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp................................................................................................96 12.3.1 āļŠāļĢāđ‰āļēāļ‡ Tag File.....................................................................................................................96 12.3.2 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp..............................................................................................97 12.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp...................................................................................................... 97 12.4.1 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Java ClassTag Handler.........................................................................................98 12.4.2 āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor........................................................................................... 101 12.4.3 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp.................................................................................................. 103 Exercise 13 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework...................................................................... 104 13.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework..............................................................104 13.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View]....................................................................................... 105 13.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model]....................................................................... 108 13.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View].......................................................................................... 111 13.5 āļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml............................................................................................................... 111 13.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ....................................................................................................................... 111 Exercise 14 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework........................................................................ 113 14.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework.............................................................. 113 14.2 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller................................................................................................................. 114 14.3 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP............................................................................................................................114 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 5. 4 14.4 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml...................................................................................... 115 14.5 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml.................................................................................................................... 115 14.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ.......................................................................................................................116 14.7 āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ................................................................................................. 116 Exercise 15 āļāļēāļĢ Authentication āđ‚āļ”āļĒāđƒāļŠāđ‰ Tomcat .....................................................................................121 15.1 āļŠāļĢāđ‰āļēāļ‡ Web Application Project................................................................................................ 121 15.2 āđ€āļžāļīāđˆāļĄ User āļ‚āļ­āļ‡ Tomcat Web Server........................................................................................... 121 15.3 āļāļēāļĢ Config āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Web Application āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ Tomcat user .....................................122 15.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Basic Authenticate...................................................................................124 15.5 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰ Login Form........................................................................................ 125 15.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Form Authenticate.................................................................................. 126 15.7 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ Authenticate āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļˆāļēāļ Database MySQL.............................................. 126 15.8 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Database Authenticate............................................................................ 127 Exercise 16 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App Engine...................................................................... 128 16.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine............................................................................ 128 16.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project............................................................................................ 129 16.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine................................................................ 133 16.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account................................................................................135 Exercise 17 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA........................................ 138 17.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Google App Engine............................................................................................138 17.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book Entity Class..........................................................................................138 17.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java........................................................................................................ 139 17.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html................................................................................................. 140 17.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine............................................140 17.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Books ......................................................................................... 142 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 6. 5 Exercise 1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āđ„āļŸāļĨāđŒ HTML āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āļžāļąāļ’āļ™āļēāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ āļĨāļđāļāļ„āđ‰āļē āđ‚āļ”āļĒāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē HTML āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ­āļīāļ™āļžāļļāļ•āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ Web Browser āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Eclipse āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļˆāļ°āđƒāļŠāđ‰ Apache Tomcat v 6.0 āđ€āļ›āđ‡āļ™ Web Server āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server 2. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application 3. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html 1.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web Server āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāļāļģāļŦāļ™āļ” Perspective āļ‚āļ­āļ‡ Eclipse āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Java EE āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Windows > Open Perspective > Other ..āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ Java EE āđƒāļ™ Dialog Box āļˆāļ°āđ„āļ”āđ‰ Perspective āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.1 āļĢāļđāļ›āļ—āļĩāđˆ 1.1 Perspective āļŠāļģāļŦāļĢāļąāļš Java EE āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄ Tomcat Web Server āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Eclipse āļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡ āđ„āļ”āđ‰ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļ”āļąāļ‡āļ™āļĩāđ‰ āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđāļ—āļ› Servers āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™ Window āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Server āđ€āļĨāļ·āļ­āļāļŠāļ·āđˆāļ­ Apache → Tomcat 6.0 Server (āļŦāļĢāļ·āļ­ Version āļ­āļ·āđˆāļ™) āđāļĨāļ° Browse āđ„āļ›āļĒāļąāļ‡ folder Tomcat āļ—āļĩāđˆāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK āđāļĨāļ° Finish āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 7. 6 āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļāļēāļĢ Config Eclipse āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļđāđ‰āļˆāļąāļ TOMCAT Web Server āđ€āļĢāļēāļˆāļ°āđ€āļŦāđ‡āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Server āļĄāļĩāļŠāļ·āđˆāļ­ Web Server āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Tomcat āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļĄāļēāļ‹āļķāđˆāļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢ Start/Stop Server āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Server āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ‚āļķāđ‰āļ™āļĄāļēāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.3 āļĢāļđāļ›āļ—āļĩāđˆ 1.3 āđ€āļĄāļ™āļđāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ Web Server Thanachart Numnonda and Thanisa Kruawaisayawan
  • 8. 7 āđ€āļĢāļēāļˆāļģāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ„āđˆāļē Server Configuration āļ‚āļ­āļ‡ Tomcat āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđāļ—āļ› Server āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Tomcat Server āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Server āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Server Locations āđ€āļ›āđ‡āļ™ Use Tomcat Installation āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.4 āļĢāļđāļ›āļ—āļĩāđˆ 1.4 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē Server Locations 1.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web-Base Application āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Project āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Project āļ‚āļĒāļēāļĒ Folder āļŠāļ·āđˆāļ­ Web āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Dynamic Web Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.5 āļĢāļđāļ›āļ—āļĩāđˆ 1.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 9. 8 2. āđƒāļŦāđ‰āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ WebApp āļŠāđˆāļ§āļ™āļāļēāļĢāđ€āļāđ‡āļš File Eclipse āļˆāļ°āđƒāļŠāđ‰ Directory āļ—āļĩāđˆāļ–āļēāļĄāđ€āļĄāļ·āđˆāļ­āļ„āļĢāļąāđ‰āļ‡āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™ Default āđāļ•āđˆ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāļīāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļ­āļ (Uncheck) āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļ Directory āđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.6 āļĢāļđāļ›āļ—āļĩāđˆ 1.6 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Project 3. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Folder āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output folder (āļ—āļĩāđˆāđ€āļāđ‡āļš Class file) āļ„āļ·āļ­ [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]src āđāļĨāļ° [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]buildclasses āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āđāļŠāļ”āļ‡āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output directory Thanachart Numnonda and Thanisa Kruawaisayawan
  • 10. 9 4. āđāļŠāļ”āļ‡ Context root āđāļĨāļ° Content directory āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āļāļ” Finish āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āđāļŠāļ”āļ‡āļŠāļ·āđˆāļ­ Context root āđāļĨāļ° Content directory 1.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html āđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļđāļāļ„āđ‰āļē āđāļĨāđ‰āļ§ āļ™āļģāđ„āļ›āļšāļąāļ™āļ—āļķāļāļĨāļ‡āļāļēāļ™ āļ‚āđ‰āļ­āļĄāļđāļĨ customers āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļŦāļ™āđ‰āļēāļˆāļ­ HTML āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.9 (āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ” āļ–āļąāļ”āđ„āļ›) āļĢāļđāļ›āļ—āļĩāđˆ 1.9 āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆ addCustomer.html āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 11. 10 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebApp āđ€āļĨāļ·āļ­āļ New → HTML File āļ”āļąāļ‡āļĢāļđāļ› 1.10 āļĢāļđāļ›āļ—āļĩāđˆ 1.10 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML 2. āļāļģāļŦāļ™āļ” HTML File Name: āđ€āļ›āđ‡āļ™ addCustomer āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ› 1.11 āļĢāļđāļ›āļ—āļĩāđˆ 1.11 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ File HTML Thanachart Numnonda and Thanisa Kruawaisayawan
  • 12. 11 3. āđ€āļ‚āļĩāļĒāļ™ source code āļ—āļģāđ„āļ”āđ‰ 2 āļĢāļđāļ›āđāļšāļšāļ„āļ·āļ­ āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 1 āđ€āļ‚āļĩāļĒāļ™āļ•āļēāļĄ Listing āļ—āļĩāđˆ 1.1 Listing āļ—āļĩāđˆ 1.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addCustomer.html <html><head><title> Add Customer</title></head> <body><H1> Add a new customer profile</H1> <form action="addCustomer.do" method="POST"> Customer ID : <input name="id" /> <br> Name: <input name="name" /> <br> Address: <textarea name="addr" rows="4" cols="20"></textarea> <br> Mobile: <input name="mobile" size="9" /> <br> Fax: <input name="fax" size="9" /> <br> E-mail: <input name="email" size="25" /> <br><br> <input type="submit" value="Add" /> </form> </body> </html> āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 2 āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļĨāļēāļ Icon āļ›āļĢāļ°āđ€āļ āļ— HTML Forms āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Palette āļĄāļēāđƒāļŠāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļˆāļ­ Design āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ HTML āļ”āļąāļ‡āļ™āļĩāđ‰ - āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­ HTML āđ€āļ”āļīāļĄ - āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ File addCustomer.html - āđ€āļĨāļ·āļ­āļ Open With āđāļĨāļ°āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ Web Page Editor āļ”āļąāļ‡āļĢāļđāļ› 1.12 āļĢāļđāļ›āļ—āļĩāđˆ 1.12 āļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļ›āļīāļ” HTML āļāļąāļš Editor āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Design view āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 13. 12 - āļ„āļĨāļīāļāđ€āļĨāļ·āļ­āļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ§āđˆāļēāļ‡āļŠāđˆāļ§āļ™āļšāļ™āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āđ€āļĨāļ·āļ­āļ Show āđāļĨāļ° Palette āļĢāļđāļ›āļ—āļĩāđˆ 1.13 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ HTML Forms Icon āđƒāļ™ Palette Tools - āļˆāļ°āđ„āļ”āđ‰ Tab āļŠāļ·āđˆāļ­ Palette āļ­āļĒāļđāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļˆāļ­āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ„āļĨāļīāļāļ—āļĩāđˆ HTML 4.0 āļˆāļ°āļĄāļĩ Icons āđƒāļŦāđ‰ āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° Drag & Drop āļ‚āļķāđ‰āļ™āđ„āļ›āļ§āļēāļ‡āļ”āđ‰āļēāļ™āļšāļ™āļŠāļļāļ” (āļĨāļģāļ”āļąāļšāļ—āļĩāđˆ3 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.14) āđāļĨāļ°āļ›āļĢāļąāļšāļ„āđˆāļē Attribute āļ‚āļ­āļ‡ Object āļ™āļąāđ‰āļ™āđ† āđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ Tab Properties (Tab āļ­āļĒāļđāđˆāļ–āļąāļ”āđ„āļ›āļ—āļēāļ‡āļ‚āļ§āļē) āļĢāļđāļ›āļ—āļĩāđˆ 1.14 āļāļēāļĢ Drag and Drop Forms Icon āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design Thanachart Numnonda and Thanisa Kruawaisayawan
  • 14. 13 1.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ (Deploy) Web Project āļšāļ™ Tomcat WebServer āđ‚āļ”āļĒāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđāļ—āļ› Server āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Tomcat Server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Add and Remove āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.15 āļĢāļđāļ›āļ—āļĩāđˆ 1.15 āļāļēāļĢ Drag and Drop Forms Icon āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ WebApp āđāļĨāđ‰āļ§ āļāļ”āļ›āļļāđˆāļĄ Add āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆ Web Server āđāļĨāļ°āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.16 āļĢāļđāļ›āļ—āļĩāđˆ 1.16 āļāļēāļĢ Deploy Project āļŠāļđāđˆ Web Application Server 2. Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebApp āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ addCustomer.html → Run As → Run on Server āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.17 āļĢāļđāļ›āļ—āļĩāđˆ 1.17 āļāļēāļĢāļĢāļąāļ™ File āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ Test āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 15. 14 3. āļˆāļ°āļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āļĢāļąāļ™ file āļ™āļĩāđ‰āļ—āļĩāđˆ Server āđ„āļŦāļ™ (āļāļĢāļ“āļĩāđ€āļĢāļēāļ™āļĩāđ‰āļĄāļĩ Server āđ€āļ”āļĩāļĒāļ§) āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.18 āļĢāļđāļ›āļ—āļĩāđˆ 1.18 āļāļēāļĢāđ€āļĨāļ·āļ­āļ Web Application Server āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļĢāļąāļ™ 4. āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 1.19 āļĢāļđāļ›āļ—āļĩāđˆ 1.19 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļĢāļąāļ™ File addCustomer.html āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ āļŠāļąāļ‡āđ€āļāļ•āļ—āļĩāđˆāļ—āđ‰āļēāļĒ hostname āļˆāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• āļ‹āļķāđˆāļ‡āļāđ‡āļ„āļ·āļ­ port āļ—āļĩāđˆ Tomcat Server āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ­āļĒāļđāđˆ āđ‚āļ”āļĒ Default āļˆāļ°āđ€āļ›āđ‡āļ™ 8080 āļĒāļāđ€āļ§āđ‰āļ™āļ§āđˆāļēāļˆāļ°āļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļ·āđˆāļ™ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 16. 15 Exercise 2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™ āđ€āļ‚āđ‰āļēāļĄāļēāļ­āļ­āļāļ—āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāļ­āļ­āļāļ­āļ­āļāļ—āļēāļ‡ Web Browser 2.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ addCustomer.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ™āļģāļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ addCustomer.html 2. āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† 2.1.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addCustomer.html āđ€āļ§āđ‡āļšāđ€āļžāļˆ addCustomer.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ ● id āļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļĨāļđāļāļ„āđ‰āļē ● name āļŠāļ·āđˆāļ­āļĨāļđāļāļ„āđ‰āļē ● addr āļ—āļĩāđˆāļ­āļĒāļđāđˆāļĨāļđāļāļ„āđ‰āļē ● mobile āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­ â— fax āļŦāļĄāļēāļĒāđ€āļĨāļ‚ fax ● email āļ‚āļ­āļ‡āļĨāļđāļāļ„āđ‰āļē āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ Http āđāļĨāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļē-āļĄāļīāđ€āļ•āļ­āļĢāđŒ āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ”āđ‰āļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” getParameter( ) āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ String id = request.getParameter("id"); String name = request.getParameter("name"); String addr = request.getParameter("addr"); String mobile = request.getParameter("mobile"); String fax = request.getParameter("fax"); String email = request.getParameter("email"); āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 17. 16 2.1.2 āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļœāļĨāļ­āļ­āļāļ—āļēāļ‡ Web Browser āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ” HTML āļ āļēāļĒāđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡ out.println( ) āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āđ€āļĄāļ˜āļ­āļ” processRequest( ) āļ”āļąāļ‡āļ™āļĩāđ‰ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); out.println("<html>"); out.println("<head>"); out.println("<title>Customer Information</title>"); out.println("</head>"); out.println("<body>"); String id = request.getParameter("id"); String name = request.getParameter("name"); String addr = request.getParameter("addr"); String mobile = request.getParameter("mobile"); String fax = request.getParameter("fax"); String email = request.getParameter("email"); out.println("<h1> Customer Information </h1>"); out.println("<b>ID: </b>" + id + "<BR>"); out.println("<b>Name: </b>" + name + "<BR>"); out.println("<b>Address: </b>" + addr + "<BR>"); out.println("<b>Mobile: </b>" + mobile + "<BR>"); out.println("<b>Fax: </b>" + fax + "<BR>"); out.println("<b>E-mail: </b>" + email + "<BR>"); out.println("</body>"); out.println("</html>"); out.close(); } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 18. 17 2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet.java āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebApp → New → Servlet āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.1 āļĢāļđāļ›āļ—āļĩāđˆ 2.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— Servlet 2. āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Class Name āđ€āļ›āđ‡āļ™ CustomerServlet āđāļĨāļ° Package āđ€āļ›āđ‡āļ™ servlet āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āđāļĨāđ‰āļ§āļāļ” Next āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Package āđāļĨāļ° āļŠāļ·āđˆāļ­ File Servlet āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 19. 18 3. āļāļģāļŦāļ™āļ”āļ„āđˆāļē URL Pattern(āļŦāļĢāļ·āļ­ URL Mappings) āđ€āļ›āđ‡āļ™ /addCustomer.do āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāđ€āļĨāļ·āļ­āļāļŠāļ·āđˆāļ­ CustomerServlet āđāļĨāđ‰āļ§ āļāļ”āļ›āļļāđˆāļĄ Edit āđāļĨāđ‰āļ§āđ€āļ›āļĨāļĩāđˆāļĒāļ™ URL Mapping āđ€āļ›āđ‡āļ™ addCustomer.do āđāļĨāļ°āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.3 āļĢāļđāļ›āļ—āļĩāđˆ 2.3 āļāļēāļĢāļāļģāļŦāļ™āļ” URL Pattern 4. āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļžāļīāđˆāļĄāđ€āļĄāļ˜āļ­āļ”āļ—āļĩāđˆāđ„āļŸāļĨāđŒ CustomerServlet.java āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļš action āļ—āļĩāđˆSubmit āļĄāļēāļˆāļēāļ Http-Request (HTML Form) āļ—āļąāđ‰āļ‡āļŠāļ™āļīāļ” POST āđāļĨāļ° GET āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđ€āļĄāļ˜āļ­āļ”āļ§āđˆāļē processRequest( ) āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ āļŦāļąāļ§āļ‚āđ‰āļ­ 2.1.2 protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws IOException { // āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ āļŦāļąāļ§āļ‚āđ‰āļ­ 2.1.2 } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 20. 19 5. āđ€āļ‚āļĩāļĒāļ™ source Code āđ€āļžāļīāđˆāļĄāđƒāļ™āđ€āļĄāļ˜āļ­āļ” doGet(),doPost() āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­ Http-Request āđ„āļ›āļĒāļąāļ‡āđ€āļĄāļ˜āļ­āļ” processRequest() āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ code āļ”āļąāļ‡āļ™āļĩāđ‰ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); //āđ€āļžāļīāđˆāļĄ Code āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļ™āļĩāđˆ } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); //āđ€āļžāļīāđˆāļĄ Code āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļ™āļĩāđˆ } 2.3 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebApp āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ addCustomer.html āđ€āļĨāļ·āļ­āļ Run As → Run on Server → āļāļ”āļ›āļļāđˆāļĄ Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.4 āļĢāļđāļ›āļ—āļĩāđˆ 2.4 āļāļēāļĢāļĢāļąāļ™āļ—āļ”āļŠāļ­āļš addCustomer Servlet āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 21. 20 2. āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.5 āļĢāļđāļ›āļ—āļĩāđˆ 2.5 āļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļ”āļŠāļ­āļš Servlet āļœāđˆāļēāļ™āļŦāļ™āđ‰āļē addCustomer.html 3. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 2.6 āļĢāļđāļ›āļ—āļĩāđˆ 2.6 āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ CustomerServlet Thanachart Numnonda and Thanisa Kruawaisayawan
  • 22. 21 Exercise 3 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāđ‚āļžāļĨ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ—āļģ Poll āđ‚āļ”āļĒāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ‚āļŦāļ§āļ•āđ€āļĨāļ·āļ­āļāļ āļēāļĐāļē āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ­āļšāđ„āļ”āđ‰ āđāļĨāđ‰āļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•āļ—āļēāļ‡ Web Browser 3.1 āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ—āļĩāđˆāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļ§āļ•āđ€āļĨāļ·āļ­āļāļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ āļāļ”āļ›āļļāđˆāļĄ Vote āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļāđ‡āļˆāļ°āđ„āļ›āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ processVote āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļĄāļĩāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.1 āļĢāļđāļ›āļ—āļĩāđˆ 3.1 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html 3.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ vote.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Vote āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģ āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āļ™āļģāļ„āđˆāļēāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ‚āļŦāļ§āļ•āļĄāļēāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„āļ·āļ­ 1. āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang 2. āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ 3. āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ• āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 23. 22 3.2.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ counter āđāļĨāļ° lang āļ•āļąāļ§āđāļ›āļĢ count āđ€āļ›āđ‡āļ™āļ­āļ°āđ€āļĢāļĒāđŒāđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļˆāļģāļ™āļ§āļ™āļœāļĨāđ‚āļŦāļ§āļ•āļ‚āļ­āļ‡āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļĨāļ°āļ āļēāļĐāļē āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢ lang āđ€āļ›āđ‡āļ™āļ­āļ°āđ€āļĢāļĒāđŒāļ‚āļ­āļ‡ String āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļŠāļ·āđˆāļ­āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ•āļąāļ§āđāļ›āļĢāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļˆāļ°āļ›āļĢāļ°āļāļēāļĻ āļ™āļ­āļāđ€āļĄāļ˜āļ­āļ” (Instance Variable) āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ›āļĢāļ°āļāļēāļĻāļ”āļąāļ‡āļ™āļĩāđ‰ String []lang ={"Java", "C#", "C", "Pascal"}; int []count = new int[4]; 3.2.2 āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ vote.html āđāļĨāļ°āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āđ€āļ§āđ‡āļšāđ€āļžāļˆ vote.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļāļēāļĢāđ‚āļŦāļ§āļ• āđ„āļ›āļāļąāļšāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ lang āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨ 1-4 āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ request.getParameter āđ€āļžāļ·āđˆāļ­āļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāđ‚āļŦāļ§āļ•āļĄāļē āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āļ„āđˆāļēāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ String āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āđˆāļē āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ Wrapper class āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļˆāļģāļ™āļ§āļ™āđ‚āļŦāļ§āļ•āđƒāļ™āļ•āļąāļ§āđāļ›āļĢ count āļ•āļēāļĄāļ„āđˆāļē index āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš āļ āļēāļĐāļēāļ—āļĩāđˆāđ‚āļŦāļ§āļ•āļĄāļē āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ String vote = request.getParameter("lang"); int voteNum = Integer.parseInt(vote) – 1; count[voteNum]++; 3.2.3 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ• āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđ‚āļŦāļ§āļ•āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ count āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ for (int i = 0; i < count.length; i++) { out.println(lang[i] +" = " + count[i] + "<BR>"); } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 24. 23 3.3 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļ—āļĩāđˆāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļŠāļĢāđ‰āļēāļ‡ New Project āļŠāļ™āļīāļ” Dynamic Web Application āļŠāļ·āđˆāļ­ Voter āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.2 āļĢāļđāļ›āļ—āļĩāđˆ 3.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļŠāļ·āđˆāļ­ Voter āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 25. 24 2. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ HTML āļŠāļ·āđˆāļ­ vote āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.3 āļĢāļđāļ›āļ—āļĩāđˆ 3.3 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ HTML Page āļŠāļ·āđˆāļ­ vote.html 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ vote.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.1 Listing āļ—āļĩāđˆ 3.1 āđ‚āļ›āļĢāđāļāļĢāļĄ vote.html <html> <head><title>Web Voting</title></head> <body> <form action="processVote" method="POST"> Select a computer language <BR> <input type="radio" name="lang" value="1" /> Java <br> <input type="radio" name="lang" value="2" /> C# <br> <input type="radio" name="lang" value="3" /> C <br> <input type="radio" name="lang" value="4" /> Pascal <br> <input type="submit" value="Vote" /> </form> </body> </html> Thanachart Numnonda and Thanisa Kruawaisayawan
  • 26. 25 4. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects Explorer āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” Voter āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New > Servlet āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ controller āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ VoteServlet āđāļĨāđ‰āļ§āļāļ” Next āļāļģāļŦāļ™āļ” URL Mapping āđ€āļ›āđ‡āļ™ /processVote āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.4 āļĢāļđāļ›āļ—āļĩāđˆ 3.4 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Java Servlet āļŠāļ·āđˆāļ­ VoteServlet.java āđāļĨāļ°āļāļģāļŦāļ™āļ” URL Pattern (URL Mapping) āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 27. 26 āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ VoteServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.2 Listing āļ—āļĩāđˆ 3.2 āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java package controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/processVote") public class VoteServlet extends HttpServlet { private static final long serialVersionUID = 1L; String []lang ={"Java", "C#", "C", "Pascal"}; int []count = new int[4]; protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); String vote = request.getParameter("lang"); int voteNum = Integer.parseInt(vote) - 1; count[voteNum]++; out.println("<html>"); out.println("<head>"); out.println("<title>Servlet VoteServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet VoteServlet at " +request.getContextPath() + "</h1>"); for (int i = 0; i < count.length; i++) { out.println(lang[i] +" = " + count[i] + "<BR>"); } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 28. 27 5. āļ—āļģāļāļēāļĢ Deploy Web Project āļ—āļĩāđˆ Apache Tomcat āđ„āļ›āļ—āļĩāđˆ Tab Server āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ„āļĨāļīāđŠāļāļ‚āļ§āļē āļ—āļĩāđˆ Tomcat Server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Add and Remove āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 3.5 āļĢāļđāļ›āļ—āļĩāđˆ 3.5 āļāļēāļĢ Deploy Project āđ„āļ›āļ—āļĩāđˆ Apache Tomcat āđāļšāļš Manual 6. āļāļ” Save āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆ http://localhost:8080/Voter/vote.html āđ‚āļ”āļĒāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 3.6 āļĢāļđāļ›āļ—āļĩāđˆ 3.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Voter āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 29. 28 3.4 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļŦāļ§āļ•āļ‹āđ‰āļģāļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļˆāļ°āđ„āļĄāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰ āļœāļđāđ‰āđƒāļŠāđ‰ āļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļŦāļ§āļ•āļ‹āđ‰āļģāđ„āļ”āđ‰ āđ‚āļ”āļĒāļˆāļ°āđ€āļāđ‡āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ‚āļŦāļ§āļ•āđāļĨāđ‰āļ§āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HashSet āļāļēāļĢ āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters 2. āļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđ‚āļŦāļ§āļ•āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļ„āļ°āđāļ™āļ™āļāļēāļĢāđ‚āļŦāļ§āļ• āļŦāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āđ„āļĄāđˆāđ€āļ„āļĒāđ‚āļŦāļ§āļ• 3.4.1 āļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢ voters āļ•āļąāļ§āđāļ›āļĢ voters āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ™āļīāļ” HashSet ( Set āđ„āļĄāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‹āđ‰āļģ āđ„āļĄāđˆāļˆāļģāļĨāļģāļ”āļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ§āđˆāļēāđ€āļ‚āđ‰āļēāļāđˆāļ­āļ™āļŦāļĢāļ·āļ­āļŦāļĨāļąāļ‡ āđāļĨāļ°āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļĨāļģāļ”āļąāļš) āđ€āļāđ‡āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđ‚āļŦāļ§āļ• āđ‚āļ”āļĒāļˆāļ°āļ›āļĢāļ°āļāļēāļĻāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢ āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ›āļĢāļ°āļāļēāļĻāļ”āļąāļ‡āļ™āļĩāđ‰ HashSet voters = new HashSet(); 3.4.2 āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ āļāļēāļĢāļ­āđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļ„āļģāļŠāļąāđˆāļ‡ getRemoteAddr() āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ€āļĄāļ·āđˆāļ­āļ—āļĢāļēāļš āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āļ§āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ™āļĩāđ‰āđ€āļ„āļĒāđ‚āļŦāļ§āļ•āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āđ‚āļ”āļĒāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ voters āļĄāļĩāļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ contain() āļŦāļēāļāļĒāļąāļ‡āđ„āļĄāđˆāđ€āļ„āļĒāđ‚āļŦāļ§āļ•āļāđ‡āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļ„āđˆāļēāļ•āļąāļ§āļ™āļąāļšāđāļĨāļ°āđ€āļžāļīāđˆāļĄāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ„āļ­āļžāļĩāļ™āļĩāđ‰āđƒāļ™ āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ voters āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ String ip = request.getRemoteAddr(); if(voter.contains(request.getRemoteAddr())){ out.print("This IP Address has been voted"); } else { count[voteNum]++; voter.add(request.getRemoteAddr()); } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 30. 29 āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāļĄāđˆāļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 3.3 āđƒāļŦāđ‰āļĨāļ­āļ‡āļ—āļ”āļĨāļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ™āļĩāđ‰ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆ Listing āļ—āļĩāđˆ 3.3 āđ‚āļ›āļĢāđāļāļĢāļĄ VoteServlet.java āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļŦāļ§āļ•āļ‹āđ‰āļģ package controller; import java.io.IOException; import java.io.PrintWriter; import java.util.HashSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/processVote") public class VoteServlet extends HttpServlet { private static final long serialVersionUID = 1L; HashSet<String> voter = new HashSet<String>(); String[] lang = { "Java", "C#", "C", "Pascal" }; int[] count = new int[4]; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); String vote = request.getParameter("lang"); int voteNum = Integer.parseInt(vote) - 1; if (voter.contains(request.getRemoteAddr())) { out.print("<font color=red>This IP Address has been voted</font>"); } else { voter.add(request.getRemoteAddr()); count[voteNum]++; } out.println("<html>"); out.println("<head>"); out.println("<title>Servlet VoteServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Servlet VoteServlet at " + request.getContextPath() + "</h1>"); for (int i = 0; i < count.length; i++) { out.println(lang[i] + " = " + count[i] + "<BR>"); } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 31. 30 Exercise 4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MySQL Database āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ - āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™ Database Tool āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Table test āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL āļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™ āđ€āļŠāđˆāļ™āļ›āļāļ•āļīāļ–āđ‰āļēāļˆāļ° create table āļāđ‡āļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ SQL āđāļ•āđˆ Tool āļ™āļĩāđ‰āļĄāļĩ GUI āļĄāļēāļŠāđˆāļ§āļĒ āļ—āļģāđƒāļŦāđ‰āļĨāļ”āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” āđāļĨāļ° āļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļāļēāļĢāļ—āļģāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ download āđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL āđāļĨāļ° MySQL Workbench āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ download āđ„āļ”āđ‰āļˆāļēāļāđ€āļ§āđ‡āļš http://dev.mysql.com/ 4.1 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ MySQL āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench āđƒāļŦāđ‰āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Program MySQL Workbench 1. āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Connection Name āđƒāļŠāđˆ Password āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™āļ•āļ­āļ™āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ root āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.2 āļĢāļđāļ›āļ—āļĩāđˆ 4.2 āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ Connection āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢ Database Thanachart Numnonda and Thanisa Kruawaisayawan
  • 32. 31 4.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ books āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ”āļĒāđƒāļŦāđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ Schema āļ—āļĩāđˆāļŠāļ·āđˆāļ­ test āđ‚āļ”āļĒ Table āļ™āļĩāđ‰āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩ Column āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1 āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1 Table books āļŠāļ·āđˆāļ­ Column āļŠāļ™āļīāļ” āļ‚āļ™āļēāļ” Primary Key Index isbn varchar 20 Y Y title varchar 70 - - author varchar 50 - - price float - - - āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL WorkBench āđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡ Table āļ™āļĩāđ‰āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ icon āļŠāļ·āđˆāļ­ Add Table... āđāļĨāđ‰āļ§āđƒāļŠāđˆāļŠāļ·āđˆāļ­ table āđāļĨāļ° āļŠāļ·āđˆāļ­ field āļ•āļēāļĄāļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆ 4.1 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Apply āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 33. 32 2. āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL Statement āļāđ‡āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ™āļģāđ„āļ›āđƒāļŠāđˆāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Query1 āđāļĨāđ‰āļ§ āļāļ” icon āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™ CREATE TABLE BOOKS ( ISBN VARCHAR(20) NOT NULL , TITLE VARCHAR(70) NULL , AUTHOR VARCHAR(50) NULL , PRICE FLOAT NULL , PRIMARY KEY (ISBN) ); 3. āđ€āļ›āļīāļ” Tables books āļˆāļ°āđ€āļŦāđ‡āļ™ Column āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.4 āļĢāļđāļ›āļ—āļĩāđˆ 4.4 āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 34. 33 4.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđƒāļ™ MySQL WorkBench āļ āļēāļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Table books āļ”āđ‰āļēāļ™āļ‚āļ§āļē āļˆāļ°āđ„āļ”āđ‰ SQL Editor āđƒāļŦāđ‰āļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ€āļ›āđ‡āļ™ INSERT INTO books VALUES ('123', 'JAVA', 'Numnonda', 2500.00); INSERT INTO books VALUES ('456', 'SOA', 'Numnonda', 3000.00) ; āđāļĨāđ‰āļ§ āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ icon āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āļŦāļĢāļ·āļ­āļāļ” Ctrl+Shift+Enter āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ SQL āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āļāļēāļĢ Execute āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ•āļēāļĢāļēāļ‡ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 35. 34 2. āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰ āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ€āđāļĨāđ‰āļ§āļĨāļ·āļ­āļ Select Rows – Limit1000 āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 4.6 āļĢāļđāļ›āļ—āļĩāđˆ 4.6 āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Table āļŠāļ·āđˆāļ­ books Thanachart Numnonda and Thanisa Kruawaisayawan
  • 36. 35 Exercise 5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Tool āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MySQL Database āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāđƒāļŠāđ‰ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđƒāļŠāđ‰āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL āļ‹āļķāđˆāļ‡āļĄāļĩ Database āļŠāļ·āđˆāļ­ test āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ„āļ§āđ‰āđāļĨāđ‰āļ§āļˆāļēāļ āļ—āļĩāđˆ Exercise 4 (āļŦāļ™āđ‰āļē 34) āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ āļœāđˆāļēāļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāļŠāļ·āđˆāļ­ addBook.html āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ„āļ›āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ AddBookServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļ­āđˆāļēāļ™āļ„āđˆāļē parameter āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļēāđāļĨāļ°āļ—āļģāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table books āļ‹āļķāđˆāļ‡ āđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ SQL āļœāđˆāļēāļ™ JDBC API āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver 2. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB 3. āļžāļąāļ’āļ™āļē Web page addBook.html 4. āļžāļąāļ’āļ™āļē Web page Thankyou.html 5. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java 5.1 āļāļēāļĢ Config Apache Tomcat āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ JDBC Driver āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Driver āļ—āļĩāđˆāļŠāļ·āđˆāļ­ MySQL Connector/J āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ JDBC Driver āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MySQL File āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āļ„āļ·āļ­ mysql-connector-java-5.1.15-bin.jar āđ‚āļ”āļĒāđƒāļŦāđ‰ Copy āđ„āļ›āļ§āļēāļ‡āļ—āļĩāđˆ directory /lib āļ‚āļ­āļ‡ Apache Tomcat Default āļ­āļĒāļđāđˆāļ—āļĩāđˆ C:Program FilesApache Software FoundationTomcat 6.0lib āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.1 āļĢāļđāļ›āļ—āļĩāđˆ 5.1 āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡ File JDBC Driver āđƒāļ™ Folder lib āļ‚āļ­āļ‡ Apache Tomcat āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ– Download MySQL Connector/J āđ„āļ”āđ‰āļ—āļĩāđˆ http://mysql.cs.pu.edu.tw/Downloads/Connector-J/mysql-connector-java-5.1.15.zip āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 37. 36 5.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New Project →Dynamic Web Application āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Project Name āđ€āļ›āđ‡āļ™ WebBaseDB (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Dynamic Web Application āļŦāļ™āđ‰āļē 23) āđāļĨāđ‰āļ§āļāļ” Finish 5.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books āļ‹āļķāđˆāļ‡āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.2 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļĢāļđāļ›āļ—āļĩāđˆ 5.2 āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāđ€āļžāļˆ addBook.html āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → HTML File (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļŦāļ™āđ‰āļē 24) āļāļģāļŦāļ™āļ” File Name: āđ€āļ›āđ‡āļ™ addBook āđāļĨāđ‰āļ§āļāļ” Finish 2. āđ€āļ‚āļĩāļĒāļ™ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ addBook.html āļ•āļēāļĄ Listing āļ—āļĩāđˆ 5.1 āļŦāļĢāļ·āļ­ āļĨāļēāļ icon āļ›āļĢāļ°āđ€āļ āļ— HTML Forms āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Palette āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļŦāļ™āđ‰āļē 9 āđ‚āļ”āļĒāļ—āļģāļ•āļēāļĄ āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆ 2) āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.3 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 38. 37 āļĢāļđāļ›āļ—āļĩāđˆ 5.3 āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Palette āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ HTML Listing āļ—āļĩāđˆ 5.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Add a new book</title> </head> <body><h1>Add a new book</h1><P> <form action="addBook.do" method="POST"> ISBN : <input type="text" name="isbn" value="" size="15"/> <BR> Title : <input type="text" name="title" value="" size="50"/> <BR> Author : <input type="text" name="author" value="" size="50"/> <BR> Price : <input type="text" name="price" value="" size="10"/> <BR> <input type="submit" value="Add" /> </form> </body> </html> 5.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html āđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html āđ€āļ›āđ‡āļ™āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ–āļđāļāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 5.2 āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 39. 38 Listing āļ—āļĩāđˆ 5.2 āđ‚āļ›āļĢāđāļāļĢāļĄ thankyou.html 5.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ”āļĒ addBook.html āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļˆāļēāļ addBook.html 2. āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.4 āļĢāļđāļ›āļ—āļĩāđˆ 5.4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡ Servlet āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ 3. āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books 4. āđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ Thankyou.html 5.5.1 āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļˆāļēāļ addBook.html āđ€āļ§āđ‡āļšāđ€āļžāļˆ addBook.html āļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰ ● isbn āļŦāļĄāļēāļĒāđ€āļĨāļ‚ ISBN āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­ â— title āļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­ â— author āļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡ â— price āļĢāļēāļ„āļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­ āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ Http āđāļĨāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ”āđ‰āļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” getParameter() āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ String isbn = request.getParameter("isbn"); String author = request.getParameter("author"); String title = request.getParameter("title"); String priceStr = request.getParameter("price"); 5.5.2 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ ● āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” Data source āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Container āļ‚āļ­āļ‡ Tomcat ● āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļĄāļ˜āļ­āļ” executeQuery() āļŦāļĢāļ·āļ­ executeUpdate() Thanachart Numnonda and Thanisa Kruawaisayawan
  • 40. 39 1. āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” DataSource āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Tomcat āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡ file context.xml āļ—āļĩāđˆ Folder WebBaseDBWebContentMETA-INF āđ‚āļ”āļĒāđ€āļĢāļēāļĄāļēāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebContent > META-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ New > Others > XML File āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ context.xml āđāļĨāđ‰āļ§āđ€āļ‚āļĩāļĒāļ™ sourcecode āļ”āļąāļ‡āļ™āļĩāđ‰ <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/test" auth="Container" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test" username="root" password="root" > </Resource> </Context> 2. āļāļēāļĢāļ‚āļ­ Data source āļˆāļ°āđƒāļŠāđ‰ @annotation āđāļĨāļ°āļšāļ­āļāļŠāļ·āđˆāļ­āļ‚āļ­āļ‡ Data source āļ•āļąāļ§āļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ source code āđ€āļŠāđˆāļ™ @Resource(name = "jdbc/test") private DataSource jdbcTest; āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰ Data source āđāļĨāđ‰āļ§ āđ€āļĢāļēāļāđ‡āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļ—āļēāļ‡āļ•āļīāļ”āļ•āđˆāļ­ āđ‚āļ”āļĒ getConnection āļˆāļēāļāļĄāļąāļ™āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ„āđˆāļēāđ„āļ§āđ‰āļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ conn āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™ source code āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļ—āļĩāđˆ method init( ) private Connection conn; public void init() { try { conn = jdbcTest.getConnection(); } catch (Exception ex) {System.out.println(ex);} } 5.5.3 āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļĄāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ„āļ”āđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” Connection āļĄāļēāđāļĨāđ‰āļ§ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡ INSERT āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ INSERT INTO books VALUES(....) āđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āļ„āđˆāļēāļˆāļēāļāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļĢāļąāļšāļĄāļē āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļēāļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆāļĨāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ Statement stmt = conn.createStatement(); String sql = "INSERT INTO books VALUES('" + isbn + "','" + title +"','" + author +"',"+ price +")"; int numRow = stmt.executeUpdate(sql); 5.5.4 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ thankyou.html āđ€āļĄāļ·āđˆāļ­āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ–āļđāļāđ€āļžāļīāđˆāļĄāļĨāļ‡āđ„āļ›āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāđ‰āļ§ āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ€āļ§āđ‡āļšāđ€āļžāļˆ thankyou.html āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ RequestDispatcher āļ”āļąāļ‡āļ™āļĩāđ‰ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 41. 40 RequestDispatcher obj = request.getRequestDispatcher("thankyou.html"); if (numRow == 1 && obj != null) { obj.forward(request,response); } 5.6 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ AddBookServlet āđāļĨāļ° URL Mapping āđ€āļ›āđ‡āļ™ /addBook.do āđāļĨāđ‰āļ§āļāļ” Finish 2. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AddBookServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 5.3 Listing āļ—āļĩāđˆ 5.3 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java package controller; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.annotation.Resource; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; @WebServlet("/addBook.do") public class AddBookServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Resource(name = "jdbc/test") private DataSource jdbcTest; private Connection conn; public void init() { try { conn = jdbcTest.getConnection(); } catch (Exception ex) { System.out.println(ex); } } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Add a new book</title>"); out.println("</head>"); out.println("<body>"); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 42. 41 out.println("<h1> Add a new book </h1>"); try { String isbn = request.getParameter("isbn"); String author = request.getParameter("author"); String title = request.getParameter("title"); String priceStr = request.getParameter("price"); float price = Float.parseFloat(priceStr); Statement stmt = conn.createStatement(); String sql = "INSERT INTO books VALUES('" + isbn + "','" + title + "','" + author + "'," + price + ")"; int numRow = stmt.executeUpdate(sql); RequestDispatcher obj =request.getRequestDispatcher("thankyou.html"); if (numRow == 1 && obj != null) { obj.forward(request, response); } } catch (SQLException ex) { out.println("Error " + ex); return; } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } 3. āļšāļēāļ‡āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļĨāļ·āļĄ import āļŦāļĢāļ·āļ­āļžāļš Error āļŦāļĢāļ·āļ­āļžāļš Warning āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļš import file āđ‚āļ”āļĒāļāļ” Ctrl+Shift+O Eclipse āļˆāļ°āļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ° import āđ„āļŸāļĨāđŒāļˆāļēāļāđāļžāđ‡āļ„āđ€āļāđ‡āļˆāđƒāļ” āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.5 āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļāļēāļĢāļ—āļģ Organize Imports āļĢāļđāļ›āļ—āļĩāđˆ 5.5 Ctrl+Shift+O āđƒāļŦāđ‰ Eclipse āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡ Import file 5.7 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB āļ‹āļķāđˆāļ‡āđƒāļ™ Eclipse āļ—āļģāđ‚āļ”āļĒ Click āļ‚āļ§āļēāļ—āļĩāđˆ Add and Remove 2. āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđ‰āļē addBook.html āđāļĨāđ‰āļ§āļ—āļ”āļŠāļ­āļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.6 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 43. 42 āļĢāļđāļ›āļ—āļĩāđˆ 5.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Books 3. āđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Database āđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.7 āļĢāļđāļ›āļ—āļĩāđˆ 5.7 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđāļŠāļ”āļ‡āļ—āļēāļ‡ Web Browser 4. āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ MySQLWorkbench āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Select Rows -... āļˆāļēāļ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 5.8 āļĢāļđāļ›āļ—āļĩāđˆ 5.8 āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļē Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books Thanachart Numnonda and Thanisa Kruawaisayawan
  • 44. 43 Exercise 6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāđƒāļŠāđ‰ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆ āđ€āļ›āđ‡āļ™ NoSQL āļ­āļĒāđˆāļēāļ‡ MongoDB āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Document āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ JSON āđāļĨāļ°āļĄāļĩāļŠāļēāļĄāļēāļĢāļ– āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ„āļ”āđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ•āļīāļ”āļ•āļąāđ‰āļ‡ MongoDB 2. āļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰ MongoDB 3. āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB 6.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ MongoDB āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ—āļąāđ‰āļ‡ Windows, Mac OS āļŦāļĢāļ·āļ­ Linux āļŠāļģāļŦāļĢāļąāļšāļšāļ™āļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢ Windows āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ Binary āļˆāļēāļāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ http://www.mongodb.org/downloads āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ unzip āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ„āļ§āđ‰āđƒāļ™ āđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļĢāļđāļ› āļĢāļđāļ›āļ—āļĩāđˆ 6.1 āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāđˆāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ MongoDB āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļāđ‡āļ„āļ·āļ­ â€Ē mongod.exe āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Database Server â€Ē mongo.exe āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āđˆāļēāļˆāļ­āļ‚āļ­āļ‡ admin āđ‚āļ”āļĒ Default MongoDB āļˆāļ°āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ§āđ‰āļ—āļĩāđˆāđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆ datadb āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ āļēāļĒāđƒāļ•āđ‰ Drive C āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 45. 44 6.2 āļāļēāļĢāđƒāļŠāđ‰ MongoDB āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļĨāļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ MongoDB āđ‚āļ”āļĒāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Mongo.exe āļ‹āļķāđˆāļ‡āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ command shell āļ‚āļ­āļ‡ administrator āđāļĨāļ°āđ‚āļ”āļĒ Default āļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŠāđ‰ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļ·āđˆāļ­ test āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ > db āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (database)āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ„āļ·āļ­ >show dbs āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē mydatabase āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ >use mydatabase āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡ Tables āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ„āļ·āļ­ >show collections āđāļĨāļ°āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāđˆāļ§āļĒāđ€āļŦāļĨāļ·āļ­āđ‚āļ”āļĒ >help āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļ—āļģāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āļŠāļ­āļ‡āđ€āļĨāđˆāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ > db.books.insert({isbn:"555123", author:"thanachart", title:"Introduction to MongoDB", price:1200}) āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ > new_book = {isbn:"555124", author:"James Gosling", title: "Java SE", price: 1400} > db.books.insert(new_book) āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ > db.books.find() āļ‹āļķāđˆāļ‡āļāđ‡āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ™āļĩāđ‰ { "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart", "title" : "Introduction to MongoDB", "price" : 1200 } { "_id" : ObjectId("511fb24e7c199204a9f733a6"), "isbn" : "555124", "author" : "James Gosling", "title" : "Java SE", "price" : 1400 } āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰ id āļˆāļ°āđ€āļ›āđ‡āļ™ index āđƒāļ™āļāļēāļĢāļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ™āļ­āļāļˆāļēāļāļ™āļĩāđˆāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļģāļŦāļĢāļąāļšāļĢāļēāļĒ āļāļēāļĢāđƒāļ”āđ†āđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļēāļĄāļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡ > db.books.find({author:"thanachart"}) āļŦāļĢāļ·āļ­āļ­āļēāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĄāļĩāļ„āļģāļ§āđˆāļē Mongo Thanachart Numnonda and Thanisa Kruawaisayawan
  • 46. 45 > db.books.find({title:/Mongo/}) āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° update āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļŠāđˆāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĢāļēāļ„āļēāļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāđāļ•āđˆāļ‡āđ‚āļ”āļĒ thanachart āđ€āļ›āđ‡āļ™ 1300 āđ‚āļ”āļĒ āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ > db.books.update({author:"thanachart"},{$set: {price:1300}}) āđ€āļĢāļēāļˆāļ°āļĨāļ­āļ‡āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄ comment āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļŠāđˆāļ™āļĄāļĩāļœāļđāđ‰āļ­āđˆāļēāļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Somchai āļ­āļēāļˆāļĄāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ‚āļ­āļ‡ James Gosling āđ€āļ›āđ‡āļ™ â€œgood reading book” āđ‚āļ”āļĒāđ€āļĢāļēāļ­āļēāļˆāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ > new_comment = {reader:"Somchai", date: new Date(), text: "good reading book"} > db.books.update({author:/James/},{$push: {comment:new_comment}}) āļ‹āļķāđˆāļ‡āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļĩāđ‰āđƒāļŦāļĄāđˆāđ€āļ›āđ‡āļ™ { "_id" : ObjectId("511fb0387c199204a9f733a5"), "isbn" : "555123", "author" : "thanachart", "title" : "Introduction to MongoDB", "price" : 1300 } { "_id" : ObjectId("511fb24e7c199204a9f733a6"), "author" : "James Gosling", "comment" : [ { "reader" : "Somchai", "date" : ISODate("2013-02-16T16:45:07.309Z"), "text" : "good reading book" } ], "isbn" : "555124", "price" : 1400, "title" : "Java SE" } 6.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš MongoDB āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MongoDB āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļ™āļĩāđˆāļˆāļ°āđƒāļŠāđ‰ MongoDB Driver āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĄāļēāđ„āļ”āđ‰āļˆāļēāļ https://github.com/mongodb/mongo-java-driver/downloads āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļŠāļēāļ˜āļīāļ•āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ MongoDB āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđƒāļŦāđ‰āļĄāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 5.1 āđāļ•āđˆāđƒāļŦāđ‰āđāļāđ‰ tag action āļ”āļąāļ‡āļ™āļĩāđ‰ <form action="MongoDBServlet" method="POST"> āđāļĨāļ°āļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ MongoDBServlet āđāļĨāđ‰āļ§āļāļ” Finish 2. copy āđ„āļŸāļĨāđŒ mongo-2.10.1.jar āđ„āļ›āđ„āļ§āđ‰āļ—āļĩāđˆāđ„āļ”āđ€āļĢāđ‡āļāļ—āļ­āļĢāļĩāđˆ āđ‚āļ”āļĒāđƒāļŦāđ‰ Copy āđ„āļ›āļ§āļēāļ‡āļ—āļĩāđˆ directory /lib āļ‚āļ­āļ‡ Apache Tomcat āļ‹āļķāđˆāļ‡ Default āļ­āļĒāļđāđˆāļ—āļĩāđˆ C:Program FilesApache Software FoundationTomcat 6.0lib 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ MongoDBServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 6.1 Listing āļ—āļĩāđˆ 6.1 āđ‚āļ›āļĢāđāļāļĢāļĄ MongoDBServlet.java package controller; import java.io.IOException; āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 47. 46 import java.io.PrintWriter; import java.net.UnknownHostException; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.Mongo; /** * Servlet implementation class MongoDBServlet */ @WebServlet("/MongoDBServlet") public class MongoDBServlet extends HttpServlet { private static final long serialVersionUID = 1L; Mongo m = null; /** * @see HttpServlet#HttpServlet() */ public MongoDBServlet() { super(); // TODO Auto-generated constructor stub } public void init() { try { m = new Mongo( "localhost" ); System.out.println("Connected"); } catch (Exception ex) { System.out.println(ex); } } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Add a new book</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1> Add a new book </h1>"); try { String isbn = request.getParameter("isbn"); String author = request.getParameter("author"); String title = request.getParameter("title"); String priceStr = request.getParameter("price"); float price = Float.parseFloat(priceStr); DB db = m.getDB( "test" ); BasicDBObject book = new BasicDBObject(); book.put("isbn", isbn); book.put("author", author); book.put("title", title); book.put("price", price); DBCollection coll = db.getCollection("books"); coll.insert(book); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 48. 47 RequestDispatcher obj =request.getRequestDispatcher("thankyou.html"); obj.forward(request, response); } catch (UnknownHostException ex) { out.println("Error " + ex); return; } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } 6.4 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB 2. āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđ‰āļē addBook.html āđāļĨāđ‰āļ§āļ—āļ”āļŠāļ­āļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ 3. āđ„āļ›āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ admin āļ‚āļ­āļ‡ MongoDB āđāļĨāđ‰āļ§āđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ db.books.find() āļˆāļ°āđ€āļŦāđ‡āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 49. 48 Exercise 7 āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āļ­āļ˜āļīāļšāļēāļĒāļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāđ€āļ§āđ‡āļš (Object Scope) āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļŠāļĩāđˆāđāļšāļšāļ„āļ·āļ­ Page, Request, Session āđāļĨāļ° Web (Application) āđ‚āļ”āļĒāļˆāļ°āļ—āļ”āļĨāļ­āļ‡ āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļœāđˆāļēāļ™āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļŠāļ­āļ‡āļŠāļļāļ” 7.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđƒāļ™āđāļ•āđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĄāļĩāļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ (scope) āļ­āļĒāļđāđˆāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆ āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āđ† (URL āļ™āļąāđ‰āļ™āđ†) āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ•āļąāļ§āļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļāļēāļĢ āļˆāļ°āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļŦāļĢāļ·āļ­ JSP āļ­āļ·āđˆāļ™āđ† āđ€āļĢāļĩāļĒāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļ”āđ† āđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ source code āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­ āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ™āļąāđ‰āļ™āđ„āļ›āļĒāļąāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ­āļ·āđˆāļ™āđ† āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āļ­āļĩāļ 3 āđāļšāļšāļ„āļ·āļ­ â— Request āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet/JSP āļ­āļ·āđˆāļ™ â— Session āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ Session āļ‚āļ­āļ‡ Web Browser āļ•āļĢāļēāļšāđ€āļ—āđˆāļēāļ—āļĩāđˆāļĒāļąāļ‡āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ ● Application āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet/JSP āđƒāļ”āđ† āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļˆāļēāļ URL āļŦāļ™āļķāđˆāļ‡āļĄāļēāļĒāļąāļ‡ URL āļ­āļ·āđˆāļ™āļ—āļģāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™ āļ–āļķāļ‡āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ HTML āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđ‚āļ”āļĒ āļ„āļģāļŠāļąāđˆāļ‡ request.getParameter() āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰āđ€āļĢāļēāļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđ„āļ›āļĒāļąāļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ­āļ·āđˆāļ™āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ setAttribute() āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ String āļŠāļ·āđˆāļ­āļ§āđˆāļē name āđ‚āļ”āļĒāļˆāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ RequestName āđāļĨāļ°āļĄāļĩāļĢāļđāļ› āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ String name = “Numnonda”; request.setAttribute(“RequestName”, name); āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰ URL āļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ–āļąāļ”āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ RequestName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰ String name = (String) request.getAttribute(“RequestName”); āļŠāđˆāļ§āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ° forward āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āđ„āļ› URL āļ­āļ·āđˆāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰ RequestDispatcher obj = request.getRequestDispatcher("SecondServlet"); obj.forward(request,response); āđ‚āļ”āļĒāļ—āļĩāđˆ SecondServlet āļ„āļ·āļ­āļŠāļ·āđˆāļ­ URL āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ forward āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš request āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.1 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāđāļĨāđ‰āļ§āļ™āļģāļĄāļē āđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.2 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 50. 49 Listing āļ—āļĩāđˆ 7.1 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class FirstServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); try { String name = "Numnonda"; request.setAttribute("RequestName", name); RequestDispatcher obj = request.getRequestDispatcher("SecondServlet"); obj.forward(request, response); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } Listing āļ—āļĩāđˆ 7.2 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class SecondServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); try { String name = (String) request.getAttribute("RequestName"); out.println(name); } finally { out.close(); āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 51. 50 } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } 7.1.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Application āļāļģāļŦāļ™āļ”āļ„āđˆāļē Project Name āđ€āļ›āđ‡āļ™ ScopeDemo 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo → New → Servlet āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 7.1 āđāļĨāđ‰āļ§ Save 3. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish 4. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 7.2 āđāļĨāđ‰āļ§ Save 7.1.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Request āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Apache Tomcat āđāļĨāđ‰āļ§ Add and Remove Project āđ€āļ‚āđ‰āļēāđ„āļ› āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 7.1 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 52. 51 āļĢāļđāļ›āļ—āļĩāđˆ 7.1 āļāļēāļĢ Add Project āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Apache Tomcat āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļāļēāļĢ Deploy 2. āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo 3. āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstServlet āļŠāļąāļ‡āđ€āļāļ•āļļāļœāļĨāļĨāļąāļžāļ˜āđŒ 4. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondServlet āđ‚āļ”āļĒāļ•āļĢāļ‡ āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē āļ„āđˆāļēāļ—āļĩāđˆāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™ null āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡ request āļĄāļēāļˆāļēāļ FirstServlet 7.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđāļšāļš Request āļˆāļ°āļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ•āļēāļĄ request āļ‚āļ­āļ‡ URL āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđ„āļĄāđˆ āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļ URL āļ™āļąāđ‰āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļŠāđˆāļ‡ request āļĄāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āđƒāļ™ session āļ‚āļ­āļ‡ Web Browser āđ„āļ”āđ‰ (āļ•āļĢāļēāļšāđ€āļ—āđˆāļēāļ—āļĩāđˆ Browser āļĒāļąāļ‡ āđƒāļŠāđ‰ session āļ™āļąāđ‰āļ™āļ­āļĒāļđ) āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ” Attribute āļĨāļ‡āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđˆ session āļ‚āļ­āļ‡ Web Browser āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āđ€āļāđ‡āļšāļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ String āļŠāļ·āđˆāļ­āļ§āđˆāļē name āđ„āļ§āđ‰āđƒāļ™ attribute āļ‚āļ­āļ‡ session āļ—āļĩāđˆāļŠāļ·āđˆāļ­ SessionName āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ String name = "Numnonda"; HttpSession session = request.getSession(); session.setAttribute("SessionName", name); āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ‚āļ­āļ‡ Session āļ—āļĩāđˆāļŠāļ·āđˆāļ­ SessionName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ āļ•āļąāļ§āđāļ›āļĢ name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļˆāļēāļ Session āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰ HttpSession session = request.getSession(); String name = (String) session.getAttribute("SessionName"); āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 53. 52 āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš session āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstSessionServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.3 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondSessionServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļē āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.4 Listing āļ—āļĩāđˆ 7.3 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstSessionServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class FirstSessionServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String name = "Numnonda"; HttpSession session = request.getSession(); session.setAttribute("SessionName", name); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } Listing āļ—āļĩāđˆ 7.4 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondSessionServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class SecondSessionServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { HttpSession session = request.getSession(); String name = (String) session.getAttribute("SessionName"); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 54. 53 out.println(name); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } 7.2.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Dynamic Web Application āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ ScopeDemo 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstSessionServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.3 āđāļĨāđ‰āļ§ Save 4. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondSessionServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.4 āđāļĨāđ‰āļ§ Save 7.2.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Session āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo 2. āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo 3. āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstSessionServlet 4. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondSessionServlet āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ 5. āļ—āļ”āļĨāļ­āļ‡āļ›āļīāļ” Web Browser āđāļĨāđ‰āļ§āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondSessionServlet āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 55. 54 7.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļš Application āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļąāļš āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļŦāļĢāļ·āļ­ JSP āļ—āļļāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Web Application āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ•āļĢāļēāļšāđƒāļ”āļ—āļĩāđˆ Web Server āļĒāļąāļ‡ deploy āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ­āļĒāļđāđˆ āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē Web Browser āļ‚āļ­āļ‡āļāļąāđˆāļ‡ client āļˆāļ°āļ›āļīāļ”āđ„āļ›āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄ āļāļēāļĢāļāļģāļŦāļ™āļ” āļ‚āļ­āļšāđ€āļ‚āļ•āđāļšāļš Application āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ setAttribute() āļāļąāļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Web Application āļ‹āļķāđˆāļ‡āđƒāļ™āđāļ•āđˆāļĨāļ° Web Application āļˆāļ°āļĄāļĩāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ­āļĒāļđāđˆāļŦāļ™āļķāđˆāļ‡āļ•āļąāļ§ āđāļĨāļ° āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļĄāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getServletContext() āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” String āļ—āļĩāđˆāļŠāļ·āđˆāļ­ name āđ„āļ§āđ‰āđƒāļ™ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ AppName āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ āļŠāļ™āļīāļ” ServletContext āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ String name = "Numnonda"; ServletContext context = getServletContext(); context.setAttribute("AppName", name); āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ attribute āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āļ—āļĩāđˆāļŠāļ·āđˆāļ­ AppName āđāļĨāļ°āļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ name āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getAttribute() āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļˆāļēāļāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” ServletContext āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ™āļĩāđ‰ ServletContext context = getServletContext(); String name = (String) context.getAttribute("AppName"); out.println(name); āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Object āđāļšāļš application āđ‚āļ”āļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ FirstAppServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.5 āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ SecondAppServlet āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāđˆāļ‡āļ­āļ­āļāļĄāļē āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨ āļ‹āļķāđˆāļ‡āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 7.6 Listing āļ—āļĩāđˆ 7.5 āđ‚āļ›āļĢāđāļāļĢāļĄ FirstAppServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class FirstAppServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String name = "Numnonda"; ServletContext context = getServletContext(); context.setAttribute("AppName", name); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 56. 55 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } Listing āļ—āļĩāđˆ 7.6 āđ‚āļ›āļĢāđāļāļĢāļĄ SecondAppServlet.java package servlet; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class SecondAppServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { ServletContext context = getServletContext(); String name = (String) context.getAttribute("AppName"); out.println(name); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } 7.3.1 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Application āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Dynamic Web Application āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ ScopeDemo 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ FirstServlet āđāļĨāđ‰āļ§āļāļ” Finish 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ FirstAppServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.5 āđāļĨāđ‰āļ§ Save 4. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” ScopeDemo āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ” Java Package āđ€āļ›āđ‡āļ™ servlet āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ SecondServlet āđāļĨāđ‰āļ§āļāļ” Finish āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ SecondAppServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 6.6 āđāļĨāđ‰āļ§ Save āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 57. 56 7.3.2 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŠāļēāļ˜āļīāļ•āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡ Object āđāļšāļš Application āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo 2. āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ ScopeDemo 3. āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ€āļĨāļ·āļ­āļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/FirstAppServlet 4. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondAppServlet āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ 5. āļ—āļ”āļĨāļ­āļ‡āļ›āļīāļ” Web Browser āđāļĨāđ‰āļ§āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/ScopeDemo/SecondAppServlet āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 58. 57 Exercise 8 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebBaseDB āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļēāļ™ āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡ Table āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ—āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļ”āļīāļĄāļ—āļĩāđˆ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āđ€āļĄāļ˜āļ­āļ” init() āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java 2. āđāļāđ‰āđ„āļ‚āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java 8.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet āļāļģāļŦāļ™āļ”āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļĄāļ˜āļ­āļ” init() āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāđ„āļĄāđˆ āđ€āļŦāļĄāļēāļ°āļŠāļĄāļ™āļąāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļ—āļļāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ āđ€āļĄāļ˜āļ­āļ” init() āļ—āļĩāđˆāļ‹āđ‰āļģāļāļąāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āļˆāļ°āļĄāļĩ Listener āļ­āļĒāļđāđˆāļŠāļ­āļ‡āļŠāļ™āļīāļ”āļ„āļ·āļ­ 1. Context Listener āđāļĨāļ° 2. Session Listener āđƒāļ™āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ Context Listener āļ‹āļķāđˆāļ‡āļĄāļąāļ™āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­ Web Application āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļŦāļĢāļ·āļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ€āļĢāļēāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— Context Listener āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļ‚āļĩāļĒāļ™ āļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Listener ( āļ„āļ·āļ­ Class āļ—āļĩāđˆ implements interface ServletContextListener ) 2. Implements method āļ—āļĩāđˆāļšāļąāļ‡āļ„āļąāļšāđƒāļ™ Interface āļ‚āļ­āļ‡ Listener āļ™āļąāđ‰āļ™āđ† āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ ServletContextListener āļĄāļąāļ™āļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļĄāļ·āđˆāļ­ Web Application āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ Connection āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™ ServletContext āđ€āļžāļ·āđˆāļ­āļĨāļ”āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āđƒāļ™āļāļēāļĢ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ‚āļĩāļĒāļ™āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļģāļ—āļĩāđˆ Method contextInitialized( ) āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­ Web Application āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 59. 58 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Listener āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ listener āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ Init āļāļ” Next āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļŠāđˆāļ­āļ‡ Lifecycle āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 8.1 āļĢāļđāļ›āļ—āļĩāđˆ 8.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener 2. āļ•āļĢāļ§āļˆāļŠāļ­āļš context.xml āļ§āđˆāļēāļĄāļĩāļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ–āđ‰āļēāđ„āļĄāđˆāļĄāļĩāđƒāļŦāđ‰ āđ€āļžāļīāđˆāļĄ Resource āļŠāļ™āļīāļ” DataSource āļĨāļ‡āđ„āļ›āļ—āļĩāđˆ Tomcat āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡ file context.xml āļ—āļĩāđˆ Folder WebContentMETA-INF <Context> <Resource Thanachart Numnonda and Thanisa Kruawaisayawan
  • 60. 59 name="jdbc/test" auth="Container" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test" username="root" password="root" > </Resource> </Context> 3. āđ€āļ‚āļĩāļĒāļ™ source code āļ­āļĒāļđāđˆāļ™āļ­āļāđ€āļĄāļ˜āļ­āļ”āđƒāļ”āđ† āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āđƒāļ™āđ€āļĄāļ˜āļ­āļ” contextInitialized āđāļĨāļ° contextDestroyed āđ€āļžāļ·āđˆāļ­ āļ—āļģāļāļēāļĢāļ‚āļ­ Datasource āļˆāļēāļ Container āļŠāđˆāļ§āļ™āļ•āļąāļ§āđāļ›āļĢ ds āļ—āļĩāđˆāļĢāļąāļšāđ€āļ›āđ‡āļ™ Instance Member @Resource(name="jdbc/test") private DataSource jdbcTest; private Connection conn; āđ€āļžāļīāđˆāļĄ source code (āļ‚āđ‰āļ­ 4 - 5) āđƒāļ™ āđ€āļĄāļ˜āļ­āļ” contextInitialized āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄ connection āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™ 4. āļ‚āļ­ Connection āļˆāļēāļ Datasource conn = ds.getConnection(); 5. āļ™āļģ Connection āđ„āļ›āđ€āļāđ‡āļšāļ—āļĩāđˆ ServletContext āđāļĨāđ‰āļ§ āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ context variable āđ€āļ›āđ‡āļ™ connection (arg0 āļ„āļ·āļ­ instance āļ‚āļ­āļ‡ ServletContextEvent āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāđƒāļŦāđ‰āļ—āļēāļ‡ argument) arg0.getServletContext().setAttribute("connection", conn); 6. āđ€āļžāļīāđˆāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđƒāļ™āđ€āļĄāļ˜āļ­āļ” contextDestroyed āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļĨāļēāļĒ Database Connection āļāļĢāļ“āļĩ Web Application āļŦāļĒāļļāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ public void contextDestroyed(ServletContextEvent arg0) { try{ conn.close(); } catch (SQLException ex) { Logger.getLogger(Init.class.getName()).log(Level.SEVERE, null, ex); } } āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ Init.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 8.1 Listing āļ—āļĩāđˆ 8.1 āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java package listener; import java.sql.Connection; import java.sql.SQLException; import javax.annotation.Resource; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.sql.DataSource; public class Init implements ServletContextListener { @Resource(name="jdbc/test") private DataSource jdbcTest; private Connection conn; āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 61. 60 public void contextInitialized(ServletContextEvent arg0) { try { conn = jdbcTest.getConnection(); arg0.getServletContext().setAttribute("connection", conn); } catch (SQLException e) { e.printStackTrace(); } } public void contextDestroyed(ServletContextEvent arg0) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } 8.2 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āļˆāļ°āļĄāļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĢāļēāļˆāļķāļ‡āļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļēāļ™ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒ AddBookServlet.java āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđƒāļŦāđ‰āļĨāļšāļ„āļģāļŠāļąāđˆāļ‡ @Resource(name = "jdbc/test") private DataSource jdbcTest; 2. āđāļāđ‰āđ„āļ‚āđ€āļĄāļ˜āļ­āļ” init() āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ public void init() { conn = (Connection) getServletContext().getAttribute("connection"); } āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java āđƒāļŦāļĄāđˆāļ”āļąāļ‡ Listing āļ—āļĩāđˆ 8.2 Lisitng āļ—āļĩāđˆ 8.2 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookServlet.java package controller; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/addBook.do") public class AddBookServlet extends HttpServlet { private static final long serialVersionUID = 1L; private Connection conn; public void init() { conn = (Connection) getServletContext().getAttribute("connection"); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 62. 61 } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Add a new book</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1> Add a new book </h1>"); try { String isbn = request.getParameter("isbn"); String author = request.getParameter("author"); String title = request.getParameter("title"); String priceStr = request.getParameter("price"); float price = Float.parseFloat(priceStr); Statement stmt = conn.createStatement(); String sql = "INSERT INTO books VALUES('" + isbn + "','" + title + "','" + author + "'," + price + ")"; int numRow = stmt.executeUpdate(sql); RequestDispatcher obj = request .getRequestDispatcher("Thankyou.html"); if (numRow == 1 && obj != null) { obj.forward(request, response); } } catch (SQLException ex) { out.println("Error " + ex); return; } out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } 8.3 āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB 2. Run āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĢāļąāļ™ MySQL Database Server āļāđˆāļ­āļ™ 3. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļē addBook.html āđƒāļŦāđ‰āđ€āļĢāļēāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ āļ‹āļĩāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļāļ” OK āļœāļĨāļĨāļąāļžāļ˜āđŒāļāđ‡āļˆāļ°āļ–āļđāļāļšāļąāļ™āļ—āļķāļāļĨāļ‡ Table books āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđāļšāļšāļāļķāļāļŦāļąāļ”āļ—āļĩāđˆ 5 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 63. 62 Exercise 9 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ€āļžāļ·āđˆāļ­āļ­āļ˜āļīāļšāļēāļĒāļāļēāļĢāđƒāļŠāđ‰ Servlet Filter āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆ āļŠāļ­āļšāļāļēāļĢ login āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļšāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āļˆāļ°āļ–āļđāļ Filter āđ€āļĢāļĩāļĒāļāđ€āļžāļ·āđˆāļ­ āļ•āļąāļ§āļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢ login āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ 9.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™ Web Application āļ‹āļķāđˆāļ‡āļˆāļ°āļ”āļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđƒāļ”āđ† āđāļĨāđ‰āļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđāļāđ‰āđ„āļ‚āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” request āđāļĨāļ° response āļāđˆāļ­āļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ•āđˆāļ­āđ„āļ› āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āļ„āļ·āļ­ â— āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet āļŦāļĢāļ·āļ­āļāļēāļĢāļ—āļģ Authentication ● āļāļēāļĢāļšāļĨāđ‡āļ­āļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet āļŦāļĢāļ·āļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Servlet ● āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āļˆāļ°āđ€āļ›āđ‡āļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ Java āļ—āļĩāđˆ implements āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļŸāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Filter āđāļĨāļ°āļĄāļĩāđ€āļĄāļ˜āļ­āļ”āļŦāļĨāļąāļāļ„āļ·āļ­ init( ), destroy( ) āđāļĨāļ° doFilter( ) āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ URL āđƒāļ”āđ† āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ–āļđāļ Filter āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet Filter āđƒāļ”āđ† āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē annotation āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļ„āļģāļŠāļąāđˆāļ‡ @WebFilter("*") public class LoginFilter implements Filter { â€Ķ } āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ URL āļ—āļļāļāļ•āļąāļ§āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Web Application āļ™āļĩāđ‰ āļ•āđ‰āļ­āļ‡āļ–āļđāļāļ”āļąāļāđ‚āļ”āļĒ Servlet Filter āļ—āļĩāđˆ āļŠāļ·āđˆāļ­ LoginFilter āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩ Web Page āļ—āļĩāđˆāļŠāļ·āđˆāļ­ login.html āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļš āļ„āđˆāļē username āđāļĨāļ° password āļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āļŦāļēāļāļ–āļđāļāļ•āđ‰āļ­āļ‡āļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ—āļĩāđˆāļŠāļ·āđˆāļ­ loginFlag āđ€āļ›āđ‡āļ™ true (āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļ‚āļ­āļšāđ€āļ‚āļ•āļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ loginFlag āđ€āļ›āđ‡āļ™āđāļšāļš Session āđ‚āļ”āļĒāļāļēāļĢ setAttribute āđƒāļŦāđ‰āļāļąāļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession ) āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ™āļĩāđ‰āļĒāļąāļ‡āļĄāļĩ Servlet Filter āļ—āļĩāđˆāļŠāļ·āđˆāļ­ LoginFilter āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ LoginFlag āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āļ–āđ‰āļēāļŦāļēāļāđ„āļĄāđˆāļžāļšāļŦāļĢāļ·āļ­āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ false āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĢāļ°āļšāļļ HTTP Error 401 (This request requires HTTP authentication . ) āļŠāļļāļ”āļ—āđ‰āļēāļĒāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ ShowServlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē HelloWorld āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡ āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ–āļđāļāļ”āļąāļāđ‚āļ”āļĒ LoginFilter Thanachart Numnonda and Thanisa Kruawaisayawan
  • 64. 63 9.2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āđ‰āļē Login āļŦāļ™āđ‰āļē Login āļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­ login.html āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™ web page āļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.1 āđāļĨāļ°āļĄāļĩ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 9.1 āļ™āļ­āļāļˆāļēāļāļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ username āđāļĨāļ° password āļžāļĢāđ‰āļ­āļĄāļ—āļąāđ‰āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ thana āđāļĨāļ° secret āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļŦāļēāļāđƒāļŠāđˆāļāđ‡āļˆāļ°āļāļģāļŦāļ™āļ”āļ„āđˆāļē āļ•āļąāļ§āđāļ›āļĢ loginFlag āđ€āļ›āđ‡āļ™ true āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” HttpSession āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.2 āļĢāļđāļ›āļ—āļĩāđˆ 9.1 āđ€āļ§āđ‡āļšāļŦāļ™āđ‰āļē Login Listing āļ—āļĩāđˆ 9.1 āđ‚āļ›āļĢāđāļāļĢāļĄ login.html <html> <head><title>Login Page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form action="LoginServlet" method="POST"> UserName: <input name="username" /> <br> Password: <input type="password" name="password" /> <br> <input type="submit" value="Login" /> </form> </body> </html> Listing āļ—āļĩāđˆ 9.2 āđ‚āļ›āļĢāđāļāļĢāļĄ LoginServlet.java package controller; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean loginflag=false; try{ String username =request.getParameter("username"); String password =request.getParameter("password"); System.out.println("input username="+username + ": password="+password); if(username.equals("thana") && password.equals("secret")){ loginflag=true; } request.getSession().setAttribute("loginFlag", loginflag); response.sendRedirect("show.do"); }catch (Exception e) { e.printStackTrace(); } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 65. 64 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Short description"; } } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ” Project āđ€āļ›āđ‡āļ™ FilterDemo āđāļĨāđ‰āļ§āļāļ” Finish 2. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ login.html āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → HTML File āļāļģāļŦāļ™āļ” HTML File Name āđ€āļ›āđ‡āļ™ login āđāļĨāđ‰āļ§āļāļ” Finish 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ login.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.1 āđāļĨāđ‰āļ§ Save 4. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ LoginServlet.java āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ controller āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ LoginServlet.java āđāļĨāđ‰āļ§āļāļ” Finish āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ LoginServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.2 āđāļĨāđ‰āļ§ Save 9.3 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Servlet Filter āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ loginFlag āđāļĨāļ°āļŦāļēāļāđ„āļĄāđˆāļžāļšāļŦāļĢāļ·āļ­āļĄāļĩāļ„āđˆāļēāđ€āļ›āđ‡āļ™ false āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļĢāļ°āļšāļļ HTTP Error 401 (Unauthorize) āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter āļˆāļ°āļĄāļĩ source code āļŦāļĨāļąāļ āļ­āļĒāļđāđˆāļ—āļĩāđˆ āđ€āļĄāļ˜āļ­āļ” doFilter() āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.3 āļāļĢāļ“āļĩāļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ URL āđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ *.do āļˆāļķāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Filter āļ—āļĩāđˆāļŠāļ·āđˆāļ­ LoginFilter āđƒāļŦāđ‰āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āļŠāļĢāđ‰āļēāļ‡ Filter Listing āļ—āļĩāđˆ 9.3 āđ€āļĄāļ˜āļ­āļ” doFilter() āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ LoginFilter.java package filter; import javax.servlet.*; import javax.servlet.http.*; @WebFilter("*.do") public class LoginFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpSession session = req.getSession(); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 66. 65 Boolean flag = (Boolean) session.getAttribute("loginFlag"); boolean loginFlag; if (flag == null) { loginFlag = false; } else { loginFlag = flag; } if (!loginFlag) { HttpServletResponse res = (HttpServletResponse) response; res.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { } } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” FilterDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New > Other.. 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New File āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Categories āļ—āļĩāļŠāļ·āđˆāļ­ Web āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡ File Types āļ•āđˆāļēāļ‡āđ† āļ āļēāļĒāđƒāļ•āđ‰ Category āļ™āļĩāđ‰ āđƒāļŦāđ‰āđ€āļĢāļēāđ€āļĨāļ·āļ­āļ Filter āđāļĨāđ‰āļ§āļāļ” Next 3. āļāļģāļŦāļ™āļ” Class Name: āđ€āļ›āđ‡āļ™ LoginFilter āđāļĨāļ° Java Package āđ€āļ›āđ‡āļ™ filter āđāļĨāđ‰āļ§āļāļ” Next 4. āđƒāļ™āļŦāļ™āđ‰āļēāļ–āļąāļ”āđ„āļ› āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āđˆāļēāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.2 āđāļĨāđ‰āļ§āļāļ” Finish āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 67. 66 āļĢāļđāļ›āļ—āļĩāđˆ 9.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ‚āļ­āļ‡ Filter 5. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡āđ€āļĄāļ˜āļ­āļ” doFilter() āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ LoginFilter.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.3 āđāļĨāđ‰āļ§ Save Thanachart Numnonda and Thanisa Kruawaisayawan
  • 68. 67 9.4 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē Hello World āđāļĨāļ°āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ Filter source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.4 Listing āļ—āļĩāđˆ 9.4 āđ€āļĄāļ˜āļ­āļ” processRequest() āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ShowServlet.java protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); try { out.println("<html>"); out.println("<head>"); out.println("<title>Servlet ShowServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1> Hello World </h1>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ FilterDemo āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Servlet āļāļģāļŦāļ™āļ”āļ„āđˆāļē Java Package āđ€āļ›āđ‡āļ™ view āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ ShowServlet 2. āļāļģāļŦāļ™āļ” URL Mapping āđ€āļ›āđ‡āļ™ /show.do āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 9.3 āđāļĨāđ‰āļ§āļāļ” Finish āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 69. 68 āļĢāļđāļ›āļ—āļĩāđˆ 9.3 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē URL pattern 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ ShowServlet.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 9.4 āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Save 9.5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ FilterDemo 2. āļ—āļģāļāļēāļĢ Run āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ FilterDemo 3. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/FilterDemo/show.do āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” HTTP 401 4. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/FilterDemo/login.html āđāļĨāđ‰āļ§āļ›āđ‰āļ­āļ™ username āđ€āļ›āđ‡āļ™ thana āđāļĨāļ° password āđ€āļ›āđ‡āļ™ secret āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 70. 69 Exercise 10 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ­āļ­āļāļ—āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđ‚āļ”āļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB āđ€āļžāļ·āđˆāļ­āđ€āļ•āļīāļĄ 10.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āļ§āļąāļ™āđ€āļ§āļĨāļēāļ‚āļ­āļ‡ Web Server āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ° āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđāļšāļš dynamic content āļˆāļķāļ‡āļ•āđ‰āļ­āļ‡āļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļē JSP āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļ”āļīāļĄ (WebBaseDB) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ hello āđāļĨāđ‰āļ§āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.1 āļĢāļđāļ›āļ—āļĩāđˆ 10.1 āļŠāļĢāđ‰āļēāļ‡ JSP file 2. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ hello.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 10.1 3. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB 4. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ hello.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄ 5. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 71. 70 Listing āļ—āļĩāđˆ 10.1 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>Hello JSP</title></head> <body> <h1>My First JSP</h1> Hello : Current time is : <%= new java.util.Date() %> </body> </html> āļĢāļđāļ›āļ—āļĩāđˆ 10.2 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ hello.jsp 10.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ standard tags āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™ JSTL āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™ source code āļ āļēāļĐāļē Java āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰ 10.2.1 āļāļēāļĢāļāļģāļŦāļ™āļ” Tag Library āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JSTL āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ Taglib āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ›āļĢāļ°āļāļēāļĻ Library āļ”āļąāļ‡āļ™āļĩāđ‰ (Project āļŦāļĢāļ·āļ­ Web Server āļ•āđ‰āļ­āļ‡āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™ Library .jar āļ‚āļ­āļ‡ JSTL āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™ āļ­āļēāļˆāļ•āđ‰āļ­āļ‡ download āđ€āļžāļīāđˆāļĄ) <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 10.2.2 āļāļēāļĢāļāļģāļŦāļ™āļ” Datasource āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ DataSource āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ– āļāļģāļŦāļ™āļ”āđ„āļ”āđ‰āļŠāļ­āļ‡āļ§āļīāļ˜āļĩ 1. āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩ datasource āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ­āļąāļ™āđ€āļ”āļīāļĄāđ„āļ”āđ‰āđ€āļĨāļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ jdbc/test āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ dataSource āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆāļ­āļĩāļ 2. āļāļĢāļ“āļĩāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩ datasource āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ setDataSource āđ€āļ›āđ‡āļ™ Tag āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļ•āļēāļĄāļŠāļ·āđˆāļ­āļ—āļĩāđˆāļāļģāļŦāļ™āļ” āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļēāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ WebBaseDB āļˆāļ°āļĄāļĩ Datasource āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āđāļ•āđˆāđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ” Datasource āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļŠāļ·āđˆāļ­ newdatasource āļ”āļąāļ‡āļ™āļĩāđ‰ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 72. 71 <sql:setDataSource var="newdatasource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql:///test" user="root" password="root"/> āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ—āļĩāđˆ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ jdbc:mysql:///test *āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ URL āļ‚āļ­āļ‡ DB āđ„āļ”āđ‰ 2 āđāļšāļš āļ„āļ·āļ­ jdbc:mysql://localhost:3306/test āļŦāļĢāļ·āļ­ jdbc:mysql:///test āļ„āļģāļŠāļąāđˆāļ‡ sql:query āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™ DataSource āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ jdbc/test āļŦāļĢāļ·āļ­ āļ•āļąāļ§āđāļ›āļĢ newdatasource āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp āđ€āļĢāļēāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ SQL āļ„āļ·āļ­ select * from books āđ‚āļ”āļĒāđƒāļŠāđ‰ āļ„āļģāļŠāļąāđˆāļ‡ sql:query āļ”āļąāļ‡āļ™āļĩāđ‰ <sql:query var="db" dataSource="jdbc/test"> SELECT * FROM books </sql:query> āļŦāļĢāļ·āļ­ <sql:query var="db" dataSource="${newdatasource}"> SELECT * FROM books </sql:query> 10.2.3 āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ c:forEach āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨ āļāļēāļĢāđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢ Query āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰ āļāļēāļĢāđāļˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāļĨāļ°āđāļ–āļ§āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ c:forEach āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāļ°āļŠāļ·āđˆāļ­āļœāļđāđ‰āđāļ•āđˆāļ‡ āđ‚āļ”āļĒāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ <c:forEach var="row" items="${db.rows}"> ${row.title} : ${row.author} <br> </c:forEach> āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰ āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” WebBaseDB āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ viewBook āđāļĨāđ‰āļ§āļāļ” Finish 2. āđ€āļžāļīāđˆāļĄ JSTL Library āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ JSP āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ (Download file jstl-1.2.jar āđāļĨāļ° jstl-api-1.2.jar āļˆāļēāļ http://jstl.java.net/download.html) āļ™āļģ .Jar File āļ—āļąāđ‰āļ‡ 2 āđ„āļ›āđ„āļ§āđ‰āļ—āļĩāđˆ folder {$TOMCAT}lib āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ path āļ‚āļ­āļ‡āļ—āļĩāđˆ install Apache Tomcat āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 10.3 āļĢāļđāļ›āļ—āļĩāđˆ 10.3 āļāļēāļĢāđ€āļžāļīāđˆāļĄ JSTL Library āļšāļ™ Apache Tomcat āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 73. 72 āđ€āļĄāļ·āđˆāļ­āļ”āļđāļ—āļĩāđˆ Project → Java Resource → Libraries → Apache Tomcat v6.0 āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩ JSTL āđ€āļžāļīāđˆāļĄāđāļĨāđ‰āļ§ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāļĩāđˆ 10.4 āļĢāļđāļ›āļ—āļĩāđˆ 10.4 JSTL Library āļ—āļĩāđˆ Apache Tomcat āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ viewBook.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 10.2 4. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ WebBaseDB 5. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ viewBook.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄ 6. āļ—āļĩāđˆ Web Browser āđ€āļ›āļĨāļĩāđˆāļĒāļ™ URL āđ€āļ›āđ‡āļ™ http://localhost:8080/WebBaseDB/viewBook.jsp āļˆāļ°āđ„āļ”āđ‰ āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 10.5 āļĢāļđāļ›āļ—āļĩāđˆ 10.5 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡ viewBook.jsp Listing āļ—āļĩāđˆ 10.2 āđ‚āļ›āļĢāđāļāļĢāļĄ viewBook.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>JSP Page</h1> <sql:setDataSource var="newdatasource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql:///test" user="root" password="root" /> <sql:query var="db" dataSource="${newdatasource}"> SELECT * FROM books </sql:query> <c:forEach var="row" items="${db.rows}"> ${row.title} : ${row.author} <br> </c:forEach> </body> </html> Thanachart Numnonda and Thanisa Kruawaisayawan
  • 74. 73 Exercise 11 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Online Book Store āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ° āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ Web Form āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ āđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļ­āļ­āļāļĄāļēāļ—āļēāļ‡āđ€āļ§āđ‡āļšāđ€āļžāļˆ 11.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ Web Form āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.6 āļ—āļąāđ‰āļ‡āļ™āļĩāđ‰ Web Form āļ™āļĩāđ‰ āļˆāļ°āđ€āļĢāļĩāļĒāļ url āļ—āļĩāđˆāļŠāļ·āđˆāļ­ processSelection āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ Select āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ SQL tags āļ‚āļ­āļ‡ JSTL āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡ āļĢāļēāļĒāļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™ Listing āļ—āļĩāđˆ 11.1 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Web-Base Application āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 2. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.1 āļĢāļđāļ›āļ—āļĩāđˆ 11.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application 3. āđ€āļĨāļ·āļ­āļāļĢāļđāļ› Folder āļŠāļ·āđˆāļ­ Web āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Dynamic Web Project āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.2 āļĢāļđāļ›āļ—āļĩāđˆ 11.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Web Application āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 75. 74 4. āđƒāļŦāđ‰āļāļģāļŦāļ™āļ” Project Name: āđ€āļ›āđ‡āļ™ BookOnline āļŠāđˆāļ§āļ™āļāļēāļĢāđ€āļāđ‡āļš File Eclipse āļˆāļ°āđƒāļŠāđ‰ Directory āļ—āļĩāđˆāļ–āļēāļĄāđ€āļĄāļ·āđˆāļ­āļ„āļĢāļąāđ‰āļ‡āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™ Default āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāļīāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļ­āļ (Uncheck) āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļ Directory āđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.3 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” āļ›āļļāđˆāļĄ Next āļĢāļđāļ›āļ—āļĩāđˆ11.3 āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ 5. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Folder āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output folder (āļ—āļĩāđˆāđ€āļāđ‡āļš Class file) āļ„āļ·āļ­ [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]src āđāļĨāļ° [directory āļ—āļĩāđˆāđƒāļŠāđˆāļāđˆāļ­āļ™āļĢāļąāļ™ Eclipse]buildclasses āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.4 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Next āļĢāļđāļ›āļ—āļĩāđˆ 11.4 āđāļŠāļ”āļ‡āļ—āļĩāđˆāđ€āļāđ‡āļš source code āđāļĨāļ° Output directory Thanachart Numnonda and Thanisa Kruawaisayawan
  • 76. 75 6. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡ Context root āđāļĨāļ° Content directory āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.5 āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Finish āļĢāļđāļ›āļ—āļĩāđˆ 11.5 āđāļŠāļ”āļ‡āļŠāļ·āđˆāļ­ Context root āđāļĨāļ° Content directory 7. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project BookOnline āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File āļāļģāļŦāļ™āļ”āļ„āđˆāļē JSP File Name āđ€āļ›āđ‡āļ™ selectBooks āđāļĨāđ‰āļ§āļāļ” Finish 8. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ selectBooks.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.1 9. āļāļ”āļ›āļļāđˆāļĄ Save 10. āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 11.6 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 77. 76 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 79. 78 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 80. 79 āļĢāļđāļ›āļ—āļĩāđˆ 11.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp Listing āļ—āļĩāđˆ 11.1 āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <!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>JSP Page</title> </head> <body> <sql:setDataSource var="ds" driver="com.mysql.jdbc.Driver" url="jdbc:mysql:///test" user="root" password="root" /> <sql:query var="rs" dataSource="${ds}"> select * from books </sql:query> <h1>Select Books</h1> <form action="ProcessSelection" method="POST"> āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 81. 80 <table border="1"> <thead> <tr> <th></th> <th> Title </th> <th> Author </th> <th> Price</th> </tr> </thead> <tbody> <c:forEach var="book" items="${rs.rows}"> <tr> <td><input type="checkbox" name="isbn" value="${book.isbn}" /> </td> <td>${book.title}</td> <td>${book.author}</td> <td>${book.price}</td> </tr> </c:forEach> </tbody> </table> <input type="submit" value="Select" /> </form> </body> </html> 11.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļĄāļĩ attribute āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.2 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Class.. 2. āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ model āđāļĨāļ° Class Name āđ€āļ›āđ‡āļ™ Book āļāļ” Finish āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.7 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 82. 81 āļĢāļđāļ›āļ—āļĩāđˆ 11.7 āļāļēāļĢ New Class Book.java āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ JavaBean āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļš Table 3. āđ€āļžāļīāđˆāļĄ attribute āļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ BookActionForm āļ”āļąāļ‡āļ™āļĩāđ‰ private String isbn; private String author; private String title; private double price; āļŦāļĢāļ·āļ­ private String isbn,author,title; private double price; 4. āļ—āļģāļāļēāļĢ encapsulate attribute (āļŠāļĢāđ‰āļēāļ‡āđ€āļĄāļ˜āļ­āļ” getter āđāļĨāļ° setter) āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āļ‚āļ­āļ‡ source code āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source > Generate Getters and Setters... āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.8 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 83. 82 āļĢāļđāļ›āļ—āļĩāđˆ 11.8 āļāļēāļĢ New Class Book.java āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ JavaBean āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļš Table 5. āđ€āļĨāļ·āļ­āļāļ§āđˆāļēāļˆāļ°āļŠāļĢāđ‰āļēāļ‡ getters āļŦāļĢāļ·āļ­ setters āļŦāļĢāļ·āļ­āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ­āļĒāđˆāļēāļ‡ āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļ Check box āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.9 āđāļĨāđ‰āļ§āļāļ” OK Thanachart Numnonda and Thanisa Kruawaisayawan
  • 84. 83 āļĢāļđāļ›āļ—āļĩāđˆ 11.9 āļāļģāļŦāļ™āļ” Encapsulation āđƒāļŦāđ‰ Attribute āļŦāļĢāļ·āļ­ Instance Member Listing āļ—āļĩāđˆ 11.2 āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java package model; public class Book { private String isbn,author,title; private double price; public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } 11.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java āđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒāļāļąāļš shopping cart āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” Book āļ•āļēāļĄāļĢāļēāļĒāļāļēāļĢ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļ āđ‚āļ”āļĒāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ isbn āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ„āđ‰āļ™āļĢāļēāļĒāļŠāļ·āđˆāļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļˆāļēāļ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ books āļŦāļĄāļēāļĒāđ€āļĨāļ‚ isbn āļ—āļĩāđˆāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ āđāļĨāđ‰āļ§āļˆāļ°āđāļ›āļĨāļ‡āđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” books āļāđˆāļ­āļ™āļˆāļ°āđƒāļŠāđˆāļĨāļ‡āđƒāļ™ cart āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.3 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Class āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ model , Class Name āđ€āļ›āđ‡āļ™ Cart.java āļāļ” Finish 2. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ Cart.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.3 āđāļĨāđ‰āļ§ Save Listing āļ—āļĩāđˆ 11.3 āđ‚āļ›āļĢāđāļāļĢāļĄ Cart.java package model; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 85. 84 import java.sql.Statement; import java.util.LinkedList; import java.util.List; public class Cart { List <Book> books; Connection conn; public void addItem(String isbn) { try { Statement stmt = conn.createStatement(); String sql = "SELECT * from books where isbn='" + isbn + "'"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { Book bk = new Book(); bk.setIsbn(isbn); bk.setAuthor(rs.getString("author")); bk.setTitle(rs.getString("title")); bk.setPrice(rs.getFloat("price")); books.add(bk); } } catch (SQLException ex) { ex.printStackTrace(); } } public List<Book> getBooks() { return books; } public Cart(Connection conn) { this.conn = conn; books = new LinkedList<Book>(); } public void removeItem(String isbn) { books.remove(isbn); } } 11.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java āđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ isbn āļ‹āļķāđˆāļ‡ āļŠāđˆāļ‡āļĄāļēāļˆāļēāļāļŦāļ™āđ‰āļē Web Form āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ selectBooks.java āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getParameterValues āļ”āļąāļ‡āļ™āļĩāđ‰ String[] isbn = request.getParameterValues("isbn"); āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ session āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āļ­āļ­āļāļĄāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ (āļ—āļģ Casting āđ€āļ›āđ‡āļ™ Cart āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ HttpSession.getAttribute āļĄāļąāļ™ Return Reference āļŠāļ™āļīāļ” Object āļ­āļ­āļāļĄāļē) HttpSession session = request.getSession(true); Cart cart = (Cart) session.getAttribute("cart"); āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļžāļš attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļāđ‡āļš attribute āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ if (cart == null) { ServletContext ctx = getServletContext(); Connection conn = (Connection) ctx.getAttribute("connection"); cart = new Cart(conn); session.setAttribute("cart", cart); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 86. 85 } āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ„āđˆāļē attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ cart āļĄāļēāđāļĨāđ‰āļ§ āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļāļēāļĢāļŠāļ·āđˆāļ­ isbn āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļāļĨāļ‡āđƒāļ™ āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‚āļ­āļ‡ cart āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ for (int i = 0; i < isbn.length; i++) { cart.addItem(isbn[i]); } āđ€āļĄāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđ„āļ›āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ view.cart āļ•āđˆāļ­āđ„āļ› āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ RequestDispatcher pg = request.getRequestDispatcher("viewCart.jsp"); pg.forward(request, response) āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļĩ source code āļ‚āļ­āļ‡āđ€āļĄāļ˜āļ­āļ” processRequest āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.4 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Projects BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → Servlet āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ controller , Class Name āđ€āļ›āđ‡āļ™ ProcessSelection 2. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđ€āļ‚āļĩāļĒāļ™ Source code āļ‚āļ­āļ‡ ProcessSelection.java āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.4 āđāļĨāđ‰āļ§ Save āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 87. 86 Listing āļ—āļĩāđˆ 11.4 āđ€āļĄāļ˜āļ­āļ” processRequest() āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ProcessSelection.java package controller; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import model.Cart; public class ProcessSelection extends HttpServlet { private static final long serialVersionUID = 1L; public ProcessSelection() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); String[] isbn = request.getParameterValues("isbn"); HttpSession session = request.getSession(true); Cart cart = (Cart) session.getAttribute("cart"); if (cart == null) { ServletContext ctx = getServletContext(); Connection conn = (Connection) ctx.getAttribute("connection"); cart = new Cart(conn); session.setAttribute("cart", cart); } for (int i = 0; i < isbn.length; i++) { cart.addItem(isbn[i]); } cart = (Cart) session.getAttribute("cart"); RequestDispatcher pg = request.getRequestDispatcher("viewCart.jsp"); pg.forward(request, response); out.close(); } } Thanachart Numnonda and Thanisa Kruawaisayawan
  • 88. 87 11.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— ServletContextListener āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĄāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āđāļĨāđ‰āļ§āđ€āļāđ‡āļšāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ connection āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™ ServletContext āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Init.java āđƒāļ™ Exercise 7 āļāļēāļĢāļžāļąāļ’āļ™āļē WebBase DB āđ‚āļ”āļĒāļ„āļĨāļēāļŠāļ›āļĢāļ°āđ€āļ āļ— Web Listener (āļŦāļ™āđ‰āļē 55) āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ context.xml āđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Exercise āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ Listing āļ—āļĩāđˆ 11.5 Source Code āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Init.java package listener; import java.sql.Connection; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Resource; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.sql.DataSource; public class Init implements ServletContextListener { public Init() { // TODO Auto-generated constructor stub } @Resource(name = "jdbc/test") private DataSource ds; private Connection conn; public void contextInitialized(ServletContextEvent arg0) { try { Connection conn; conn = ds.getConnection(); arg0.getServletContext().setAttribute("connection", conn); System.out.println("Book Online : MySQL Connection Created "); } catch (SQLException e) { e.printStackTrace(); } } public void contextDestroyed(ServletContextEvent arg0) { try { conn.close(); System.out.println("Book Online : MySQL Connection Destroyed"); } catch (SQLException ex) { Logger.getLogger(Init.class.getName()).log(Level.SEVERE, null, ex); } } } 11.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļĨāļ·āļ­āļ āđāļĨāļ°āđ€āļāđ‡āļšāđƒāļ™ shopping cart āļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Expression Language āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ session āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.6 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project BookOnline āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → JSP File āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ viewCart āđāļĨāđ‰āļ§āļāļ” Finish 2. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ viewCart.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 11.6 āđāļĨāđ‰āļ§ Save āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 89. 88 Listing āļ—āļĩāđˆ 11.6 āđ‚āļ›āļĢāđāļāļĢāļĄ viewCart.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!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>Cart</title> </head> <body> <h1>Selected Books in Cart</h1> <c:forEach var="book" items="${sessionScope.cart.books}"> ${book.title} <br> </c:forEach> </body> </html> 11.7 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ BookOnline 2. āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/BookOnline/selectBooks.jsp āļ—āļ”āļĨāļ­āļ‡āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Select āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/BookOnline/processSelection āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđƒāļ™ Cart āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 11.10 3. āļ—āļ”āļĨāļ­āļ‡āļāļĨāļąāļšāđ„āļ›āđ€āļĨāļ·āļ­āļāļĢāļēāļĒāļāļēāļĢāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļ URL āļ—āļĩāđˆāļŠāļ·āđˆāļ­ http://localhost:8080/BookOnline/viewCart.jsp āđ‚āļ”āļĒāļ•āļĢāļ‡āđāļĨāđ‰āļ§āļŠāļąāļ‡āđ€āļāļ•āļœāļĨāļĨāļąāļžāļ˜āđŒ āļĢāļđāļ›āļ—āļĩāđˆ 11.10 āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Cart Thanachart Numnonda and Thanisa Kruawaisayawan
  • 90. 89 Exercise 12 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tags āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ - āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ custom tag āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļīāđˆāļĄāđāļŠāļ”āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ JSP āđ‚āļ”āļĒāđ„āļĄāđˆāđƒāļŠāđ‰ custom tags āđāļĨāđ‰āļ§āļŠāļĢāđ‰āļēāļ‡ tag āđ‚āļ”āļĒāđƒāļŠāđ‰ Tag Handler āđāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ tag āđ‚āļ”āļĒāđƒāļŠāđ‰ Tag File āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ§āđˆāļē Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāļ—āļĩāđˆ xxxx āļ„āļ·āļ­ āļŠāļ·āđˆāļ­āļ—āļĩāđˆāļŠāđˆāļ‡āļĄāļēāļ—āļēāļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ name 12.1 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ scriptlet āđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĐāļēāļˆāļēāļ§āļē āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢ āļ­āđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„ request āļ—āļĩāđˆāļŠāļ·āđˆāļ­ name āđāļĨāđ‰āļ§āļˆāļ°āļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰ āļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.1 āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ JSPDemo 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ hello 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ hello.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.1 4. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ JSPDemo 5. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ hello.jsp āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Run āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŦāđ‰āļŠāđˆāļ‡āļœāđˆāļēāļ™āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļēāļ‡ URL āđ€āļŠāđˆāļ™ http://localhost:8080/JSPDemo/hello.jsp?name=Thanisa āđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļāļēāļĢāļĢāļąāļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.1 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 91. 90 Listing āļ—āļĩāđˆ 12.1 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Demo</title> </head> <body> <h1>JSP Demo</h1> <% String name = request.getParameter("name"); %> <% for (int i = 0; i < 10; i++) { %> Hello <%= name %> <br> <% } %> </body> </html> Thanachart Numnonda and Thanisa Kruawaisayawan
  • 93. 92 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 95. 94 āļĢāļđāļ›āļ—āļĩāđˆ 12.1 āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp Thanachart Numnonda and Thanisa Kruawaisayawan
  • 96. 95 12.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāđāļ•āđˆāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JSP Standard Tag Library āđƒāļ™āļāļēāļĢāļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxx āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āđāļ—āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ„āļģāļŠāļąāđˆāļ‡ scriptlet āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ° āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.2 āđāļĨāļ°āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āđ€āļĨāļ·āļ­āļ New → JSP File āļāļģāļŦāļ™āļ” JSP File Name āđ€āļ›āđ‡āļ™ helloJSTL āđāļĨāđ‰āļ§āļāļ” Finish 2. āļ•āļĢāļ§āļˆāļŠāļ­āļš JSTL Libraries āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ‡āļēāļ™ āļ–āđ‰āļēāđ„āļĄāđˆāļĄāļĩāđƒāļŦāđ‰āļ—āļģāļāļēāļĢ import āđ€āļ‚āđ‰āļēāļĄāļē āļ•āļēāļĄāļŦāļąāļ§āļ‚āđ‰āļ­ 2. āđ€āļžāļīāđˆāļĄ JSTL Library āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ JSP āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ (āļŦāļ™āđ‰āļēāļ—āļĩāđˆ 66) āļĢāļđāļ›āļ—āļĩāđˆ 12.2 āļ•āļĢāļ§āļˆāļŠāļ­āļš Library āļ‚āļ­āļ‡ JSTL 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloJSTL.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.2 4. āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ” URL āđ€āļ›āđ‡āļ™ http://localhost:8080/JSPDemo/helloJSTL.jsp?name=Thanisa āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp Listing āļ—āļĩāđˆ 12.2 āđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Demo</title> </head> <body> <h1>JSP Demo</h1> <c:forEach begin="1" end="10"> Hello ${param.name} <br> </c:forEach> </body> </html> āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 97. 96 12.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp JSP 2.0 āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļĢāļēāļŠāļĢāđ‰āļēāļ‡ custom tag āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļŸāļĨāđŒ html āļŦāļĢāļ·āļ­ JSP āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļžāļąāļ’āļ™āļē āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ custom tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTagFile āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ tag file āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 12.3.1 āļŠāļĢāđ‰āļēāļ‡ Tag File āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Tag āđ‚āļ”āļĒāđ€āļ‚āļĩāļĒāļ™āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđāļĨāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļŠāļĢāđ‰āļēāļ‡ Folder āļŠāļ·āđˆāļ­ tags āļ āļēāļĒāđƒāļ•āđ‰ WebContentWEB-INF 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Folder tags āļāļģāļŦāļ™āļ” File Name āđ€āļ›āđ‡āļ™ NameTagFile āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.3 āļĢāļđāļ›āļ—āļĩāđˆ 12.3 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Tag File Thanachart Numnonda and Thanisa Kruawaisayawan
  • 98. 97 3. āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āđƒāļŦāđ‰ implement source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.3 Listing āļ—āļĩāđˆ 12.3 āđ‚āļ›āļĢāđāļāļĢāļĄ NameTagFile.tag <%@tag description="Tag Name" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:forEach begin="1" end="10"> Hello ${param.name} <br> </c:forEach> 12.3.2 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTagFile āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → JSP File 2. āļāļģāļŦāļ™āļ” File Name = helloTagFile āđāļĨāđ‰āļ§āļāļ” Finish 3. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloTagFile.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.4 4. āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļģāļŦāļ™āļ” URL āđ€āļ›āđ‡āļ™ http://localhost:8080/JSPDemo/helloTagFile.jsp?name=Thanisa āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ helloJSTL.jsp Listing āļ—āļĩāđˆ 12.4 āđ‚āļ›āļĢāđāļāļĢāļĄ helloTagFile.jsp <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@taglib tagdir="/WEB-INF/tags" prefix="myTags" %> <!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>JSP Demo</title> </head> <body> <h1>JSP Demo</h1> <myTags:NameTagFile /> </body> </html> 12.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āđāļ•āđˆāļāļēāļĢāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTagHandler āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Custom Tag āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄ 3 āļŠāđˆāļ§āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē āļŠāļĢāđ‰āļēāļ‡ Java Class Tag Handler [NameTagHandler.java] āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļĄāļ·āđˆāļ­ Custom Tag āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ â€Ē āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor [MyTags.tld] āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļ˜āļīāļšāļēāļĒ aribut āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ element āļ‚āļ­āļ‡ tag āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ element āđāļĨāļ° attribute → element aribut1=”A” /element â€Ē āļŠāļĢāđ‰āļēāļ‡ JSP file [helloTag.jsp] āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Custom Tag āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 12.4 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 99. 98 āļĢāļđāļ›āļ—āļĩāđˆ 12.4 Overview āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Custom Tag Files 12.4.1 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Java ClassTag Handler āđ„āļŸāļĨāđŒ Tag Handler āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ§āļēāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļē āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ tag āđāļĨāđ‰āļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āđ„āļĢ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Tag āđ€āļ›āđ‡āļ™ NameTag āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ§āļēāđ€āļ›āđ‡āļ™ NameTagHandler āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ name āđāļĨāļ°āļžāļīāļĄāļžāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello xxxx āļˆāļģāļ™āļ§āļ™āļŠāļīāļšāļ„āļĢāļąāđ‰āļ‡ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Tag Handler āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New → Class āļāļģāļŦāļ™āļ” Package āđ€āļ›āđ‡āļ™ tags , Class Name āđ€āļ›āđ‡āļ™ NameTagHandler āđ€āļĨāļ·āļ­āļ SuperClass āđ€āļ›āđ‡āļ™ SimpleTagSupport Thanachart Numnonda and Thanisa Kruawaisayawan
  • 100. 99 āļĢāļđāļ›āļ—āļĩāđˆ 12.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Java Tag Handler Class āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 101. 100 2. āļ—āļģāļāļēāļĢ Implement Method āļŠāļ·āđˆāļ­ doTag( ) āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ āļēāļĒāđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āļ‚āļ­āļ‡ source code āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source Override/Implement Methods ... āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ˜āļ­āļ” doTag() āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 12.6 āđāļĨāļ° āļŠāļĢāđ‰āļēāļ‡ method āļ›āļĢāļ°āđ€āļ āļ— setter āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­ setName( ) āļĢāļđāļ›āļ—āļĩāđˆ 12.6 āļāļēāļĢ Implement method āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ Custom Tag 3. āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āļˆāļ°āđāļŠāļ”āļ‡āđ„āļŸāļĨāđŒ NameTagHandler.java āđƒāļŦāđ‰āđ€āļ‚āļĩāļĒāļ™ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.5 Listing āļ—āļĩāđˆ 12.5 āđ‚āļ›āļĢāđāļāļĢāļĄ NameTagHandler.java package tags; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class NameTagHandler extends SimpleTagSupport { String name; public void setName(String name) { this.name = name; } @Override public void doTag() throws JspException, IOException { super.doTag(); JspWriter out = getJspContext().getOut(); try { JspFragment f = getJspBody(); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 102. 101 if (f != null) f.invoke(out); for (int i = 0; i 10; i++) { out.println(Hello + name + br); } } catch (java.io.IOException ex) { throw new JspException(Error in NameTagHandler tag, ex); } } } 12.4.2 āļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđ€āļāđ‡āļš āļĢāļēāļĒāļŠāļ·āđˆāļ­ Tag āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āļ™āļģ tag āļ•āđˆāļēāļ‡āđ† āļĄāļēāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ JSP āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ %@taglib ...% āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Tag Library Descriptor āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Project JSPDemo āđ€āļĨāļ·āļ­āļ New → Folder āđ€āļĨāļ·āļ­āļ JSPDemo → WebContent → WEB-INF āđāļĨāđ‰āļ§ āļāļģāļŦāļ™āļ” Folder name = tlds āļĢāļđāļ›āļ—āļĩāđˆ 12.7 āļŠāļĢāđ‰āļēāļ‡ Folder āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļš Tag Language Descriptor āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 103. 102 2. āđ€āļĨāļ·āļ­āļ Project JSPDemo → WebContent → WEB-INF → tlds āļ„āļĨāļīāļāļ‚āļ§āļēāļ—āļĩāđˆ Folder tlds āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ New → File āļāļģāļŦāļ™āļ” TLD Name = MyTag.tld ***āđƒāļŦāđ‰āđƒāļŠāđˆ āļ™āļēāļĄāļŠāļāļļāļĨ tld āļ”āđ‰āļ§āļĒ āđāļĨāđ‰āļ§ āļāļ” Finish āļĢāļđāļ›āļ—āļĩāđˆ 12.8 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ File Tag Library Descriptor 3. āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Editor āļˆāļ°āđāļŠāļ”āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­ MyTag.tld āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ WebContentWEB-INFtlds Thanachart Numnonda and Thanisa Kruawaisayawan
  • 104. 103 4. Implement code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 12.6 Listing āļ—āļĩāđˆ 12.6 āđ‚āļ›āļĢāđāļāļĢāļĄ MyTag.tld ?xml version=1.0 encoding=UTF-8? taglib version=2.1 xmlns=http://java.sun.com/xml/ns/javaee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://java.sun.com/xml/ns/javaee, http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd tlib-version1.0/tlib-version short-nameMyTags/short-name uri/WEB-INF/tlds/MyTag/uri tag nameNameTagHandler/name tag-classtags.NameTagHandler/tag-class body-contentscriptless/body-content attribute namename/name rtexprvaluetrue/rtexprvalue typejava.lang.String/type /attribute /tag /taglib 12.4.3 āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Tag āļ—āļĩāđˆāļŠāļ·āđˆāļ­ NameTag āđ‚āļ”āļĒāļˆāļ°āļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 11.4 āđ‚āļ”āļĒāļāļēāļĢ āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” JSPDemo āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Other... 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New File āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Categories āļ—āļĩāļŠāļ·āđˆāļ­ Web āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡ File Types āļ•āđˆāļēāļ‡āđ† āļ āļēāļĒāđƒāļ•āđ‰ Category āļ™āļĩāđ‰ āđƒāļŦāđ‰āđ€āļĢāļēāđ€āļĨāļ·āļ­āļ JSP āđāļĨāđ‰āļ§āļāļ” Next 3. āļāļģāļŦāļ™āļ” JSP File Name: āđ€āļ›āđ‡āļ™ helloTag āđāļĨāđ‰āļ§āļāļ” Finish 4. āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ editor āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ helloTag.jsp āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ Listing āļ—āļĩāđˆ 12.7 5. āļ—āļģāļāļēāļĢ run āđ‚āļ›āļĢāđāļāļĢāļĄ āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp Listing āļ—āļĩāđˆ 12.7 āđ‚āļ›āļĢāđāļāļĢāļĄ helloTag.jsp %@page contentType=text/html% %@page pageEncoding=UTF-8% %@taglib uri=/WEB-INF/tlds/MyTag prefix=test% !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 titleJSP Demo/title /head body h1JSP Demo/h1 test:NameTagHandler name=Thanisa / /body /html āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 105. 104 Exercise 13 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework 2. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View] 3. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model] 4. āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View] 5. āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml 13.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ StrutsDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Struts 2 Framework 1. Download Struts 2 Framework āļ—āļĩāđˆ http://archive.apache.org/dist/struts/binaries/struts-2.3.3-all.zip 2. āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ” File Zip āļ­āļ­āļāļĄāļē āļˆāļ°āđ€āļŦāđ‡āļ™ Folder āļŠāļ·āđˆāļ­ apps āļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩ war file āļŠāļ·āđˆāļ­ struts2-blank.war āđƒāļŦāđ‰ āļ—āļģāļāļēāļĢ Extract āļ­āļ­āļāļĄāļēāđ„āļ§āđ‰āļ—āļĩāđˆ Temporary folder āđ€āļŠāđˆāļ™ D:temp āļāđˆāļ­āļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.1 āļĢāļđāļ›āļ—āļĩāđˆ 13.1 āļāļēāļĢ Extract āđ„āļŸāļĨāđŒ Struts2-blank.war 3. āļ—āļģāļāļēāļĢ Import Template āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Eclipse āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄ Environment āļŠāļģāļŦāļĢāļąāļš Struts 2 Framework āđ‚āļ”āļĒāđƒāļŦāđ‰ āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­ Web Project āđ€āļ›āđ‡āļ™ StrutsDBApp āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.2 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 106. 105 āļĢāļđāļ›āļ—āļĩāđˆ 13.2 āļāļēāļĢ import āđ€āļ‚āđ‰āļēāļŠāļđāđˆ Eclipse 13.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp [View] āļŠāļĢāđ‰āļēāļ‡āđ€āļ§āđ‡āļšāđ€āļžāļˆāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđƒāļŦāļĄāđˆ āđ€āļ‚āđ‰āļēāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ books āļ‹āļķāđˆāļ‡āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.3 āļĢāļđāļ›āļ—āļĩāđˆ 13.3 āđ€āļ§āđ‡āļšāđ€āļžāļˆāļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē JSP āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ 1. File → New → JSP File āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ addBook.jsp 2. āđƒāļŠāđ‰āļāļēāļĢāļĨāļēāļāđāļ›āļ° Object āļĨāļ‡āđ„āļ›āļšāļ™āļŦāļ™āđ‰āļē Design view āđ€āļžāļ·āđˆāļ­āļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāđ€āļžāļˆ āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ Window → Show View → Palette āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.4 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 107. 106 āļĢāļđāļ›āļ—āļĩāđˆ 13.4 Palette āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāđ€āļžāļˆ 3. āļ„āļĨāļīāđŠāļāļ—āļĩāđˆ Struts Tags āļˆāļ°āđ€āļŦāđ‡āļ™ Object āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ Drag and Drop āļĨāļ‡āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē Design āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ āļŦāļ™āđ‰āļēāđ€āļžāļˆāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.5 āđ‚āļ”āļĒāļĄāļĩāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ source āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 13.1 āļĢāļđāļ›āļ—āļĩāđˆ 13.5 āļŠāļĢāđ‰āļēāļ‡ JSP Page āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 108. 107 Listing āļ—āļĩāđˆ 13.1 āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.jsp %@taglib uri=/struts-tags prefix=s% %@ page language=java contentType=text/html; charset=TIS-620 pageEncoding=TIS-620% !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=ISO-8859-1 titleStruts2/title /head body s:labelADD A NEW BOOK/s:label s:form action=addBookAction method=POST tds:textfield name=isbn label=ISBN //td tds:textfield name=title label=TITLE//td tds:textfield name=author label=AUTHOR//td tds:textfield name=price label=PRICE//td tds:submit value=ADD //td /s:form /body /html 4. āđ€āļĄāļ·āđˆāļ­āļˆāļąāļ”āđāļ•āđˆāļ‡āļŦāļ™āđ‰āļē page āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ–āđ‰āļēāđƒāļ™āđ„āļŸāļĨāđŒ addBook.jsp āļĄāļĩ taglib āļ—āļĩāđˆāļĄāļĩ prefix=nested āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ āļĨāļšāļ­āļ­āļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļēāļ‡ Apache āđ„āļĄāđˆāļĄāļĩ URI āļ™āļĩāđ‰āđāļĨāđ‰āļ§ āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.6 āļĢāļđāļ›āļ—āļĩāđˆ 13.6 āļāļēāļĢāļĨāļš taglib āļ­āļ­āļāļˆāļēāļ addBook.jsp 5. āļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ context.xml āļ—āļĩāđˆāļĄāļĩ source āļ”āļąāļ‡ Listing āļ—āđˆāļĩāđˆ 13.2 āļˆāļēāļ Exercise 5 āļĄāļēāđ„āļ§āđ‰āđƒāļ™ Folder StrutsDBAppWebContentMETA-INF Listing āļ—āļĩāđˆ 13.2 āđ‚āļ›āļĢāđāļāļĢāļĄ context.xml ?xml version=1.0 encoding=UTF-8? Context Resource name=jdbc/test auth=Container driverClassName=com.mysql.jdbc.Driver type=javax.sql.DataSource url=jdbc:mysql://localhost:3306/test username=root password=root /Resource /Context āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 109. 108 13.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java [Model] AddBookAction.java āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāļĄāļĩāđ€āļĄāļ˜āļ­āļ”āļ›āļĢāļ°āđ€āļ āļ— getter āđāļĨāļ° setter āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āļœāđˆāļēāļ™āļ—āļēāļ‡ addBook.jsp āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.7 āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢ insert āļĨāļ‡āđƒāļ™ table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āļ āļēāļĒāđƒāļ™āđ€āļĄāļ˜āļ­āļ” execute AddBookAction.java [Model sourcecode] āļĢāļđāļ›āļ—āļĩāđˆ 13.7 āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Struts2 tag āđāļĨāļ° AddBookAction āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. File → New → Class āļāļģāļŦāļ™āļ” pagekage = model , name = AddBookAction āļāļģāļŦāļ™āļ” SuperClass = com.opensymphony.xwork2.ActionSupport āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.8 āļĢāļđāļ›āļ—āļĩāđˆ 13.8 āļŠāļĢāđ‰āļēāļ‡ AddBookAction.java Thanachart Numnonda and Thanisa Kruawaisayawan
  • 110. 109 2. āđƒāļ™āļ„āļĨāļēāļŠ AddBookAction.java āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ attribute āļ—āļĩāđˆāļŠāļ·āđˆāļ­ isbn, title, author āđ‚āļ”āļĒāļĄāļĩāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™ String āđāļĨāļ° price āļ—āļĩāđˆāļĄāļĩāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™ float āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ map attribute āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AddBookAction.java āļāļąāļšāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡ āđ„āļŸāļĨāđŒ addBook.jsp āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļĄāļ˜āļ­āļ”āļ›āļĢāļ°āđ€āļ āļ— Getters and Setters āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.9 āļĢāļđāļ›āļ—āļĩāđˆ 13.9 āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Generate Getters and Setters 3. Override āđ€āļĄāļ˜āļ­āļ” execute āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ source code āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Source → Override/Implement Methods... āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāđ€āļĄāļ˜āļ­āļ” execute āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.10 āļĢāļđāļ›āļ—āļĩāđˆ 13.10 āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Override Method execute āļ‚āļ­āļ‡ ActionSupport āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 111. 110 4. āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ Source code āđƒāļ™āđ€āļĄāļ˜āļ­āļ” execute() āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 13.2 Listing āļ—āļĩāđˆ 13.2 āđ‚āļ›āļĢāđāļāļĢāļĄ AddBookAction.java package model; import java.sql.*; import javax.naming.InitialContext; import javax.sql.DataSource; import com.opensymphony.xwork2.ActionSupport; public class AddBookAction extends ActionSupport { private String isbn, title, author; private float price; public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } @Override public String execute() throws Exception { InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup(java:comp/env/jdbc/test); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); String sql = insert into books (isbn,title,author,price) values + (' + getIsbn() + ',' + getTitle() + ',' + getAuthor() + ', + getPrice() + ); System.out.println(Executed SQL = + sql); stmt.execute(sql); return super.execute(); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 112. 111 } } 13.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ success.jsp [View] html headtitleResult Inserting Book/title/head body h3New Book record added!!!/h3 bISBN: /bs:property value=isbn /br bTitle: /bs:property value=title /br bAuthor: /bs:property value=author /br bPrice: /bs:property value=price /br /body /html 13.5 āļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ struts.xml āđ„āļŸāļĨāđŒ struts.xml āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Struts â€Ē āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ /src/struts.xml āđāļĨāđ‰āļ§āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ action tag āļ”āļąāļ‡āļ™āļĩāđ‰ action name=addBookAction class=model.AddBookAction result name=successsuccess.jsp/result result name=errorerror.jsp/result /action *struts2-blank.war āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒ page error.jsp āļĄāļēāđƒāļŦāđ‰āđāļĨāđ‰āļ§ 13.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Restart Tomcat 2. Run āđ‚āļ›āļĢāđāļāļĢāļĄ StrutDBApp āļŦāļĢāļ·āļ­āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ file āđ€āļĨāļ·āļ­āļ Run → Run As Server 3. āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­ http://localhost:8080/StrutDBApp/addBook.jsp āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ 4. āđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Database 5. āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰ āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ Tool āļ‚āļ­āļ‡ MySQL āļŠāļ·āđˆāļ­ MySQL Workbench āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 13.11 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 113. 112 āļĢāļđāļ›āļ—āļĩāđˆ 13.11 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ Table Books Thanachart Numnonda and Thanisa Kruawaisayawan
  • 114. 113 Exercise 14 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ SpringMVC Framework āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework 2. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller 3. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP 4. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml 5. āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml 6. āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 14.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SpringDBApp āđ‚āļ”āļĒāđƒāļŠāđ‰ Spring Framework 1. āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Dynamic Web Project āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ File → New → Dynamic Web Project 2. āļāļģāļŦāļ™āļ” Project Name: āđ€āļ›āđ‡āļ™ HelloWebSpring āđ€āļĨāļ·āļ­āļ Dynamic web module version āđ€āļ›āđ‡āļ™ 3.0 āđāļĨāļ°āļŦāļ™āđ‰āļē Web Module āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Generate web.xml deployment descriptor āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ āđāļĨāđ‰āļ§āļāļ” Finish āļĢāļđāļ›āļ—āļĩāđˆ 14.1 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļŠāļĢāđ‰āļēāļ‡ web.xml 3. āļ—āļģāļāļēāļĢ Download Spring Library āļˆāļēāļāđ€āļ§āđ‡āļš http://www.springsource.org/spring-community-download āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 115. 114 āđāļĨāđ‰āļ§ unzip āđ„āļŸāļĨāđŒ 4. āļāđ‡āļ­āļšāļ›āļĩāđ‰āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™ Spring Libraries āļĨāļ‡āđƒāļ™ folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebCentent WEB-INF lib 14.2 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ Controller āđ„āļŸāļĨāđŒ Controller āđƒāļ™ Spring MVC Framework āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ§āđˆāļē RequestMapping āļ‚āļ­āļ‡ url āđ‚āļ”āļĒāļĄāļĩ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ HelloWebSpring āđ€āļĨāļ·āļ­āļ New Class 2. āļāļģāļŦāļ™āļ”āļ„āđˆāļē Package āđ€āļ›āđ‡āļ™ web.controller āđāļĨāļ° Name: āđ€āļ›āđ‡āļ™ MainController 3. āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.1 Listing āļ—āļĩāđˆ 14.1 āđ‚āļ›āļĢāđāļāļĢāļĄ MainController.java package web.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(/welcome) public class MainController { @RequestMapping(method = RequestMethod.GET) public String printWelcome(ModelMap model) { model.addAttribute(message, Spring 3 MVC Hello World); return hello; } } 14.3 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ JSP āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp āļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļœāļĨ āļ—āļĩāđˆāļ—āļēāļ‡ Spring āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļˆāļēāļāļāļēāļĢ return āļ‚āļ­āļ‡ RequestMapping āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Folder āļŠāļ·āđˆāļ­ pages āļ āļēāļĒāđƒāļ•āđ‰ Folder āļ—āļĩāđˆāļŠāļ·āđˆāļ­ WebContent WEB-INF 2. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ hello.jsp āļ—āļĩāđˆ folder āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New JSP File 3. āļāļģāļŦāļ™āļ” File Name āđ€āļ›āđ‡āļ™ hello.jsp āđāļĨāđ‰āļ§āļāļ” Finish 4. āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.2 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 116. 115 Listing āļ—āļĩāđˆ 14.2 āđ‚āļ›āļĢāđāļāļĢāļĄ hello.jsp html body h1Message : ${message}/h1 /body /html 14.4 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml āđ„āļŸāļĨāđŒ mvc-dispatcher-servlet.xml āļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ configuration āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļēāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ­āļĒāļđāđˆāļ—āļĩāđˆāđƒāļ” āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ āļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ‚āļŦāļ™āļ” WebContent WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Other... XML File 2. āļāļģāļŦāļ™āļ”āļ„āđˆāļē File Name: āđ€āļ›āđ‡āļ™ mvc-dispatcher-servlet.xml 3. āđ€āļ‚āļĩāļĒāļ™ source code āļ•āļēāļĄ Listing āļ—āļĩāđˆ 14.3 Listing āļ—āļĩāđˆ 14.3 āđ‚āļ›āļĢāđāļāļĢāļĄ mvc-dispatcher-servlet.xml beans xmlns=http://www.springframework.org/schema/beans xmlns:context=http://www.springframework.org/schema/context xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd context:component-scan base-package=web.controller / bean class=org.springframework.web.servlet.view.InternalResourceViewResolver property name=prefix value/WEB-INF/pages//value /property property name=suffix value.jsp/value /property /bean /beans 14.5 āļžāļąāļ’āļ™āļēāđ„āļŸāļĨāđŒ web.xml āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡Listing āļ—āļĩāđˆ 14.4 Listing āļ—āļĩāđˆ 14.4 āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml web-app id=WebApp_ID 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 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 117. 116 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd display-nameSpring MVC Application/display-name servlet servlet-namemvc-dispatcher/servlet-name servlet-class org.springframework.web.servlet.DispatcherServlet /servlet-class load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namemvc-dispatcher/servlet-name url-pattern//url-pattern /servlet-mapping context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/mvc-dispatcher-servlet.xml/param-value /context-param listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener /web-app 14.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ 1. āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđāļāļĢāļĄ 2. āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ url āļŠāļ·āđˆāļ­ http://localhost:8080/HelloWebSpring/welcome āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ› 14.2 āļĢāļđāļ›āļ—āļĩāđˆ 14.2 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ 14.7 āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Spring MVC āđ€āļ›āđ‡āļ™ Framework āļ—āļĩāđˆāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđ€āļĢāļēāļˆāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 118. 117 āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē āļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book.java āļ āļēāļĒāđƒāļ•āđ‰ package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ model āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ Book â€Ē āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MainController āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩ RequestMapping āļ—āļĩāđˆāļŠāļ·āđˆāļ­ /addbook āđāļĨāļ° /showbooks â€Ē āļŠāļĢāđ‰āļēāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āđˆāļ­ BookService.java āļ āļēāļĒāđƒāļ•āđ‰ package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ web.controller āļ—āļĩāđˆāļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļŠāļ™āļīāļ” Service āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ DataSource â€Ē āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ mvn-dispatcher-servlet.xml āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđāļ—āđ‡āļ„ Bean āļŠāļ­āļ‡āļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļš id āļ—āļĩāđˆāļŠāļ·āđˆāļ­ dataSource āđāļĨāļ° bookService â€Ē āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ addedpage.jsp āđāļĨāļ° bookpages.jsp āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ pages āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨ āđ‚āļ”āļĒāđ€āļĢāļēāļˆāļ°āđ„āļ”āđ‰ source code āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ Listing āļ—āļĩāđˆ 14.5 āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java package model; public class Book { private String isbn; private String title; private String author; private float price; public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } } Listing āļ—āļĩāđˆ 14.6 āđ‚āļ›āļĢāđāļāļĢāļĄ MainController.java āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļ‡āđƒāļŦāļĄāđˆ package web.controller; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 119. 118 import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import model.Book; import web.controller.BookService; @Controller public class MainController { @RequestMapping(value = /welcome, method = RequestMethod.GET) public String printWelcome(ModelMap model) { model.addAttribute(message, Spring 3 MVC Hello World); return hello; } @Resource(name = bookService) private BookService bookService; @RequestMapping(value = /addbook, method = RequestMethod.GET) public String add( @RequestParam(value=isbn, required=true) String isbn, @RequestParam(value=title, required=true) String title, @RequestParam(value=author, required=true) String author, @RequestParam(value=price, required=true) Float price) { bookService.add(isbn, title, author, price); return addedpage; } @RequestMapping(value = /showbooks, method = RequestMethod.GET) public String showBooks(Model model) { ListBook bks = bookService.getAll(); model.addAttribute(books, bks); return bookpages; } } Listing āļ—āļĩāđˆ 14.7 āđ‚āļ›āļĢāđāļāļĢāļĄ BookService.java package web.controller; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import model.Book; @Service(bookService) @Transactional Thanachart Numnonda and Thanisa Kruawaisayawan
  • 120. 119 public class BookService { private DataSource dataSource; @Resource(name = dataSource) public void setDataSource(DataSource dataSource) { this.dataSource = dataSource;; } public ListBook getAll() { // Prepare our SQL statement ListBook books = new ArrayListBook(); String sql = select * from books; Connection conn = null; try { conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { Book bk = new Book(); bk.setIsbn(rs.getString(isbn)); bk.setAuthor(rs.getString(author)); bk.setTitle(rs.getString(title)); bk.setPrice(rs.getFloat(price)); books.add(bk); } stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Retrieve all return books; } public void add(String isbn, String title, String author, float price) { String sql = insert into books values + (' + isbn + ',' + title + ',' + author + ', + price + ); Connection conn = null; try { conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); stmt.executeUpdate(sql); stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Listing āļ—āļĩāđˆ 14.8 āđ‚āļ›āļĢāđāļāļĢāļĄ mvc-dispatcher-servlet.xml āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ beans xmlns=http://www.springframework.org/schema/beans xmlns:context=http://www.springframework.org/schema/context xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd â€Ķ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 121. 120 bean id=dataSource class=org.springframework.jdbc.datasource.DriverManagerDataSource property name=driverClassName value=com.mysql.jdbc.Driver / property name=url value=jdbc:mysql://localhost:3306/test / property name=username value=root / property name=password value=root / /bean bean id=bookService class=web.controller.BookService property name=dataSource ref bean=dataSource / /property /bean /beans Listing āļ—āļĩāđˆ 14.9 āđ‚āļ›āļĢāđāļāļĢāļĄ addedpage.jsp %@ page language=java contentType=text/html; charset=ISO-8859-1 pageEncoding=ISO-8859-1% !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=ISO-8859-1 titleAdd Data/title /head body Added Book successfully.. /body /html Listing āļ—āļĩāđˆ 14.10 āđ‚āļ›āļĢāđāļāļĢāļĄ bookpages.jsp %@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c % %@ 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 titleAll Books/title /head body c:forEach items=${books} var=bk ${bk.title} ${bk.author} br /c:forEach /body /html āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Books āđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ http://localhost:8080/HelloWebSpring/addbook?isbn=134title=SpringMVC author=Thanaprice=400.0 āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™ Books āđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ http://localhost:8080/HelloWebSpring/showbooks Thanachart Numnonda and Thanisa Kruawaisayawan
  • 122. 121 Exercise 15 āļāļēāļĢ Authentication āđ‚āļ”āļĒāđƒāļŠāđ‰ Tomcat āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ - āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ—āļģ Authentication āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē configuration āļ‚āļ­āļ‡ Tomcat Web Server āđ‚āļ”āļĒāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ Basic Configuration āđāļĨāļ° Form Based Configuration āđāļĨāļ° āļˆāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™ realm āļ‚āļ­āļ‡ Tomcat āļˆāļēāļāđ„āļŸāļĨāđŒ tomcat-users.xml āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰ MySQL Database 15.1 āļŠāļĢāđ‰āļēāļ‡ Web Application Project 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File → New → Dynamic Web Project āļāļģāļŦāļ™āļ” Project Name = SecurityWebApp 2. āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ admin.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.1 3. āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ user.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.2 Listing āļ—āļĩāđˆ 15.1 āđ‚āļ›āļĢāđāļāļĢāļĄ admin.html html head titleADMIN/title /head body h1Admin Page/h1 /body /html Listing āļ—āļĩāđˆ 15.2 āđ‚āļ›āļĢāđāļāļĢāļĄ user.html html head titleUSER/title /head body h1User Page/h1 /body /html 15.2 āđ€āļžāļīāđˆāļĄ User āļ‚āļ­āļ‡ Tomcat Web Server āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› Tomcat-Web-Server āļˆāļ°āđƒāļŠāđ‰ Realm āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Flat File āđ‚āļ”āļĒāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ File āļ—āļĩāđˆāļŠāļ·āđˆāļ­ tomcat-users.xml āļ‚āļąāđ‰āļ™ āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄ User āđ‚āļ”āļĒāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 123. 122 1. āđƒāļ™ Project Explorer āđƒāļŦāđ‰āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ Servers Tomcat tomcat-users.xml āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 15.1 āđāļĨāļ°āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄ user password āļĨāļ‡āđ„āļ›āđƒāļ™ Tomcat Server āļ”āļąāļ‡āđƒāļ™ Listing āļ—āļĩāđˆ 15.3 āļĢāļđāļ›āļ—āļĩāđˆ 15.1 āđ€āļžāļīāđˆāļĄ user āđāļĨāļ° roles āļ—āļĩāđˆ Apache Tomcat Listing āļ—āļĩāđˆ 15.3 āđ„āļŸāļĨāđŒ tomcat-users.xml ....... role rolename=admin/ role rolename=user/ user username=admin password=admin roles=admin / user username=tomcat password=tomcat roles=admin / user username=user password=user roles=user / ....... 2. Restart Tomcat āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™ config āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļĢāļēāđāļāđ‰āđ€āļ‚āđ‰āļēāđ„āļ› āđ‚āļ”āļĒāđ„āļ›āļ—āļĩāđˆ tab Server → āļ„āļĨāļīāļāļ‚āļ§āļēāļ—āļĩāđˆāļŠāļ·āđˆāļ­ server āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ restart 15.3 āļāļēāļĢ Config āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Web Application āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ Tomcat user āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ—āļģ Authenticate āđāļĨāļ° Authorization āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļē URL āđƒāļ”āđ†āļ‚āļ­āļ‡ Web Application āđāļĨāļ°āļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāđ‚āļ”āļĒāļ­āļīāļ‡āļāļąāļš role (Role Based Authorization)āđ‚āļ”āļĒ config āđ„āļŸāļĨāđŒ web-xml āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ role āđ€āļ›āđ‡āļ™ admin āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļŸāļĨāđŒ admin.html āđāļĨāļ° user.html āđ„āļ”āđ‰ āļŠāđˆāļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ role āđ€āļ›āđ‡āļ™ user āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļ‰āļžāļēāļ°āđ„āļŸāļĨāđŒ user.html āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ Configuration 1. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆ Deployment Descriptor: SecurityWebApp āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp 2. āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ Generate Deployment Descriptor Stub āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.2 āļĢāļđāļ›āļ—āļĩāđˆ 15.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ web.xml Thanachart Numnonda and Thanisa Kruawaisayawan
  • 124. 123 3. āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ web.xml āļ‚āļ­āļ‡ Project āļ—āļĩāđˆāļŠāļ·āđˆāļ­ SecurityWebApp āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” āđ€āļžāļ·āđˆāļ­āļšāļ­āļāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļēāļĢ authen āđāļšāļš Basic login-config auth-methodBASIC/auth-method /login-config 4. āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” āļĢāļ°āļšāļļ Security Roles = 2 roles āļ„āļ·āļ­ user āđāļĨāļ° admin security-role role-nameadmin/role-name /security-role security-role role-nameuser/role-name /security-role 5. āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Web page āļ‚āļ­āļ‡ Project āļāļąāļš User āļšāļ™ Tomcat @@ āļāļĢāļ“āļĩāļŦāļ™āđ‰āļē admin.html āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāļœāļđāđ‰āļĄāļĩ role āđ€āļ›āđ‡āļ™ admin āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļāļģāļŦāļ™āļ”URL Pattern āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļģāļāļąāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ›āđ‡āļ™ /admin.html āļāļģāļŦāļ™āļ” Name āđ€āļ›āđ‡āļ™ Admin Page āļāļģāļŦāļ™āļ” āļœāļđāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ URL āļ™āļĩāđ‰āđ„āļ”āđ‰ āļ„āļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Roles = admin āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ security-constraint web-resource-collection url-pattern/admin.html/url-pattern web-resource-nameAdmin Page/web-resource-name /web-resource-collection auth-constraint role-nameadmin/role-name /auth-constraint /security-constraint @@ āļāļĢāļ“āļĩāļŦāļ™āđ‰āļē user.html āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāļœāļđāđ‰āļĄāļĩ role āđ€āļ›āđ‡āļ™ user āđāļĨāļ° admin āļāļģāļŦāļ™āļ”URL Pattern āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļģāļāļąāļ”āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ›āđ‡āļ™ /user.html āļāļģāļŦāļ™āļ” Name āđ€āļ›āđ‡āļ™ User Page āļāļģāļŦāļ™āļ” āļœāļđāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ URL āļ™āļĩāđ‰āđ„āļ”āđ‰ āļ„āļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Roles = admin security-constraint web-resource-collection url-pattern/user.html/url-pattern web-resource-nameUser Page/web-resource-name /web-resource-collection auth-constraint role-nameuser/role-name role-nameadmin/role-name /auth-constraint /security-constraint 6. āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ web.xml āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 15.4 Listing āļ—āļĩāđˆ 15.4 āđ„āļŸāļĨāđŒ web.xml āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 125. 124 ....... login-config auth-methodBASIC/auth-method /login-config security-role role-nameadmin/role-name /security-role security-role role-nameuser/role-name /security-role security-constraint web-resource-collection web-resource-nameAdmin Page/web-resource-name url-pattern/admin.html/url-pattern /web-resource-collection auth-constraint role-nameadmin/role-name /auth-constraint /security-constraint security-constraint web-resource-collection web-resource-nameUser Page/web-resource-name url-pattern/user.html/url-pattern /web-resource-collection auth-constraint role-nameuser/role-name role-nameadmin/role-name /auth-constraint /security-constraint ....... 15.4 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Basic Authenticate 1. āļ—āļģāļāļēāļĢ Build āđāļĨāļ° Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp 2. āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ http://localhost:8080/SecurityWebApp/admin.html āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Browser āļˆāļ°āđāļŠāļ”āļ‡ āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļāļĨāđ‡āļ­āļāļ­āļīāļ™āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.3 āļĢāļđāļ›āļ—āļĩāđˆ 15.3 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļĨāđ‡āļ­āļāļ­āļīāļ™ 3. āđƒāļŦāđ‰āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđ€āļ›āđ‡āļ™ admin āđāļĨāļ° admin āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ™āļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļš admin.html āđ„āļ”āđ‰ 4. āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļš Browser āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™āđ€āļ›āđ‡āļ™ user āđāļĨāļ° user āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ™āļĩāđ‰āđ„āļ”āđ‰ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 126. 125 5. āļ—āļ”āļĨāļ­āļ‡āļ—āļģāļ‹āđ‰āļģāļāļąāļš URL āļŠāļ·āđˆāļ­ http://localhost:8080/SecurityWebApp/user.html āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē url āļ™āļĩāđ‰āļˆāļ°āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰ user āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđƒāļŠāđ‰āđ„āļ”āđ‰ 15.5 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰ Login Form āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ SecurityWebApp āđƒāļŦāđ‰āļĄāļĩāļ—āļģāļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ Form āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāđƒāļŠāđ‰ āđ„āļŸāļĨāđŒ Login.html āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļĨāđ‡āļ­āļāļ­āļīāļ™āđ„āļ”āđ‰ āđƒāļŦāđ‰āļŠāđˆāļ‡āļ•āđˆāļ­āđ„āļ›āļ—āļĩāđˆ Error.html āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē page āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ login āļŠāļ·āđˆāļ­ login.html āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.4 2. āļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļē error.html āđ€āļĄāļ·āđˆāļ­āļāļĢāļ“āļĩāļ›āđ‰āļ­āļ™ username āļŦāļĢāļ·āļ­ password āđ„āļĄāđˆāļ–āļđāļ āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.5 3. āđāļāđ‰āđ„āļ‚ web.xml āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļĢāļđāļ›āđāļšāļšāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Form āđ‚āļ”āļĒāđƒāļŠāđ‰āļŦāļ™āđ‰āļē Form āļ„āļ·āļ­ login.html āļĢāļąāļšāļ„āđˆāļē username āđāļĨāļ° password āđ‚āļ”āļĒāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļˆāļēāļ login-config auth-methodBASIC/auth-method /login-config āđ€āļ›āđ‡āļ™āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 14.7 Listing āļ—āļĩāđˆ 15.5 āđ‚āļ›āļĢāđāļāļĢāļĄ login.html html head title/title meta http-equiv=Content-Type content=text/html; charset=UTF-8 /head body H1Login Form : Sample/H1 FORM ACTION=j_security_check METHOD=POST User name : INPUT TYPE=TEXT NAME=j_username / br Password : INPUT TYPE=PASSWORD NAME=j_password / br input type=submit value=Login / /FORM /body /html Listing āļ—āļĩāđˆ 15.6 āđ‚āļ›āļĢāđāļāļĢāļĄ error.html html headtitleERROR/title/head body H1Error unauthorized user/H1 /body /html Listingāļ—āļĩāđˆ 15.7 āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml ....... login-config auth-methodFORM/auth-method realm-nameAdminApplication/realm-name form-login-config form-login-page/login.html/form-login-page form-error-page/error.html/form-error-page /form-login-config /login-config ....... āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 127. 126 15.6 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Form Authenticate āđƒāļŠāđ‰āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Basic Authenticate āđāļ•āđˆāļŦāļ™āđ‰āļē login āļˆāļ°āđ€āļ›āđ‡āļ™ login.html āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 15.4 āļĢāļđāļ›āļ—āļĩāđˆ 15.4 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļĨāđ‡āļ­āļāļ­āļīāļ™ 15.7 āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰ Authenticate āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļˆāļēāļ Database MySQL āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļ Realm āļ‚āļ­āļ‡ Tomcat Web Server āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ­āļ·āđˆāļ™āđ† āđ„āļ”āđ‰āļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āđ„āļŸāļĨāđŒ āđ€āļŠāđˆāļ™āļāļēāļĢāđƒāļŠāđ‰ Database āļŦāļĢāļ·āļ­ Directory Server āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ—āļ”āļĨāļ­āļ‡āļāļģāļŦāļ™āļ” Realm āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ MySQL āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Table āļ‚āļķāđ‰āļ™āļĄāļēāļŠāļ­āļ‡āļŠāļļāļ”āļ„āļ·āļ­ users āđāļĨāļ° userrole āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ MySQL Workbench āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ table āļ‚āļķāđ‰āļ™āļĄāļē 2 tables āđ‚āļ”āļĒāđƒāļŠāđ‰ Tool āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Wizard āļŦāļĢāļ·āļ­ SQL Statement āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ table āļ”āļąāļ‡āļ™āļĩāđ‰ create table users ( user_name varchar(45) not null primary key, pass_word varchar(45) not null ); create table userrole ( user_name varchar(45) not null, role_name varchar(45) not null, primary key (user_name, role_name) ); āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” Icon Execute SQL scripts (āļĢāļđāļ›āļŠāļēāļĒāļŸāđ‰āļēāļŠāļĩāđ€āļŦāļĨāļ·āļ­āļ‡) āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™ āļŦāļĢāļ·āļ­ Highlight āļ„āļģāļŠāļąāđˆāļ‡āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Ctrl + Enter 2. āļ—āļ”āļĨāļ­āļ‡āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŠāđˆāļĨāļ‡āđƒāļ™ Table āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ” password āđāļĨāļ° role 3. āđƒāļ™ Project Explorer āđƒāļŦāđ‰āļ”āļąāļšāđ€āļšāļīāđ‰āļĨāļ„āļĨāļīāđŠāļāļ—āļĩāđˆāđ„āļŸāļĨāđŒ Servers Tomcat server.xml āļ‚āļ­āļ‡ Apache Tomcat 4. āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ sourcecode āļ”āļąāļ‡āļ™āļĩāđ‰ āļĨāļš Realm className=org.apache.catalina.realm.UserDatabaseRealm resourceName=UserDatabase/ āđ€āļžāļīāđˆāļĄ Realm className=org.apache.catalina.realm.JDBCRealm debug=99 driverName=com.mysql.jdbc.Driver connectionURL=jdbc:mysql://localhost/test connectionName=root connectionPassword=root userTable=users userRoleTable=userrole userNameCol=user_name userCredCol=pass_word roleNameCol=role_name / Thanachart Numnonda and Thanisa Kruawaisayawan
  • 128. 127 5. āļ—āļģāļāļēāļĢ Restart Tomcat āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™ config āļ—āļĩāđˆāđāļāđ‰āđ„āļ› 15.8 āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļš Database Authenticate āđƒāļŠāđ‰āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļš Form Authenticate āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 129. 128 Exercise 16 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App Engine āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āđ‚āļ”āļĒāļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļšāļ™ Google App Engine āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰ Infrastructure āļ‚āļ­āļ‡ Google āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āļˆāļąāļ”āđ€āļ›āđ‡āļ™ Cloud Computing āļ›āļĢāļ°āđ€āļ āļ— Platform as a Service (PaaS) āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļšāļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāļ—āļēāļ‡ Google āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰ āđ‚āļ”āļĒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļāļģāļŦāļ™āļ” API āđ„āļ§āđ‰āļŠāļ­āļ‡āļ āļēāļĐāļēāļ„āļ·āļ­ Java āđāļĨāļ° Python āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Eclipse 3.6 (Helios) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļš Google App Engine āđāļĨāļ°āđƒāļŠāđ‰ Google App Engine Plugin Module āļ‚āļ­āļ‡ Eclipse āļĄāļēāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 16.1 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine Google App Engine āđ€āļ›āđ‡āļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™ āļšāļ™ Google's Infrastructure āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ account āļ‚āļ­āļ‡ Google āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Google App Engine SDK āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Google App Engine āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāđ„āļ”āđ‰āļ—āļĩāđˆ http://code.google.com/appengine/ āđ‚āļ”āļĒāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļŠāļĢāļļāļ›āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļē Google App Engine āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ App Engine Account āđ‚āļ”āļĒāđƒāļŠāđ‰ Google Account āļ—āļĩāđˆ http://code.google.com/appengine/ 2. āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse 3.7 3. āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ Help Install New Software... 4. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ Plugins āđ€āļĨāļ·āļ­āļāđāļ—āļ› Setting āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Add 5. āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ Install āļˆāļ°āđāļŠāļ”āļ‡āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āļāļģāļŦāļ™āļ”āļ„āđˆāļē Work with: āđ€āļ›āđ‡āļ™ http://dl.google.com/eclipse/plugin/3.7 āđāļĨāđ‰āļ§āļāļ” Enter āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļāļˆāļ°āđāļŠāļ”āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Plugin āđāļĨāļ° SDKs āļ•āđˆāļēāļ‡āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Next 6. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Google App Engines āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļīāđ‰āļ™āļŠāļļāļ”āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ Restart āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđƒāļŦāļĄāđˆ 7. āļ—āļĩāđˆ Toolbar āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āļˆāļ°āļĄāļĩāļ›āļļāđˆāļĄāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āļ”āļąāļ‡āļ™āļĩāđ‰ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 130. 129 āļĢāļđāļ›āļ—āļĩāđˆ 16.1 āļāļēāļĢāđ€āļĨāļ·āļ­āļāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Plugin āđāļĨāļ° SDK āļ‚āļ­āļ‡ Google App Engines 16.2 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Web Application Project āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ‚āļ›āļĢāđāļāļĄ Web Application āđ€āļžāļ·āđˆāļ­āļ—āļ”āļĨāļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡ Google's Infrastructure āđ‚āļ”āļĒāļāļēāļĢ āļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File = New = Other... 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New āđƒāļŦāđ‰āļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” Google āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Web Application Project āđāļĨāđ‰āļ§āļāļ” Next 3. āļāļģāļŦāļ™āļ” Project Name āđ€āļ›āđ‡āļ™ BookGAE āļāļģāļŦāļ™āļ”āļ„āđˆāļē Package āđ€āļ›āđ‡āļ™ com.imcinstitute āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Project Location āđ€āļ›āđ‡āļ™ Director āļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ„āļ§āđ‰ āđāļĨāļ°āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļĨāļ·āļ­āļāļ„āđˆāļē Use Google Web Toolkit āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āđ„āļĄāđˆāđ„āļ”āđ‰āđƒāļŠāđ‰ GWT āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.1 āđāļĨāđ‰āļ§āļāļ” Next āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 131. 130 āļĢāļđāļ›āļ—āļĩāđˆ 16.2 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē Web Application Project āļ‚āļ­āļ‡ Google Application 4. āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ MMJTDemoServlwt.java āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŦāļ™āļ” src guestbook āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰ āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello, World 5. āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļĨāļ­āļšāļ—āļĩāđˆāļˆāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” MMJTDemo āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Run As Web Application āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Web Browser āđāļĨāđ‰āļ§āļāļģāļŦāļ™āļ” url āđ€āļ›āđ‡āļ™ http://localhost:8888/mmjtdemo āđ‚āļ”āļĒāļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.3 āļĢāļđāļ›āļ—āļĩāđˆ 16.3 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ localhost server Thanachart Numnonda and Thanisa Kruawaisayawan
  • 132. 131 6. āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ MMJTDemo āļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒāļˆāļąāļ”āļāļēāļĢ configuration āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ deploy āđ„āļ›āļĒāļąāļ‡ Google App Engine āļ—āļĩāđˆāļŠāļ·āđˆāļ­ appengine-web.xml āđ‚āļ”āļĒāđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŦāļ™āļ” war WEB-INF āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.4 āļĢāļđāļ›āļ—āļĩāđˆ 16.4 āđ„āļŸāļĨāđŒ appengine-web.xml 7. āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢ Deploy āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ™āļĩāđ‰āļĨāļ‡āļšāļ™ Google App Engine āđ‚āļ”āļĒāļāļēāļĢāđ„āļ› sign up āđ€āļ‚āđ‰āļē account āļ‚āļ­āļ‡āđ€āļĢāļēāļ—āļĩāđˆ Google App Engine āļ—āļĩāđˆ https://telecommunication/ āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Create an Application 8. āļāļģāļŦāļ™āļ”āļ„āđˆāļē Application Identifier: āđ€āļ›āđ‡āļ™ thaijavaapp āđāļĨāļ° Application Title: āđ€āļ›āđ‡āļ™ Thai Java Google App āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.5 āđāļĨāđ‰āļ§āļāļ”āļ›āļļāđˆāļĄ Save āļĢāļđāļ›āļ—āļĩāđˆ 16.5 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Application āļŠāļģāļŦāļĢāļąāļš Google App Engine 9. Google App Engine āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­ Application āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.6 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 133. 132 āļĢāļđāļ›āļ—āļĩāđˆ 16.6 āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ My Applications āđƒāļ™ Google App Engine 10. āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ appengine-web.xml āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āļ„āđˆāļē application āđ€āļ›āđ‡āļ™ thaijavaapp 11. āļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” MMJTDemo āđƒāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ Google Deploy to App Engine āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ–āļēāļĄ e-mail (username) āđāļĨāļ° password āļ‚āļ­āļ‡ Google App Engine āļ‚āļ­āļ‡āđ€āļĢāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 16.7 āļĢāļđāļ›āļ—āļĩāđˆ 16.7 āļāļēāļĢ Deploy āđƒāļ™ Google App Engine 12. āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ”āļĒāļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļŦāđ‰āļāļĨāļąāļšāļĄāļēāļ—āļĩāđˆ Browser āđ€āļžāļ·āđˆāļ­āđ„āļ›āļ—āļĩāđˆ https://appengine.google.com/ āļ‹āļķāđˆāļ‡āļˆāļ° āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.8 āđƒāļŦāđ‰āđ€āļĢāļēāļāļ”āļ—āļĩāđˆāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™(1) āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ› āļ—āļĩāđˆ 16.9 āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ MMJTDemo āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.10 Thanachart Numnonda and Thanisa Kruawaisayawan
  • 134. 133 āļĢāļđāļ›āļ—āļĩāđˆ 16.8 āļĢāļēāļĒāļāļēāļĢāđāļŠāļ”āļ‡ current versions āļŠāļ­āļ‡ My Applications āļĢāļđāļ›āļ—āļĩāđˆ 16.9 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ thaijavaapp āļšāļ™ Google App Engine āļĢāļđāļ›āļ—āļĩāđˆ 16.10 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ MMJTDemo āļšāļ™ Google App Engine 16.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 135. 134 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āđ€āļ§āļĨāļēāļ›āļąāļˆāļˆāļļāļšāļąāļ™āđāļĨāđ‰āļ§āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļšāļ™ Google App Engine āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āđāļĨāđ‰āļ§āļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo src 2. āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” guestbook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Class 3. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āđƒāļŦāđ‰ āļāļģāļŦāļ™āļ”āļ„āđˆāļē Name āđ€āļ›āđ‡āļ™ TimerServlet āļŠāđˆāļ§āļ™āļ„āđˆāļēāļ­āļ·āđˆāļ™āđ†āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ”āļīāļĄ āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāđ‰āļ§āļāļ” Finish 4. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 16.1 5. āļ—āļģāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āđ‚āļ”āļĒāļāļēāļĢāļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo war WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ web.xml āđāļĨāļ°āđāļ—āļ› source āđāļĨāđ‰āļ§āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ tag āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰ servlet servlet-nameTimer/servlet-name servlet-classguestbook.TimerServlet/servlet-class /servlet servlet-mapping servlet-nameTimer/servlet-name url-pattern/timer/url-pattern /servlet-mapping 6. āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļšāļ™ localhost āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ url āļŠāļ·āđˆāļ­ http://localhost:8888/timer 7. āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ http://thaijavaapp.appspot.com /timer āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.11 āļĢāļđāļ›āļ—āļĩāđˆ 16.11 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢ y āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet āļšāļ™ Google App Engine Listing āļ—āļĩāđˆ 16.1 āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet.java package guestbook; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; Thanachart Numnonda and Thanisa Kruawaisayawan
  • 136. 135 import java.util.Date; import java.util.SimpleTimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author Administrator */ public class TimerServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); SimpleDateFormat fmt = new SimpleDateFormat(yyyy-MM-dd hh:mm:ss.SSSSSS); fmt.setTimeZone(new SimpleTimeZone(0, )); out.println(html); out.println(head); out.println(titleServlet TimerServlet/title); out.println(/head); out.println(body); out.println(h1Servlet TimerServlet at + request.getContextPath() + /h1); out.println(pThe time is: + fmt.format(new Date()) + /p); out.println(/body); out.println(/html); out.close(); } } 16.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account Google App Engine āļĄāļĩāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ API āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Application āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Google āđ„āļ”āđ‰ āļĢāļ§āļĄāļ–āļķāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Google Account āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™ Google API āļ‚āļ­āļ‡āļ„āļĨāļēāļŠ User āđāļĨāļ° UserService āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš Google Account āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Project Explorer āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” guestbook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Class 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āđƒāļŦāđ‰ āļāļģāļŦāļ™āļ”āļ„āđˆāļē Name āđ€āļ›āđ‡āļ™ GoogleTimerServlet āļŠāđˆāļ§āļ™āļ„āđˆāļēāļ­āļ·āđˆāļ™āđ†āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ āđ„āļ›āļ•āļēāļĄāđ€āļ”āļīāļĄāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāđ‰āļ§āļāļ” Finish 3. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 16.2 4. āļ—āļģāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ„āļŸāļĨāđŒ web.xml āđ‚āļ”āļĒāļāļēāļĢāļ‚āļĒāļēāļĒāđ‚āļŦāļ™āļ” MMJTDemo war WEB-INF āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒ web.xml āđāļĨāļ°āđāļ—āļ› source āđāļĨāđ‰āļ§āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ tag āļ•āđˆāļēāļ‡āđ†āļ”āļąāļ‡āļ™āļĩāđ‰ servlet servlet-nameMMJTDemo/servlet-name servlet-classguestbook.GoogleTimerServlet/servlet-class /servlet servlet-mapping servlet-nameMMJTDemo/servlet-name url-pattern/googletimer/url-pattern /servlet-mapping āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 137. 136 5. āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ http://thaijavaapp.appspot.com /googletimer āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ—āļĩāđˆ 16.12 āđāļĨāļ° 16.2 āļĢāļđāļ›āļ—āļĩāđˆ 16.12 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet āļšāļ™ Google App Engine āļĢāļđāļ›āļ—āļĩāđˆ 16.13 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļąāļĢāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ TimerServlet āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ—āļģ signin Listing āļ—āļĩāđˆ 16.2 āđ‚āļ›āļĢāđāļāļĢāļĄ GoogleTimerServlet.java package guestbook; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.SimpleTimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GoogleTimerServlet extends HttpServlet { Thanachart Numnonda and Thanisa Kruawaisayawan
  • 138. 137 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); SimpleDateFormat fmt = new SimpleDateFormat(yyyy-MM-dd hh:mm:ss.SSSSSS); fmt.setTimeZone(new SimpleTimeZone(0, )); UserService userService = UserServiceFactory.getUserService(); User user = userService.getCurrentUser(); String url = request.getRequestURI(); String msg; if (user != null) { msg = pWelcome, + user.getNickname() + ! You can a href= + userService.createLogoutURL(url) + sign out/a./p; } else { msg = pWelcome! a href= + userService.createLoginURL(url) + Sign in or register/a to customize./p; } out.println(html); out.println(head); out.println(titleServlet TimerServlet/title); out.println(/head); out.println(body); out.println(msg); out.println(h1Servlet TimerServlet at + request.getContextPath() + /h1); out.println(pThe time is: + fmt.format(new Date()) + /p); out.println(/body); out.println(/html); out.close(); } } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 139. 138 Exercise 17 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Google App Engine āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāļāđˆāļ­āļ™ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđ‡āļšāđ‚āļ”āļĒāđƒāļŠāđ‰ Google App Engine â€Ē Java Persistence API āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļģāļ™āļ§āļ™āļĄāļēāļāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĒāļēāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļēāļ Web Server āļˆāļģāļ™āļ§āļ™āļŦāļĨāļēāļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļķāļ‡āļ­āļēāļˆāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ•āđˆāļĨāļ° āļ„āļĢāļąāđ‰āļ‡āđƒāļŠāđ‰ Web Server āļ—āļĩāđˆāđ„āļĄāđˆāļ‹āđ‰āļģāļāļąāļ™ āđāļĨāļ° Web Server āļ—āļļāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļēāļˆāļāļĢāļ°āļˆāļēāļĒāļ­āļĒāļđāđˆāđƒāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļŦāļĨāļēāļĒāđ†āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļ”āđ‰ Google App Engine āļĄāļĩāļāļĨāđ„āļāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ Infrastructure āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļąāļ‡āļ§āļĨāļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđ‚āļ”āļšāļœāđˆāļēāļ™ API āļ—āļĩāđˆāļ—āļēāļ‡ Google āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļŦāđ‰ Google App Engine āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļāļēāļ™āđ„āļ§āđ‰āļŠāļ­āļ‡ āđāļšāļšāļ„āļ·āļ­ Java Data Objects (JDO) āđāļĨāļ° Java Persistence API (JPA) āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđāļšāļšāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡ DataNucleus Access āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ§āļīāļ˜āļĩāļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āļ§āļīāļ˜āļĩāđāļšāļš Object Database āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ RDBMS āļ—āļąāđˆāļ§āđ†āđ„āļ› āļ”āļąāļ‡ āļ™āļąāđ‰āļ™āļœāļđāđ‰āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰ RDBMS āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļąāļ’āļ™āļē Google Web Application āđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āđāļšāļšāļāļķāļāļŦāļąāļ”āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ Books āđ‚āļ”āļĒāđƒāļŠāđ‰ JPA āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Entity āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book āđāļĨāđ‰āļ§āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡ Book 17.1 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Google App Engine āđāļšāļšāļāļķāļāļŦāļąāļ”āļˆāļ°āļŠāļĢāđ‰āļēāļ‡ Web Application āļ‚āļ­āļ‡ GAE āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ File New Other.. 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New āđ€āļĨāļ·āļ­āļ Folder Google āđāļĨāļ°āđ€āļĨāļ·āļ­āļ Web Application Project āđāļĨāđ‰āļ§āļāļ” Next 3. āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­ Package name āđ€āļ›āđ‡āļ™ com.imcinstitute āđāļĨāļ° Project name āđ€āļ›āđ‡āļ™ OnlineBook 4. āđ„āļĄāđˆāđ€āļĨāļ·āļ­āļāļŠāđˆāļ­āļ‡ Use Google Web Toolkit āđāļĨāđ‰āļ§āļāļ” Finish āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ OnlineBookServlet.java āđāļĨāļ° persistence.xml (āļ āļēāļĒāđƒāļ•āđ‰āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ META- INF) .āđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī 17.2 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Book Entity Class āđ‚āļ›āļĢāđāļāļĢāļĄ Book.java āļˆāļ°āđ€āļ›āđ‡āļ™ Entity Class āļ—āļĩāđˆāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŸāļīāļĨāļ”āđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš column āļ‚āļ­āļ‡ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 140. 139 Table āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āđ‚āļ”āļĒāļˆāļ°āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļ­āļĒāļđāđˆ package āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Entity āđāļĨāļ°āļĄāļĩ sourcecode āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.1 Listing āļ—āļĩāđˆ 17.1 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ Book.java package entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Book implements Serializable { @Id private String isbn; private String title; private String author; private float price; public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } } 17.3 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java āđ‚āļ›āļĢāđāļāļĢāļĄ Web Application āļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš datastore āđ‚āļ”āļĒāđƒāļŠāđ‰āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļŠāļ™āļīāļ” EntityManager āđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡āļĄāļē āļˆāļēāļ EntityManagerFactory āđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļ›āđ€āļˆāđ‡āļ„āļ”āļąāļ‡āļāļĨāđˆāļēāļ§ āđ‚āļ”āļĒāļĄāļĩ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” OnlineBook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Java Class... 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Java Class āļāļģāļŦāļ™āļ”āļ„āđˆāļē Class Name āđ€āļ›āđ‡āļ™ EMF āđāļĨāļ° Package āđ€āļ›āđ‡āļ™ entity āđāļĨāđ‰āļ§āļāļ” Finish 3. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.2 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 141. 140 Listing āļ—āļĩāđˆ 17.2 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ EMF.java package entity; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class EMF { private static final EntityManagerFactory emfInstance = Persistence.createEntityManagerFactory(transactions-optional); private EMF() { } public static EntityManagerFactory get() { return emfInstance; } } 17.4 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html āļˆāļ°āđ€āļ›āđ‡āļ™āļŸāļ­āļĢāđŒāļĄāļŠāļģāļŦāļĢāļąāļšāļāļĢāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ OnlineBookServlet āļ—āļĩāđˆāļĄāļĩ url āđ€āļ›āđ‡āļ™ addBook.do āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ Add āđ‚āļ”āļĒāļĄāļĩ source code āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.3 Listing āļ—āļĩāđˆ 17.3 sourcecode āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ addBook.html !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 titleAdd a new book/title /head bodyh1Add a new book/h1P form action=addBook.do method=GET ISBN : input type=text name=isbn value= size=15/ BR Title : input type=text name=title value= size=50/ BR Author : input type=text name=author value= size=50/ BR Price : input type=text name=price value= size=10/ BR input type=submit value=Add / /form /body /html 17.5 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļšāļ™ Google App Engine āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļĨāļ‡āđƒāļ™ datastore āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Book āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.4 2. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml āđ‚āļ”āļĒāđāļāđ‰āđ„āļ‚ servlet-mapping āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ addBook.do āļ”āļąāļ‡āļ™āļĩāđ‰ Thanachart Numnonda and Thanisa Kruawaisayawan
  • 142. 141 servlet-mapping servlet-nameOnlineBook/servlet-name url-pattern/addBook.do/url-pattern /servlet-mapping 3. āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ url http://thaijavaapp.appspot.com/addBook.html Listing āļ—āļĩāđˆ 17.4 āđ‚āļ›āļĢāđāļāļĢāļĄ OnlineBookServlet.java package com.imcinstitute; import java.io.IOException; import java.io.PrintWriter; import javax.persistence.EntityManager; import javax.servlet.http.*; import entity.Book; import entity.EMF; @SuppressWarnings(serial) public class OnlineBookServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType(text/html;charset=UTF-8); PrintWriter out = resp.getWriter(); out.println(html); out.println(head); out.println(titleAdd a new book/title); out.println(/head); out.println(body); out.println(h1 Add a new book /h1); String isbn = req.getParameter(isbn); String author = req.getParameter(author); String title = req.getParameter(title); String priceStr = req.getParameter(price); float price = Float.parseFloat(priceStr); Book bk = new Book(); bk.setIsbn(isbn); bk.setAuthor(author); bk.setTitle(title); bk.setPrice(price); EntityManager em = EMF.get().createEntityManager(); try { em.persist(bk); out.println(Book added); } finally { em.close(); } out.println(/body); out.println(/html); out.close(); } } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 143. 142 17.6 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ Books āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Servlet āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ JPA āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ datastore āļ—āļĩāđˆāļŠāļ·āđˆāļ­ Books āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđ€āļĨāļ·āļ­āļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Projects āđāļĨāđ‰āļ§āļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāđ‚āļŦāļ™āļ” OnlineBook āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāļ„āļģāļŠāļąāđˆāļ‡ New Servlet... 2. āđƒāļ™āđ„āļ”āļ­āļ°āļĨāđ‡āļ­āļ New Servlet āļāļģāļŦāļ™āļ”āļ„āđˆāļē Class Name āđ€āļ›āđ‡āļ™ ShowBook āđāļĨāļ° Package āđ€āļ›āđ‡āļ™ com.imcinstitute āđāļĨāđ‰āļ§āļāļ” Finish 3. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ ShowBook.java āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ”āļąāļ‡ Listing āļ—āļĩāđˆ 17.5 4. āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ web.xml āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄ Servlet āļ—āļĩāđˆāļŠāļ·āđˆāļ­ ShowBook āļ”āļąāļ‡āļ™āļĩāđ‰ servlet servlet-nameShowBook/servlet-name servlet-classcom.imcinstitute.ShowBook/servlet-class /servlet servlet-mapping servlet-nameShowBook/servlet-name url-pattern/ShowBook/url-pattern /servlet-mapping 5. āļ—āļģāļāļēāļĢ deploy āļšāļ™ Google App Engine āđāļĨāđ‰āļ§āļ—āļ”āļĨāļ­āļ‡āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ http://thaijavaapp.appspot.com/ShowBook Listing āļ—āļĩāđˆ 17.5 āđ‚āļ›āļĢāđāļāļĢāļĄ ShowBook.java package com.imcinstitute; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.servlet.http.*; import entity.Book; import entity.EMF; @SuppressWarnings(serial) public class ShowBook extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType(text/html;charset=UTF-8); PrintWriter out = resp.getWriter(); out.println(html); out.println(head); out.println(titleAdd a new book/title); Thanachart Numnonda and Thanisa Kruawaisayawan
  • 144. 143 out.println(/head); out.println(body); out.println(h1 Show all books /h1); EntityManager em = EMF.get().createEntityManager(); try { Query query = em.createQuery(SELECT o FROM Book AS o); @SuppressWarnings(unchecked) ListBook bks = (ListBook) query.getResultList(); for (Object obj: bks) { Book bk = (Book) obj; out.println(bk.getTitle() + : + bk.getAuthor() + br); } } catch(Exception ex) { out.println(ex); } finally { em.close(); } out.println(/body); out.println(/html); out.close(); } } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Java Servlet / JSP
  • 145. 37th Floor, Sathorn Square Building, 98 North Sathorn Road, Silom, Bangrak, Bangkok 10500 Tel: 02-105-6322, 088-192-7975 [email protected] www.imcinstitute.com www.facebook.com/imcinstitute www.slideshare.net/imcinstitute