[4th Seoul Workshop]Jeeve Management and Servlet Programming

Àå±Ô¿À
¼­¿ï½Ã ¼­´ë¹®±¸ ÃæÁ¤·Î 3°¡ 32-11 ÃæÁ¤ B/D 2Ãþ
¿¤¸²³×Æ® ÀÎÅͳݻç¾÷º»ºÎ À¥¼­ºñ½ºÆÀ
E-mail: kojang@elim.net
URL: http://www.elim.net/~kojang/
Abstract
¿ùµå¿ÍÀ̵åÀ¥ÀÌ º¸ÆíÈ­ µÇ¸é¼­ À¥ ¼­¹ö°¡ ±ÞÁõÇÏ°Ô µÇ¾ú°í, ¼­¹öÀÇ Á¾·ùµµ ´Ù¾çÇØÁö°í ÀÖ´Ù. ±×·¸Áö¸¸, ¿î¿µ°ú °³¹ßÀÇ ¿©·¯°¡Áö ¹®Á¦Á¡°ú ºÒÆíÇÑ Á¡ÀÌ ³ëÃâµÇ°í ÀÖ´Ù. ÀÌ·¯ÇÑ ¹®Á¦Á¡µéÀ» ÀÚ¹Ù·Î °³¹ßµÈ ¼­¹ö¸¦ ÀÌ¿ëÇßÀ»¶§ÀÇ ¾î¶°ÇÑ ÀåÁ¡ÀÌ ÀÖ´ÂÁö ¾Ë¾Æº»´Ù.
ÀÚ¹Ù·Î °³¹ßµÈ À¥¼­¹öÀÎ JeeveÀÇ ¼³Ä¡ ¹æ¹ý°ú ¿î¿µ ¹æ¹ýÀ» ¾Ë¾Æº» ÈÄ, ±âÁ¸ÀÇ CGI¿Í ºñ½ÁÇÑ ÇüÅÂÀÇ ÀÚ¹Ù CGIÇÁ·Î±×·¥ÀÎ Servlet ÇÁ·Î±×·¡¹Ö ±â¹ý°ú ServletÀÇ Àå/´ÜÁ¡À» ¾Ë¾Æº»´Ù.

Keywords:
WWW, Java, Jeeve, Servlet, CGI, Applet



1. Intallation

Jeeve´Â Internet Information Server·Î½á À¥¼­¹ö¿Í°°Àº ±â´ÉÀ» ¼öÇàÇÏ´Â ¼­¹öÀÌ´Ù. ´ÙÀ½ÀÇ »çÀÌÆ®¿¡¼­ Jeeve¸¦ ´Ù¿î ·Îµå ¹ÞÀ» ¼ö ÀÖ´Ù. »ç¿ëȯ°æÀº Windows95/NT, SolarisÀ̸ç, µÎ OS¿¡ ±¸ºÐ¾øÀÌ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï µÇ¾îÀÖ´Ù.

