13、サーブレット入門

25351 ワード

基本的な知識:
リクエスト
1)http  :                        。
2)http  :   ->    
  : 
       (    (GET/POST)     (URI) http    (http1.1))
       (       。 host、user-agent、referer)
        
        (POST     )

HttpServiceletRequestオブジェクト:リクエストオブジェクト.リクエスト情報を取得します.
   :request.getMethod()   request.getRequestURI/getRequestURL()  request.getProtocol();
   : request.getHeader("name")    request.getHeaderNames()  
    : request.getInputStream() 

      :(GET POST)
    request.getParameter("name")        
    request.getParameterValues("name");       
    request.getParameterNames()        

httpレスポンス:サーバ->ブラウザ側
      : 
           (http           )
                  : 200   302  404   500
           ( location(  302            )、 
            refresh(    )、content-type、                         
            content-disiposition(       )) 
            
            

HttpServeretResponseオブジェクト:応答オブジェクト.レスポンス情報を設定します.
           : response.setStatus();
           : response.setHeader("name","value")
            : 
                (PrintWriter) response.getWriter().writer();     
              (OutputStream)response.getOutputStream().writer();      

content-Type作用
        //response.setCharacterEncoding("utf-8");

        /** *                     */
        //response.setHeader("content-type", "text/html");
        response.setContentType("text/html;charset=utf-8");//       。       

手動でサーブレットを開発
手順:
1)  java ,  HttpServlet 
2)  doGet doPost  
3)Servlet    tomcat     !!
    3.1 servlet   class    WEB-INF/classes  
    3.2  web.xml       
<!--     servlet -->
  <!-- servlet    -->
  <servlet>
    <!-- servlet     ,   。      -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet    :   +     -->
    <servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
  </servlet>


  <!-- servlet      -->
  <servlet-mapping>
    <!-- servlet     ,               !! -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet     (  servlet   ) -->
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

アクセスの原理:
tomcat      ,    webapps    web   web.xml    。  
http://: http  
localhost:     hosts               IP  
    127.0.0.1
8080:      tomcat   
/day10      tomcat webapps     day10   
/first        。
    1) day10 web.xml         url-pattern   (/first)
    2)       url-pattern,     servlet-name    web.xml            servlet  
    3)    ,      servlet      servlet-class  :
               : gz.itcast.a_servlet.FirstServlet
    :
    a)  FirstServlet   
    b)    FirstServlet     

マップパス
        /first           http://localhost:8080/day10/first
           /itcast/demo1     http://localhost:8080/day10/itcast/demo1

        /*                   http://localhost:8080/day10/    
          /itcast/*               http://localhost:8080/day10/itcast/    
          *.                 http://localhost:8080/day10/    .do
              *.do
              *.action
              *.html(   )

注意:
1)url-pattern   /  ,   *  。  ,itcast/*.do     。
2)            ,   /itcast/*.do     
3)     URL   servlet         :
    3.1       。(         )
    3.2          url-pattern     !!!

ケース:
           :
Servlet1     /abc/* 
Servlet2     /* 
Servlet3     /abc 
Servlet4     *.do 
  :
   URL “/abc/a.html”,“/abc/*” “/*”   ,  servlet  
    Servlet     Servlet1。
   URL “/abc” ,“/abc/*” “/abc”   ,  servlet  
    Servlet     Servlet3。
   URL “/abc/a.do” ,“/abc/*” “*.do”   ,  servlet  
    Servlet     Servlet1。
   URL “/a.do” ,“/*” “*.do”   ,  servlet  
    Servlet     Servlet2。
   URL “/xxx/yyy/a.do” ,“/*” “*.do”   ,  servlet  
    Servlet     Servlet2。

デフォルトのパス
servletのデフォルトパス(/)はtomcatサーバに組み込まれたパスです.このパスはDefaultService(デフォルトのサーブレット)に対応しています.このデフォルトのサーブレットの役割は、Webアプリケーションの静的リソースファイルを解析することです.質問:URL入力http://localhost:8080/day10/index.htmlファイルの読み込み方法
1)   day10    web.xml          url-pattern。
2)       url-pattern,   tomcat    DefaultServlet  
3)DefaultServlet   day10                 index.html     。
4)       ,        ,      。
5)        ,   404    。
  :       ,      。

ライフサイクル
導入
サーブレットのライフサイクル:servletクラスオブジェクトはいつ作成され、いつメソッドが呼び出され、いつ破棄されます.サーブレットプログラムのライフサイクルはtomcatサーバによって制御されます!!!
サーブレットの重要な4つのライフサイクルメソッド
    :   servlet       。     ,     servlet     servlet                              1 。  servlet   tomcat     。
init  :    servlet       。   1 。
service  :          (   doPost、doGet)。  n 。
destroy  : 
      servlet       。           web     servlet  。
       1 。

擬似コードプレゼンテーションservletのライフサイクル
Tomtcat      :
    1)       servlet-class   ,   : gz.itcast.a_servlet.FirstServlet
    2)      FirstServlet  
        2.1        
        Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");
        2.2                
        Object obj = clazz.newInstance();     ---1.servlet        
3)  ServletConfig  ,      init  
        3.1       
        Method m = clazz.getDeclareMethod("init",ServletConfig.class);
        3.2     
        m.invoke(obj,config);             --2.servlet init     
4)  request,response  ,      service  
        4.1       
        Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
        4.2     
        m.invoke(obj,request,response);  --3.servlet service     
5) tomcat      web      ,      destroy  
        5.1       
        Method m = clazz.getDeclareMethod("destroy",null);
        5.2     
        m.invoke(obj,null);            --4.servlet destroy     

自動ロード
サーブレットの自動ロード
     ,     servlet     servlet  。  servlet      init              
           sevrlet      。

  servlet       :      web     !!!
 servlet      ,    <load-on-startup>  !!
<servlet>
    <servlet-name>LifeDemo</servlet-name>
    <servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>
    <!--  servlet       -->
    <load-on-startup>1</load-on-startup>    :      ,       !!
  </servlet>

サーブレットのマルチスレッド同時問題
注:servletオブジェクトはtomcatサーバで単一インスタンスマルチスレッドです.
servletはマルチスレッドであるため、メンバー変数などのservletの共有データに複数のservletのスレッドが同時にアクセスすると、スレッドセキュリティの問題が発生する可能性があります.解決策:
1)                (  synchronized       )
2)   servlet            。         ,    。              。
    (          ,     !!),                。
/** * servlet         */
public class TheradDemo extends HttpServlet {