Download
  • http://java.sun.com/products/jeeves/CurrentRelease/
  • ftp://ftp.javasoft.com/pub/
  • ¾ÐÃàÆÄÀÏÀ» Ç®¾îÁÖ´Â °Í¸¸À¸·Î ¼³Ä¡°¡ ³¡³­´Ù.
    Jeeve¸¦ ¼³Ä¡ÇÏ°í ½ÇÇà Çϱâ À§Çؼ­´Â JDK°¡ ÀÌ¹Ì ¼³Ä¡µÇ¾î ÀÖ¾î¾ß Çϰí, ¾ÐÃàÀ» Ç®¸é 'JeevesA1.2'µð·ºÅ丮¿Í ÇÏÀ§ µð·ºÅ丮 ¸î°³°¡ »ý¼ºÀÌ µÇ´Âµ¥, °¢ µð·ºÅ丮ÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.
  • native : Native ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÑ µ¿Àû ¶óÀ̺귯¸® °³¹ß¿¡ ÇÊ¿äÇÑ C¾ð¾î ·çƾ.
  • lib : µ¿Àû ¶óÀ̺귯¸®.
  • servlets : Servlet ¿¹Á¦ ÇÁ·Î±×·¥.
  • admin : Jeeve ȯ°æ ¼³Á¤ ÆÄÀÏ
  • public_html : HTML ¹®¼­ µð·ºÅ丮
  • cgi-bin : Perl·Î ÀÛ¼ºµÈ CGIÇÁ·Î±×·¥
  • icons : HTML ¹®¼­¿¡¼­ »ç¿ëÇÏ´Â ¾ÆÀÌÄÜ
  • etc : Jeeve ½ÇÇà¿¡ ÇÊ¿äÇÑ ±âŸ ÆÄÀÏ
  • bin : Jeeve HTTPD ½ÇÇà ÇÁ·Î±×·¥
  • doc : Jeeve¼³Ä¡ ¹× ȯ°æ¼³Á¤, Servlet °³¹ß¿¡ ÇÊ¿äÇÑ API Document.
  • ÀϹÝÀûÀÎ À¥¼­¹ö¿Í ¸¶Âù°¡Áö·Î Jeeve¸¦ ½ÇÇàÇϱâ À§Çؼ­´Â 'logs'µð·ºÅ丮¸¦ »ý¼ºÇØÁÖ¾î¾ß ½ÇÇàÀÌ µÈ´Ù.
    ±× ¹ÛÀÇ È¯°æ¼³Á¤Àº ±âº»°ªÀ» °¡Áö°í ÀÖ°í, Çʿ信 µû¶ó¼­ °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. 'bin' µð·ºÅ丮ÀÇ 'httpd'¸¦ ½ÇÇà ½ÃŲÈÄ ´ÙÀ½Ã³·³ Æ÷Æ®¹øÈ£ '8888'·Î Á¢¼ÓÇÏ¸é µÈ´Ù.
    http://ServerHostName:8888/



    2. Configuration

    ÃÖ±Ù¿¡ µîÀåÇÏ´Â »ó¿ë À¥¼­¹ö´Â ȯ°æ ¼³Á¤¿¡ ÇÊ¿äÇÑ CGI ÇÁ·Î±×·¥°ú ¹®¼­¸¦ Á¦°øÇÑ´Ù. Jeeveµµ ¸¶Âù°¡Áö·Î ȯ°æ¼³Á¤¿¡ ÇÊ¿äÇÑ ¾ÖÇø´°ú ¹®¼­µéÀ» Á¦°øÇϴµ¥, ÀÌ·± ¾ÖÇø´ÀÌ Æ÷ÇÔµÈ ¹®¼­´Â, ¼­¹ö¸¦ ½ÇÇà ÇßÀ»¶§ ½ÇÇàµÇ´Â ±âº» ȨÆäÀÌÁö¿¡ ÀÖ´Ù.[±×¸² 1]

    [±×¸² 1] JeeveÀÇ ±âº» ȨÆäÀÌÁö
    [±×¸² 1] JeeveÀÇ ±âº» ȨÆäÀÌÁö

    'Server Administration'ºÎºÐ¿¡ °¡¸é ¼­¹ö °ü¸®¸¦ À§ÇÑ ¾ÖÇø´ÀÌ ½ÇÇàµÇ´Âµ¥ Á¦ÀϸÕÀú ´ÙÀ½°ú °°Àº ´ëÈ­»óÀÚ°¡ ³ªÅ¸³ª¼­ ID¿Í Password¸¦ ¹°¾îº»´Ù. ±×·¯¸é, ID = 'admin', Password = 'admin' ¸¦ ÀÔ·ÂÇÏ¸é µÈ´Ù.

    [±×¸² 2] Login to Administration

    [±×¸² 2] Login to Administration



    ´ÙÀ½¿¡ ¼³¸íµÇ´Â ¸ðµç ȯ°æ ¼³Á¤ ±â´ÉÀº ¹Ù·Î ÀÌ ¾ÖÇø´¿¡¼­ ¸ðµÎ °¡´ÉÇϹǷΠ¼¼¼¼ÇÑ ¼³¸íÀº »ý·«Çϰí, ½ÇÁ¦·Î 'admin' µð·ºÅ丮¿¡´Â ¼­¹öÀÇ È¯°æ ¼³Á¤¿¡ µû¸¥ ´ÙÀ½°ú °°Àº ÆÄÀϵéÀÌ ÀÖ´Ù.
  • httpd.properties
  • servlets.properties
  • rules.properties
  • aliases.properties
  • mime.properties
  • acl.properties
  • ÀÌ ÆÄÀϵéÀÌ ½ÇÁ¦·Î ¾î¶»°Ô ÀúÀåµÇ°í ¼­¹ö¿¡ ¾î¶°ÇÑ ¿µÇâÀ» ¹ÌÄ¡´ÂÁö¿¡ ´ëÇÑ °ÍµéÀ» ¾Ë¾Æº¸°Ú´Ù.

    2.1. Gerneral Server Configuration


    ±âº»ÀûÀÎ Jeeve ¼­¹öÀÇ È¯°æ ¼³Á¤¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù. ÀÌ¹Ì ´Ù¸¥ À¥¼­¹ö¸¦ ¼³Ä¡ÇÏ°í »ç¿ëÇØº» °æÇèÀÌ ÀÖ´Ù¸é Å« ¾î·Á¿òÀº ¾ø´Ù. °¡Àå Áß¿äÇÑ È¯°æ ¼³Á¤ ÆÄÀÏÀº admin/httpd.propertiesÀÌ´Ù. ¸î°¡Áö ȯ°æ¼³Á¤ÀÌ °¡´ÉÇѵ¥, Å©°Ô °íÄ¡Áö ¾Ê¾Æµµ ¹®¾ÈÇϸç, ¿ì¼± '8888'Æ÷Æ® ¹øÈ£¸¦ '80'À¸·Î ¹Ù²Ù°í, ¸î°¡Áö¸¦ ¹Ù²Ù¾îº»´Ù.
    admin/httpd.properties
  • server.port=80
  • server.backlog=50
  • server.min.threads=10
  • server.max.threads=50
  • server.timeout=60000
  • Æ÷Æ® ¹øÈ£¸¦ '80'À¸·Î Çϸé À¥¼­¹ö¿¡ Á¢¼ÓÇÒ ¶§ Æ÷Æ® ¹øÈ£¸¦ ÀûÁö ¾Ê¾Æµµ µÈ´Ù. µû¶ó¼­, ´ÙÀ½°ú °°ÀÌ Á¢¼ÓÇÒ ¼ö ÀÖ´Ù. ¼³Á¤ ÆÄÀÏÀ» ÀúÀåÇÏ°í ¼­¹ö¸¦ ´Ù½Ã ¶ç¿öº»´Ù.
    http://ServerHostName/

    [±×¸² 3] Gerneral Server Configuration
    [±×¸² 3] Gerneral Server Configuration



    2.2. Server Logging


    ¼­¹ö¿¡ Á¢¼ÓÇϸé 'log' µð·ºÅ丮¿¡ ¼­¹öÀÇ Á¢¼ÓÁ¤º¸¿¡ °üÇÑ ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. °¢°¢ÀÇ ÆÄÀÏÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.
  • access_log : ¼­¹ö¿¡ Á¢¼ÓÇÑ Å¬¶óÀ̾ðÆ®ÀÇ Á¤º¸°¡ ½×ÀδÙ. µû¶ó¼­, ´©°¡ ¾î¶² Á¤º¸¸¦ ¾ó¸¶³ª ÀÚÁÖ Á¢¼ÓÇÏ´ÂÁö Åë°Ô¸¦ ³¾ ¼ö ÀÖ´Ù.
  • error_log : ¼­¹öÀÇ ¿À·ù ¸Þ½ÃÁö¸¦ ÀúÀåÇÑ´Ù. ¼­¹ö°¡ ³»ºÎÀûÀÎ ¿À·ù¸¦ ¹ß»ý½ÃŰ°í ºñÁ¤»óÀûÀ¸·Î Á¾·áÇßÀ» °æ¿ì, ¿À·ù¸¦ ã´Âµ¥ Âü°íÇÒ ¼ö ÀÖ´Ù.
  • event_log : ¼­¹ö¿Í Servlet¿¡ ÀÇÇÑ À̺¥Æ® ¹ß»ý »óȲÀ» º¼ ¼ö ÀÖ´Ù.

  • [±×¸² 3] Server Logging
    [±×¸² 3] Server Logging

    2.3. Jeeves File Aliasing/Servlet Aliasing, Servlet Loading

    Alias±â´ÉÀº local µð½ºÅ©¿¡ ÀÖ´Â ÆÄÀÏÀ̳ª ¼­ºê¸´À» ¿ÜºÎ¿¡¼­ URL·Î ã¾Æ°¥ ¼ö ÀÖµµ·ÏÇÑ´Ù. ´ÙÀ½Àº File AliasingÀ» µî·ÏÇÏ´Â aliases.propertiesÆÄÀϰú

    aliases.properties
         ......
    /=public_html
    /cgi-bin=cgi-bin
    /admin=admin/html
    /doc=doc
    /applet=servlets
    /icons=icons
    /~=public_html/usr
         ......
    
    ¼­ºê¸´Àº °ü¸®ÀÚ¿¡ ÀÇÇØ¼­ Jeeve¼­¹ö°¡ ½ÇÇàµÉ¶§ ÀÚµ¿À¸·Î ·ÎµåÇÒ ¼ö ÀÖµµ·Ï ȯ°æ¼³Á¤À» ÇØÁÖ¾î¾ß ÇÑ´Ù. local¿¡ ÀÖ´Â ¼­ºí¸´°ú remote¿¡ ÀÖ´Â ¼­ºí¸´À» ·ÎµåÇÒ ¼ö ÀÖ´Ù. ·Îµå ÇϰíÀÚ ÇÏ´Â ¼­ºê¸´ÀÇ À̸§°ú ¾Æ±Ô¸ÕÆ®, Ŭ·¡½º À̸§À» ÆÐŰÁö À̸§±îÁö Á¤È®ÇÏ°Ô Àû°í(È®ÀåÀÚ .class¸¦ »«´Ù) µî·ÏÇÑ´Ù. ±×·¯¸é, ´ÙÀ½°ú °°ÀÌ servlets.propertiesÀÌ °»½ÅµÈ´Ù.
    servlets.properties
    # Servlets Properties
    #
    # .codebase=URL where the code is located
    # .code=class name (foo or foo.class)
    # .initArgs=list of {name, value} pairs which can be accessed
    #                         by the servlet using the servlet API calls
    #
    # For example:
    # rcounter.codebase=http://www.javasoft.com/~pavani/classes/
    # rcounter.code=rcounter.class
    #
         ......
    # admin servlet
    admin.code=sun.server.http.AdminServlet
    
    ####################### Demo Servlets ############################
    # local counter
    counter.code=Counter
    counter.initArgs=\
            initial=0
    
    # phone servlet
    phone.code=PhoneServlet
    phone.initArgs=\
            phonelist=servlets/phonelist
         ......
    
    µî·ÏµÈ ¼­ºí¸´À» È£ÃâÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº URLÇüÅ·Π¿ÀÇÂÇÑ´Ù.
    http://<server-host-name>/servlet/<servletName>
    ¶ÇÇÑ, µî·ÏµÇ¾î ·ÎµåµÈ ¼­ºê¸´Àº ¸®½ºÆ®¿¡¼­ »èÁ¦ÇÒ ¼öµµ ÀÖ´Ù.
    ±×·±µ¥ Àç¹ÌÀÖ´Â °ÍÀº ¼­ºí¸´ ¿¹Á¦ ÇÁ·Î±×·¥À» º¸¸é À§ÀÇ 'counter' ¼­ºí¸´À» È£ÃâÇÒ ¶§ counter.html ·Î È£ÃâÇÏ°Ô µÈ´Ù. À̰ÍÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â rules.properties ¶§¹®ÀÌ´Ù. À¥¼­¹ö¿ë ¾ÖÇø´ Áï ¼­ºí¸´À» È£ÃâÇϱâ À§Çؼ­´Â 2´Ü°èÀÇ À̸§ º¯ÇüÀÛ¾÷ÀÌ µé¾î°£ °ÍÀÌ´Ù. 'counter' ¼­ºí¸´ÀÇ °æ¿ì ´ÙÀ½°ú °°´Ù.
    counter.html(virtual-path) -> counter(servelt-name) -> Counter(class-file)
    rules.properties
    # Servlet rules properties
    #
    # This file specifies the translation rules for invoking servlets.
    # The syntax is:
    #
    #       =
    #
    # where  is the virtual path used to invoke the servlet,
    # and  is the name of the servlet. Surrounding white space
    # is ignored. The ordering of the rules is not important, as the longest
    # match will always be used first.
    
    /=file
    /cgi-bin=cgi
    /imagemap=imagemap
    /servlet=invoker
    /counter.html=counter
    /phone.html=phone
    /snoop.html=snoop
    /finger.html=finger
    /fun.html=fun
         ......
    
    [±×¸² 4] Jeeves File Aliasing
    [±×¸² 5] Jeeves Servlet Aliasing
    [±×¸² 6] Servlet Loading
    [±×¸² 4] Jeeves File Aliasing [±×¸² 5] Jeeves Servlet Aliasing [±×¸² 6] Servlet Loading

    2.4. Jeeves Mime Type Administration


    ÀÎÅͳݿ¡ ÀÖ´Â ´Ù¾çÇÑ ÇüÅÂÀÇ ÆÄÀÏÀ» ±¸ºÐÇØ¼­ È­¸éÀ¸·Î Ãâ·Â ¶Ç´Â ÀÀ¿ëÇÁ·Î±×·¥À» È£ÃâÇϱâ À§Çؼ­, mime.propertiesÆÄÀÏ¿¡¼­ Ç¥ÁØ ¸ÊÇÎÀÌ °¡´ÉÇϵµ·Ï Á¤ÀÇÇÑ´Ù. À̰÷¿¡ Á¤ÀǵÇÁö ¾ÊÀº ¾Ë·ÁÁöÁö ¾ÊÀº ÆÄÀÏÀº test/plainÇüÅ·Π¸ÅÇεȴÙ. µû¶ó¼­, ¸¸¾à .arjÆÄÀÏÀ» À¥¼­¹ö¿¡¼­ ±úÁöÁö ¾Ê°í Àü¼ÛÇϱâ À§Çؼ­´Â arj=application/arj¸¦ Ãß°¡¸¦ ÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ÀÌ ÆÄÀÏÀÇ ÀϺκÐÀÌ´Ù.
    mime.properties
    # Default Mime Type
    *=text/plain
    
    # Mime Types
    java=text/plain
    html=text/html
    htm=text/html
    body=text/html
    txt=text/plain
    rtx=text/richtext
    ps=application/x-postscript
    class=application/java
         ......
    

    [±×¸² 7] Jeeves Mime Type Administration
    [±×¸² 7] Jeeves Mime Type Administration

    2.5. Security Configuration

    Jeeves ¿ª½Ã ACL(Access Control Lists)¿¡ ÀÇÇØ¼­ À¥ÆäÀÌÁö³ª ¼­ºí¸´°ú °°Àº ¸®¼Ò½º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â »ç¿ëÀÚ¸¦ µî·Ï/»èÁ¦ÇÒ ¼ö ÀÖ´Ù. °¢ »ç¿ëÀÚ´Â ID¿Í Password¸¦ °¡Áú ¼ö ÀÖ°í, RealmÀ» ÀÌ¿ëÇØ¼­ °°Àº ID·Î ¼­·Î´Ù¸¥ Á¢±Ù ¿µ¿ªÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. (Jeeves A1.2¿¡¼­´Â »õ·Î¿î realmÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Â ±â´ÉÀº ¾ø°í adminRealm, defaultRealm¸¸ Áö¿øÇÑ´Ù.)
    Ưº°È÷ »ç¿ëÀÚÀÇ ±ÇÇÑÁß¿¡¼­µµ ¾ÕºÎºÐÀÇ 'admin'°ú °°Àº °ü¸®ÀÚ ±ÇÇÑÀ» ºÎ¿©ÇÒ ¼ö °¡ Àִµ¥, ¸¸¾à ½Ç¼ö¸¦ ÇØ¼­ ¾ÏÈ£¸¦ Àؾî¹ö¸®¸é ´Ù½Ã´Â ´õÀÌ»ó ¼­¹ö °ü¸®¸¦ ÇÒ ¼ö ¾øÀ¸¹Ç·Î Á¶½ÉÈ÷ µî·ÏÇØ¾ß ÇÏ°í ½Ç¼ö°¡ ¾øµµ·Ï À¯ÀÇÇØ¾ß ÇÑ´Ù.
    ¿©±â °ü¸®ÀÚ È­¸é¿¡¼­ °»½ÅµÈ ³»¿ëÀº 'admin/realms'µð·ºÅ丮¿¡ °èÁ¤ÀÌ ÀÚµ¿À¸·Î µî·ÏµÈ´Ù. À̰÷¿¡´Â ¾Ïȣȭ µÇ¾î ÀÖ´Â ÆÄÀϵµ ÀÖÀ¸¹Ç·Î °¡±ÞÀû ¼öÁ¤ÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.

    [±×¸² 8] User Account Management
    [±×¸² 9] Group Management
    [±×¸² 10] ACL Editing
    [±×¸² 11] Resource Protection
    [±×¸² 8] User Account Management
    [±×¸² 9] Group Management
    [±×¸² 10] ACL Editing
    [±×¸² 11] Resource Protection



    3. Java Server and Servlets Architecture

    ¿©±â¿¡¼­´Â jeeveÀÇ http ¼­¹ö±â´ÉÀÌ ¾î¶»°Ô ±¸ÇöµÇ°í, servlet ÀÇ ½ÇÇà ±¸Á¶¿¡ ´ëÇØ¼­ ¾Ë¾Æº»´Ù. ƯÈ÷, ÀÚ¹ÙÀÇ µ¶Æ¯ÇÑ Æ¯Â¡Áß¿¡¼­ ÀÚ¹Ù ÇÁ·Î±×·¥Àº °ð ¶óÀ̺귯¸®·Î½á ÇÁ·Î±×·¡¹Ö¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. Áï JeeveÀÇ http internet server¿Í À¯»çÇÑ ÇÁ·Î±×·¥°ú Servlet°ú °°Àº ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¼ö ÀÖÀ¸¹Ç·Î, Jeeve¿Í ServletÀÇ API¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¼³¸íÇÑ´Ù.

    ÀϹÝÀûÀÎ Http Server(Daemon)Àº ½ÇÇà½ÃŰ¸é ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ¾î Client°¡ Á¢¼ÓÇϱ⸦ ±â´Ù¸°´Ù. Jeeveµµ ¸¶Âù°¡Áö·Î ¿©·¯°÷¿¡¼­ °°Àº port·Î Á¢¼ÓÀ» ó¸®ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇϴµ¥ ´Ù¸¥Á¡Àº Thread·Î 󸮵ȴٴ °ÍÀÌ´Ù. ÀÚ¼¼È÷ ¸»Çϸé, ¼­¹ö´Â Áö¼ÓÀûÀ¸·Î ClientÀÇ Á¢¼ÓÀ» ±â´Ù¸®°í ÀÖ°í Á¢¼ÓÀÌ ½ÃµµµÇ¸é ½º·¹µå¸¦ »ý¼ºÇؼ­ ¼­ºñ½º¸¦ Çϰí, ´Ù½Ã Á¢¼ÓÀ» ±â´Ù¸®´Â ÇüÅÂÀÌ´Ù.

    JeeveÀÇ ±âº» ±â´É ±¸Çö¿¡ »ç¿ëµÈ ÆÐŰÁö´Â ´ÙÀ½°ú °°´Ù.

    sun.server Package
  • Server : Multiple connection handler threads¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Â network server±â´É.
  • ServerHandler : À§ÀÇ ServerŬ·¡½º·Î ºÎÅÍ Á¤º¸¸¦ ¹Þ¾Æ »õ·Î¿î ÇÚµéÀ» »ý¼ºÇÑ´Ù.
  • ServerParameters : ¼­¹öÀÇ ¼Ó¼ºÀ» ¹Ù²Ü ¼ö ÀÖ´Â ÆÄ¶ó¹ÌÅ͸¦ À§ÇÑ Å¬·¡½º.
  • À§¿¡¼­ ¼³¸íÇÑ ¹Ù¿Í°°ÀÌ °ü¸®ÀÚ¿¡ÀÇÇØ µî·ÏµÈ ¼­ºí¸´Àº ¼­¹ö°¡ ½ÇÇà µÉ¶§ ÀÚµ¿À¸·Î ·ÎµåµÈ´Ù. ±×¹Û¿¡ ¼­ºí¸´Àº ÇÊ¿ä½Ã¿¡ ·Îµå µÈ´Ù. µû¶ó¼­, ¼­ºí¸´Àº ÀÎÅͳݿ¡¼­ ÀÚµ¿À¸·Î ·ÎµåµÇ¾î ½ÇÇà µÇ´Â ¾ÖÇø´°úµµ °°Àº ¹ÙÀÌÆ®ÄÚµå ÇüÅÂÀÇ °´Ã¼ÀÌ´Ù.

    [±×¸² 12] Architecture 1
    [±×¸² 12] Architecture 1

    À§ÀÇ ±×¸²Ã³·³ Client·ÎºÎÅÍ ¼­ºí¸´À» »ç¿ëÇϰíÀÚ ÇÏ´Â ¿äûÀÌ µé¾î¿À¸é Handler thread poolÀº À§¿¡¼­ ¼³¸íÇÑ ¹æ½Ä´ë·Î URLÇüÅÂÀÇ ¼­ºí¸´À» rules.properties¿¡ Á¤ÀÇµÈ ÇüÅ·Π¼­ºí¸´À» ã¾Æ ¼­ºñ½º¸¦ ÇØÁØ´Ù.

    [±×¸² 13] Architecture 2
    [±×¸² 13] Architecture 2

    ±×·±µ¥ Local°ú Remote¿¡ ÀÖ´Â ¼­ºí¸´Àº ½ÇÇà ¹æ½ÄÀÌ ¾à°£´Ù¸¥µ¥, À§¿Í °°ÀÌ Remote¿¡ ÀÖ´Â ¼­ºí¸´Àº º¸¾È¿¡ ¹®Á¦°¡ ÀÖÀ»¼ö°¡ ÀÖÀ¸¹Ç·Î, Stub ServeltÀÌ Áß°£¿¡ Çϳª´õ Á¸ÀçÇÏ°Ô µÈ´Ù.
    ÀÌ·¯ÇÑ °ÍµéÀ» ±¸ÇöÇϱâ À§Çؼ­ sun.server.http ÆÐŰÁö¸¦ »ç¿ëÇÑ´Ù.
    sun.server.http Package
  • AdminServlet
  • CgiServlet
  • CommonLog
  • Cookie
  • Dispatcher
  • FileServlet
  • FormServlet
  • HttpInputStream
  • HttpOutputStream
  • HttpRequest
  • HttpResponse
  • HttpSecurityAclInfo
  • HttpServer
  • HttpServerAdmin
  • HttpServerHandler
  • HttpServerParameters
  • HttpServletContext
  • HttpServletStub
  • ImagemapServlet
  • License
  • SSIncludeServlet
  • ServerSecurity
  • ServletSecurity
  • ÀϹÝÀûÀÎ À¥¼­¹ö¸¦ ¼³Ä¡Çϸé imagemap°ú °°Àº ±âº»ÀûÀÎ CGI·çƾÀÌ Á¸ÀçÇϵíÀÌ, ¼­ºí¸´ Áß¿¡´Â ±âº»ÀûÀÎ Core ServeltÀÌ ÀÖ°í, ´ÙÀ½°ú °°Àº ÆÐŰÁö µéÀÌ ÀÖ´Ù. ÆÐŰÁö Áß¿¡´Â À§¿¡¼­ °£°£È÷ ¼³¸íÇÑ ÆÐŰÁöµéµµ Æ÷ÇԵǾî ÀÖ´Ù.

    Core Servlet
  • File Servlet
  • Invoker Servlet
  • SSInclude Servlet
  • Admin Servlet
  • CgiServlet
  • ImagemapServlet
  • Servlet packages
  • package java.security.acl
  • package java.servlet
  • package sun.server
  • package sun.server.html
  • package sun.server.http
  • package sun.server.http.security
  • package sun.server.misc
  • package sun.server.util



  • 4. Servlet Programming

    À§¿¡¼­ ¼Ò°³ÇÑ ¼ö¸¹Àº ÆÐŰÁö¼ÓÀÇ Å¬·¡½ºµéÀ» ÇѲ¨¹ø¿¡ ÀÍÈ÷´Â °ÍÀº ½Ã°£ÀûÀ¸·Î ¾î¼¸é ºÒ°¡´É ÇÏ´Ù°íµµ º¼ ¼ö ÀÖ´Ù. ±×·¸´Ù¸é, °¡Àå ÁÁÀº ¹æ¹ýÀº ±âº»ÀûÀÎ ÇÁ·Î±×·¡¹Ö ±â¹ý¸¸ ÀÍÈ÷°í API Document¸¦ ÇÊ¿ä½Ã¿¡ ã¾Æº¸¸é¼­ ÇÊ¿äÇÑ ¼­ºí¸´À» °³¹ßÇÏ´Â °ÍÀÌ´Ù. ±×·¯¸é, ÀÌÁ¦ºÎÅÍ´Â Sun¿¡¼­ ¿¹Á¦·Î ³»³õ°í ÀÖ´Â ¼­ºí¸´ ÇÁ·Î±×·¥Áß ¸î°³¸¦ »ìÆì º¸°Ú´Ù.

    4.1. Simple Servlet

    source code
    import java.io.*;
    import java.servlet.*;
    import sun.server.html.*;
    
    public class SimpleServlet extends Servlet { 
    
        public void service(ServletRequest req, ServletResponse res)
            throws Exception 
        {
            res.setContentType("text/html");
            res.writeHeaders();
            OutputStream out = res.getOutputStream();
            String title = "SimpleServlet Output";
    
            HtmlPage page = new HtmlPage(title);
            page.addTagPair("H1", title);
            page.addText("<P>This is output from SimpleServlet.");
            
            page.write(out);
            out.flush();
        }
    
        public String getServletInfo() {
            return "A simple servlet";
        }
    
    }
    
    HTML tag
    <a href="/servlet/simpleservlet">Try it</a>
    
    [±×¸² 14] Simple ServletÀÇ ½ÇÇàÈ­¸é
    [±×¸² 14] Simple ServletÀÇ ½ÇÇàÈ­¸é

    4.2. Snoop Servlet

    source code
    import java.io.*;
    import java.util.*;
    import java.servlet.*;
    
    public class SnoopServlet extends Servlet {
        public void service(ServletRequest req, ServletResponse res)
            throws IOException
        {
            res.setContentType("text/html");
            res.setHeader("Pragma", "no-cache");
            res.writeHeaders();
            PrintStream out = new PrintStream(res.getOutputStream());
            out.println("<html>");
            out.println("<head><title>Snoop Servlet</title></head>");
            out.println("<body>");
            out.println("<h1>Request information:</h1>");
            out.println("<pre>");
            print(out, "Request method", req.getMethod());
            print(out, "Request URI", req.getRequestURI());
            print(out, "Request protocol", req.getProtocol());
            print(out, "Servlet path", req.getServletPath());
            print(out, "Path info", req.getPathInfo());
            print(out, "Path translated", req.getPathTranslated());
            print(out, "Query string", req.getQueryString());
            print(out, "Content length", req.getContentLength());
            print(out, "Content type", req.getContentType());
            print(out, "Server name", req.getServerName());
            print(out, "Server port", req.getServerPort());
            print(out, "Remote user", req.getRemoteUser());
            print(out, "Remote address", req.getRemoteAddr());
            print(out, "Remote host", req.getRemoteHost());
            print(out, "Authorization scheme", req.getAuthType());
            out.println("</pre>");
            /*
            Hashtable params = req.getQueryParameters();
            if (params.size() > 0) {
                out.println("<h1>Servlet parameters:</h1>");
                out.println("<pre>");
                Enumeration e = params.keys();
                while (e.hasMoreElements()) {
                    String name = (String)e.nextElement();
                    out.println(" " + name + " = " + (String)params.get(name));
                }
                out.println("</pre>");
            }
            */
            if (!req.getProtocol().equals("HTTP/0.9")) {
                out.println("<h1>Request headers:</h1>");
                out.println("<pre>");
                String name;
                for (int i = 0; (name = req.getHeaderName(i)) != null; i++) {
                    out.println(" " + name + ": " + req.getHeader(name));
                }
                out.println("</pre>");
            }
            out.println("</body></html>");
        }
    
        private void print(PrintStream out, String name, String value) {
            out.print(" " + name + ": ");
            out.println(value == null ? "<none>" : value);
        }
    
        private void print(PrintStream out, String name, int value) {
            out.print(" " + name + ": ");
            if (value == -1) {
                out.println("<none>");
            } else {
                out.println(value);
            }
        }
    
        private static final String UNKNOWN = "<unknown>";
    
        public String getServletInfo() {
            return "A servlet that shows the request headers sent by the client";
        }
    }
    
    HTML tag
    <a href="/snoop.html">Try it</a>
    
    [±×¸² 15] Snoop ServletÀÇ ½ÇÇàÈ­¸é
    [±×¸² 15] Snoop ServletÀÇ ½ÇÇàÈ­¸é




    4.3. Fun Servlet

    source code
    import java.io.*;
    import java.servlet.*;
    import sun.server.html.*;
    
    public class FunServlet extends Servlet { 
    
       public void service(ServletRequest req, ServletResponse res)
         throws Exception
       {
         String line;
         res.setContentType("text/html");
         res.writeHeaders();
         OutputStream out = res.getOutputStream();
         DataInputStream in = new DataInputStream(req.getInputStream());
    
         String title = "Servlet Demo";
         HtmlPage page = new HtmlPage(title);
         
         //
         // Spew out html code that will make the browser load an applet.
         // Setup the codebase right. Will work only in Java enabled browsers
         //
         page.addText("<applet code=NervousApplet.class codebase=\"../applet/\" height=200 width=1800>");
         page.addText("<param name=text value=\"Jeeves can load Servlets!\">");
         page.addText("</applet>");
         page.write(out); 
       }
    }
    
    HTML tag
    <a href="/fun.html">Try it</a>
    
    [±×¸² 16] Fun ServletÀÇ ½ÇÇàÈ­¸é
    [±×¸² 16] Fun ServletÀÇ ½ÇÇàÈ­¸é

    4.4. Finger Servlet

    source code
    import java.io.*;
    import java.servlet.*;
    import sun.server.html.*;
    
    public class FunServlet extends Servlet { 
    
       public void service(ServletRequest req, ServletResponse res)
         throws Exception
       {
         String line;
         res.setContentType("text/html");
         res.writeHeaders();
         OutputStream out = res.getOutputStream();
         DataInputStream in = new DataInputStream(req.getInputStream());
    
         String title = "Servlet Demo";
         HtmlPage page = new HtmlPage(title);
         
         //
         // Spew out html code that will make the browser load an applet.
         // Setup the codebase right. Will work only in Java enabled browsers
         //
         page.addText("<applet code=NervousApplet.class codebase=\"../applet/\" height=200 width=1800>");
         page.addText("<param name=text value=\"Jeeves can load Servlets!\">");
         page.addText("</applet>");
         page.write(out); 
       }
    }
    
    HTML tag
    <form action="/finger.html" method="GET">
    <table>
    <tr><td>Username:</td><td><input type="TEXT" name="user" size=10></td></tr>
    <tr><td>Hostname:</td><td><input type="TEXT" name="hosts" size=10></td>
    <td>leave blank for local host<br>
    multiple hostnames may be separted by commas</td></tr>
    <tr><td>Verbose:</td><td><input type="checkbox" name="verbose" value="yes" CHECKED></td></tr>
    </table>
    <input type="SUBMIT" value="Try it">,
    </form>
    
    [±×¸² 17] Finger ServletÀÇ HTML Form
    [±×¸² 18] Finger ServletÀÇ ½ÇÇàÈ­¸é
    [±×¸² 17] Finger ServletÀÇ HTML Form
    [±×¸² 18] Finger ServletÀÇ ½ÇÇàÈ­¸é



    5. Summary

    Áö±Ý±îÁö À¥ ¼­¹ö·Î½á Jeeve¿Í ±âÁ¸ÀÇ CGI¿Í ºñ½ÁÇÑ ÇüÅÂÀÇ Java ÀÀ¿ë ÇÁ·Î±×·¥ÀÎ Servlet¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é »õ·Ó°Ô ÇÁ·Î±×·¥ÀÌ LoadµÇ¾î ½ÇÇàµÇ°í ¿©·¯¸íÀÇ »ç¿ëÀÚ°¡ °°Àº CGI¸¦ ½ÇÇàÇÏ´õ¶óµµ °¢°¢ÀÇ CGIÇÁ·Î±×·¥ÀÌ »õ·Ó°Ô ·ÎµåµÇ¾î ½ÇÇàµÇ´Â ¹Ý¸é ServletÀº ¿©·¯°¡Áö ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

    ServletÀº óÀ½ ½ÇÇàµÇ¸é Server°¡ downµÉ¶§ ±îÁö °è¼Ó ½ÇÇàµÇ¾î, ¿©·¯¸íÀÇ ´Ù¸¥ »ç¿ëÀÚ°¡ ServletÀ» Á¢¼ÓÇϸé Thread¸¦ »ý¼ºÇÏ¿© ¼­ºñ½ºÇÑ´Ù. ¸¶Ä¡ Daemon°ú °°Àº ±â´ÉÀ» À¯ÁöÇÑ´Ù. ¶ÇÇÑ, ServletÀº Áö¼ÓÀûÀ¸·Î ½ÇÇàµÇ°í ÀÖÀ¸¹Ç·Î HTTPDÀÇ ±Ùº»ÀûÀÎ ¹®Á¦ÀÎ ConnectionÀ» À¯ÁöÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù. ÇÑÆí, Jeeve¿Í ServletÀº ¸ðµÎ ÀÚ¹Ù·Î °³¹ßµÇ¾ú±â ¶§¹®ÀÇ ±âŸ ÀÚ¹ÙÀÇ ÀåÁ¡ÀÎ Ç÷§Æû µ¶¸³ÀûÀ̰í(»õ·Ó°Ô ÄÄÆÄÀÏÇÒ Çʿ䰡 ¾ø´Ù.), µ¿ÀûÀ̸ç È®À强/À̽ļº/À¯Áöº¸¼ö ±â´ÉÀÌ ¶Ù¾î³ª¸ç, ÇÁ·Î±×·¥ »çÀÌÁî°¡ ¾ÆÁÖ À۱⠶§¹®¿¡ ½Ã½ºÅÛ ºÎÇϰ¡ ÀÛ´Ù. ¾ÆÁ÷±îÁö Á¤½Ä ¹öÀüÀÇ Jeeve°¡ ³ª¿ÀÁö ¾Ê¾ÒÁö¸¸, ÀÚ¹Ù·Î °³¹ßµÈ HotJava À¥ ºê¶ó¿ìÀú¿Í ÇÔ²² ¾ÕÀ¸·Î Å©°Ô ±â´ëµÈ´Ù.

    ±×¹ÛÀÇ »õ·Î¿î ¼Ò½ÄÀ̳ª ±Ã±ÝÇÑ »çÇ×Àº ¸ÞÀϸµ ¸®½ºÆ®¸¦ ÅëÇØ¼­ ¾òÀ» ¼ö ÀÖ´Ù.

    JavaSoft jeeve mailing :
  • listserv@java.sun.com
  • jeeves@java.sun.com
    or
    jeeves-interest@java.sun.com
  • subscribe jeeves-announce your real name
    or
    subscribe jeeves-interest your real name
    JavaKorea mailing :
  • majordomo@elim.net
  • java@elim.net
  • subscribe java




  • Âü°í¹®Çå(References)

    [JavaSoft Home Page]
    URL: http://www.javasoft.com/
    JDK¿Í Jeeve ¹× ±âŸ JavaSoftÀÇ Á¦Ç°°ú ¼ÒÇÁÆ®¿þ¾îÀÇ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
    [Jeeves Home Page]
    URL: http://www.javasoft.com/products/jeeves/index.html
    Jeeve¿¡ ´ëÇÑ ¹®¼­¿Í °ü·Ã ¸ðÀӵ鿡 ´ëÇÑ ¸ðµç ÀڷḦ ¾òÀ» ¼ö ÀÖ´Ù.
    [Gamelan : Programming in Java]
    URL: http://www-b.gamelan.com/pages/Gamelan.programming.libraries.html
    Java Programming¿¡ µµ¿òÀÌ µÉ¸¸ÇÑ ÀÚ¹Ù ÇÁ·Î±×·¥°ú ¹®¼­µéÀ» ¸ð¾Æ³õ¾Ò´Ù.

    Last-Modified : Saturday, 22-October-96 04:00:00