    int count = 1;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        synchronized (TheradDemo.class) {//       。       
            response.getWriter().write("          "+count+"   ");   //  1    ,   2  

        //  1     count++
        /*try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }*/
            count++;
        }
    }

}

HttpServeretのinit
2つのinitソースのクラスは異なります
/** *     init    init   * */
public class InitDemo extends HttpServlet {

    /** *     init   *     servlet       ,    tomcat      */
    /** *   :         ,         init   */
    /*@Override public void init(ServletConfig config) throws ServletException { System.out.println("    init  "); }*/

    /** *     init   *     servlet           。 Sun                ,       servlet          。 */
    @Override
    public void init() throws ServletException {
        System.out.println("    init  ");
    }   
}

サーブレット学習:
 HttpServletRequest      :      
 HttpServletResponse     :       
 ServletConfig      servlet    
 ServletContext  ; servlet      

サーブレットコンフィグオブジェクト
さぎょう
ServletConfig  :        servlet      。   web        ServletConfig  (  Servlet    ServletConfig  )

オブジェクトの作成と取得
    :     servlet    ,   init      。
    :        init     !!!

servletの初期化パラメータ構成
  <servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
    <!--     :         web     ,   ServletConfig    -->
    <init-param>
        <param-name>path</param-name>
        <param-value>e:/b.txt</param-value>
    </init-param>
  </servlet>

注意:servletのパラメータは現在のこのsevletでしか取得できません!!!api:サーブレットコンフィグのAPI:
java.lang.String getInitParameter(java.lang.String name)            
java.util.Enumeration getInitParameterNames()          
ServletContext getServletContext()       servlet     
java.lang.String getServletName()         servlet   

サーブレットContextオブジェクト
サーブレットContextオブジェクトを導入します.サーブレットというコンテキストオブジェクトです.現在のWebアプリケーション環境を表します.1つのWebアプリケーションに1つのサーブレットContextオブジェクトしかありません.オブジェクトの作成と取得
    :  web     ServletContext  。
    :  ServletConfig   getServletContext    

    :
      ServletConfig  
    public void init( ServletConfig config,ServletContext context ){        
          ServletConfig  
          ServletContext  ;
    }

Sun    
    1)  ServletContext        ServletContext  context = new ServletContext()        

    2)  ServletConfig     ServetConfig config = new ServletConfig();
                                       config.setServletContxt(context);
    class  ServletConfig{
            ServletContext context;
            public ServletContext getServletContxt(){
                return contxt;
            }
    } 

    public void init( ServletConfig config ){
          ServletConfig  
         ServletConfig     ServletContext  
        SerlvetContext context = config.getServletContext();
    }

サーブレットContextオブジェクトのコアAPI(役割)
java.lang.String getContextPath()   --    web     

java.lang.String getInitParameter(java.lang.String name)  --  web        
java.util.Enumeration getInitParameterNames()  

void setAttribute(java.lang.String name, java.lang.Object object) --        
java.lang.Object getAttribute(java.lang.String name)  
void removeAttribute(java.lang.String name)  

RequestDispatcher getRequestDispatcher(java.lang.String path)   --  (      )

java.lang.String getRealPath(java.lang.String path)     --  web       
java.io.InputStream getResourceAsStream(java.lang.String path)  

Webアプリケーションパスを取得
java.lang.String getContextPath()               

Webアプリケーションの初期化パラメータ(グローバル)を得る
java.lang.String getInitParameter(java.lang.String name)  --  web        
java.util.Enumeration getInitParameterNames()  
web         web     servlet  !!!

ドメインオブジェクトに関するメソッドドメインオブジェクト:データを保存し、データを取得する役割を果たします.異なるダイナミックリソース間でデータを共有できます.
      :   
    Servlet1                   Servlet2
    name=eric                     
response.sendRedirect("/Servlet2?name=eric")             String request.getParameter("name");
                             
    Student                  
  1:            ,    。  :         。
  2:            ,  :           !!!!!

サーブレットContextはドメインオブジェクトです!!!
    :void setAttribute(java.lang.String name, java.lang.Object object)                  
    : java.lang.Object getAttribute(java.lang.String name)  
    : void removeAttribute(java.lang.String name)  
ServletContext   :       web     !!!

     :
    HttpServletRequet    
    ServletContext   
    HttpSession    
    PageContext     

転送RequestDispatcher getRequestDispatcher(java.lang.String path)
1)  
     a)       
     b)         web      
    c)        ,        request    

2)              
    a)      ,        。
    b)          web  ,   web  ,         。
    c)         ,      request 。

  :      request         ,       !!!

ケース:
ブラウザ・タイプの取得方法
public class RequestDemo3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //     : user-agent
        String userAgent = request.getHeader("user-agent");
        System.out.println(userAgent);

        //            
        if(userAgent.contains("Firefox")){
            response.getWriter().write("          ");
        }else if(userAgent.contains("Chrome")){
            response.getWriter().write("          ");
        }else if(userAgent.contains("Trident")){
            response.getWriter().write("     IE   ");
        }else{
            response.getWriter().write("          ,         ");
        }
    }
}

不正なリンク事例の取得
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        //  referer 
        String referer = request.getHeader("referer");
        System.out.println("referer="+referer);

        /** *       : * 1)      referer=null * 2)             */
        if(referer==null || !referer.contains("/servlet01/adv.html")){
            response.getWriter().write("       ,     。<a href='/day09/adv.html'>  </a>");
        }else{
            //     
            response.getWriter().write("      ...");
        }

    }

GetとPostのパラメータを取得
public class RequestDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /** *           *                     。POST           ,      POST    ! * GET       URI  ,   GET    !!! */
        request.setCharacterEncoding("utf-8");

        /*       System.out.println("GET  "); //  GET        String value = request.getQueryString(); System.out.println(value);*/
        /** *                */
        System.out.println(request.getMethod()+"  ");
        //getParameter(name):           (          )
        String name = request.getParameter("name");

        /** *       (iso-8859-1    -> utf-8    ) */
        /*if("GET".equals(request.getMethod())){ name = new String(name.getBytes("iso-8859-1"),"utf-8"); }*/

        String password = request.getParameter("password");

        /*if("GET".equals(request.getMethod())){ password = new String(password.getBytes("iso-8859-1"),"utf-8"); }*/

        System.out.println(name+"="+password);

        System.out.println("=============================");
        Enumeration<String> enums = request.getParameterNames();
        while( enums.hasMoreElements() ){
            String paramName = enums.nextElement();

            //      hobit,   getParameterValues
            if("hobit".equals(paramName)){
                /** * getParameterValues(name):           (            ) */
                System.out.println(paramName+":");
                String[] hobits = request.getParameterValues("hobit");
                for(String h: hobits){
                /* if("GET".equals(request.getMethod())){ h = new String(h.getBytes("iso-8859-1"),"utf-8"); }*/
                    System.out.print(h+",");
                }
                System.out.println();
                //    hobit,   getParameter
            }else{
                String paramValue = request.getParameter(paramName);
                /* if("GET".equals(request.getMethod())){ paramValue = new String(paramValue.getBytes("iso-8859-1"),"utf-8"); }*/

                System.out.println(paramName+"="+paramValue);
            }
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*       System.out.println("POST  "); InputStream in = request.getInputStream(); byte[] buf = new byte[1024]; int len = 0; while( (len=in.read(buf))!=-1 ){ System.out.println(new String(buf,0,len)); }*/

        /** *                */
        /*System.out.println("POST  "); //           String name = request.getParameter("name"); String password = request.getParameter("password"); System.out.println(name+"="+password); System.out.println("============================="); Enumeration<String> enums = request.getParameterNames(); while( enums.hasMoreElements() ){ String paramName = enums.nextElement(); String paramValue = request.getParameter(paramName); System.out.println(paramName+"="+paramValue); }*/
        //    doGet  ,  doGet doPost       ,    doGet  
        this.doGet(request, response);
    }
}

タイム・リフレッシュ
/** *   -      */
public class ResponseDemo3 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /** *      *   :     refresh ,  refresh            */
        //response.setHeader("refresh", "1"); //  1      

        /** *  n           */
        response.setHeader("refresh", "3;url=/day09/adv.html");// 3      adv.html
    }

}