JavaサーブレットでのRequest、Responseの説明

69030 ワード

JavaサーブレットでのRequest、Responseの説明
一、request機能:
1.要求メッセージデータを取得する:
要求ラインデータを取得するには、次の手順に従います.
GET/day16/demo1?name=zhangsan HTTP/1.1
  • 取得要求方式:GET
    String getMethod()
  • 仮想ディレクトリ取得:/day 16
    String getContextPath()
  • サーブレットパス取得:/demo 1
    String getServletPath()
  • get方式要求パラメータ取得:name=zhangsan
    String getQueryString()
  • 取得要求URI:/day 16/demo 1
    String getRequestURI():/day16/demo1
    String getRequestURL()::http://localhost/day16/demo1
    URL:統一リソースロケータ;
    URI:統一資源識別子;
  • 取得プロトコルおよびバージョン:Http/1.1
    String getProtocol()
  • クライアントのIPアドレスを取得する:
    String getRemoteAddr()
  • コードは以下の通り:
    package cn.web.servlet;
    
    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 java.io.IOException;
    
    @WebServlet("/demo1")
    // HttpServlet      ,     GenericServlet , GenericServlet              , GenericServlet    Servlet
    public class ServletDemo3 extends HttpServlet {
        /*
            HttpServlet            
         */
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("    Get  ");
            // 1.      
            String method = req.getMethod();
            System.out.println(method);  //     :GET
            //2.      
            String contextPath = req.getContextPath();
            System.out.println(contextPath);  //     : /day_16
            // 3.  Servlet  
            String servletPath = req.getServletPath();
            System.out.println(servletPath);  //     :/demo1
            // 4.  get      
            String queryString = req.getQueryString();
            System.out.println(queryString);  //    : name=zhangsan
            // 5.  URI\URL
            String requestURI = req.getRequestURI();
            System.out.println(requestURI);  //     :/day_16/demo1
            StringBuffer requestURL = req.getRequestURL();
            System.out.println(requestURL);  //     :http://localhost:8080/day_16/demo1
            // 6.       
            String protocol = req.getProtocol();
            System.out.println(protocol);  //     :HTTP/1.1
            // 7.      IP  
            String remoteAddr = req.getRemoteAddr();
            System.out.println(remoteAddr);  //     :0:0:0:0:0:0:0:1
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("    Post  ");
        }
    }
    
  • 要求ヘッダデータの取得:
  • 要求ヘッダの名前で要求ヘッダの値を取得する:
  • String getHeader(String name)
  • すべてのリクエストヘッダ名を取得する:
    Enumeration getHeaderNames()
  • コード実装:
    package cn.web.servlet;
    
    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 java.io.IOException;
    import java.util.Enumeration;
    
    @WebServlet("/demo05")
    public class ServletDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //          
    
            // 1.         
            Enumeration<String> headerNames = req.getHeaderNames();
    
            // 2.  
            while (headerNames.hasMoreElements()){
                String name = headerNames.nextElement();
                // 3.            
                String header = req.getHeader(name);
                System.out.println(header);
            }
        }
    }
    
  • 要求ボリュームデータを取得するには、次の手順に従います.
  • 要求体:POST要求方式のみで、要求体にPOST要求の要求パラメータが封入されている.
  • 手順:
  • ストリームオブジェクトの取得;
  • BufferedReader getReader():文字入力ストリームを取得し、文字データのみを操作する.
  • ServiletInputStream getInputStream():バイト入力ストリームを取得し、すべてのタイプのデータを操作できる;

  • ストリームオブジェクトからデータを取得する.

  • コード:
    //         
    package cn.web.servlet;
    
    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 java.io.BufferedReader;
    import java.io.IOException;
    
    @WebServlet("/demo06")
    public class ServletDemo06 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //        ....     
            // 1.     
            BufferedReader reader = req.getReader();
            String line = null;
            // 2.    
            while ((line = reader.readLine())!=null){
                System.out.println(line);
            }
        }
    }
    
  • 2.その他の機能:
    取得要求パラメータ共通方式: get post ;
  • パラメータ名によるパラメータ値の取得:
    String getParameter(String name)
    例:userName=zs&password=123
  • パラメータ名からパラメータ値を取得する配列:
    String[] getParameterValues(String name)
    例えば、body=xxx&body=yyy
  • 全ての要求パラメータ名を取得する:
    Enumeration getParameterNames()
  • 全てのパラメータのmapセットを取得する:
    Map getParameterMap()

  • コード:
    package cn.web.servlet;
    
    import javax.servlet.ServletConfig;
    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 java.io.IOException;
    import java.util.Enumeration;
    import java.util.Map;
    import java.util.Set;
    
    @WebServlet("/demo07")
    public class ServletDemo07 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get");
    
            // 1.           
            String userName = req.getParameter("userName");
            System.out.println(userName);
            System.out.println("---------------------------");
    
            // 2.             
            String[] bodies = req.getParameterValues("body");
            for (String body : bodies) {
                System.out.println(body);
            }
            System.out.println("---------------------------");
    
            // 3.           
            Enumeration<String> parameterNames = req.getParameterNames();
            while (parameterNames.hasMoreElements()){
                String s = parameterNames.nextElement();
                String parameter = req.getParameter(s);
                System.out.println(parameter);
            }
            System.out.println("---------------------------");
    
            // 4.       map  
            Map<String, String[]> parameterMap = req.getParameterMap();
            Set<String> keySet = parameterMap.keySet();
            for (String s : keySet) {
                //       
                String[] strings = parameterMap.get(s);
                System.out.println(s);
                for (String string : strings) {
                    System.out.println(string);
                }
            }
            System.out.println("---------------------------");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post");
            //     post  get          
            this.doGet(req, resp);
        }
    }
    

    中国語の文字化けし問題:
  • get方式:tomcat 8バージョンではget方式の文字化けし問題が解決した.
  • post方式:文字化けし;
  • 解決:パラメータを取得する前に、requestの符号化request.setCharacterEncoding(「utf-8」)を設定する.
  • @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("post");
            //            
            req.setCharacterEncoding("utf-8");
            //     post  get          
            this.doGet(req, resp);
        }
    

    リクエスト転送:サーバ内部のリソースジャンプ方式;
  • 手順:
  • リクエストリピータオブジェクトをrequestオブジェクトで取得する:RequestDispatcher getRequestDispatcher(String path);
  • RequestDispatcherオブジェクトによる転送:forward(サーブレットRequest request,サーブレットResponse response);

  • 特徴:
  • ブラウザのアドレスバーの経路は変化しない;
  • 現在のサーバ内部リソースへの転送のみ;
  • 転送は1回の要求である.


  • コード:
    // demo08    ,      /demo08     /demo09 
    package cn.web.servlet;
    
    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 java.io.IOException;
    
    @WebServlet("/demo08")
    public class ServletDemo08 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo08");
    
            //        /demo09 
            req.getRequestDispatcher("/demo09").forward(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    
    // demo09    
    package cn.web.servlet;
    
    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 java.io.IOException;
    
    @WebServlet("/demo09")
    public class ServletDemo09 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("  ___________demo09");
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    
    //     :
    demo08
      ___________demo09
    

    共有データ:
  • ドメインオブジェクト:有効範囲のオブジェクトで、範囲内でデータを共有することができる;
  • requestドメイン:1回の要求の範囲を表し、転送を要求する複数のリソースでデータを共有するために一般的に用いられる.
  • 方法:
  • void setAttribute(String name,Object obj):データ格納;
  • Object getAttitude(String name):キーによる値取得;
  • void removeAttribute(String name):キー値ペアをキーで除去する;

  • コード:
    // demo08        
    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo08");
    
            //      request   
            req.setAttribute("msg", "hello!");
            //        /demo09 
            req.getRequestDispatcher("/demo09").forward(req, resp);
        }
    
    // demo09        
    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("  ___________demo09");
            //     
            Object msg = req.getAttribute("msg");
            System.out.println(msg);
        }
    
    demo08
      ___________demo09
    hello!
    
  • サーブレットContextを取得するには、次の手順に従います.
    概念:Webアプリケーション全体を代表し、プログラムのコンテナ(サーバ)と通信することができる.
    取得:
  • requestオブジェクトによる取得;
    request.getServletContext();
  • HttpServeretで取得;
    this.getServletContext();
  • //   ServletContext   
    package cn.web.servlet;
    
    import javax.servlet.ServletContext;
    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 java.io.IOException;
    
    @WebServlet("/servletContext")
    public class ServletContextDemo extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //   ServletContext
    
            // 1.  request    
            ServletContext context1 = request.getServletContext();
    
            // 2.  HttpServlet  
            ServletContext context2 = this.getServletContext();
    
            //     context     
            System.out.println(context1.equals(context2));  //   :true      ServletContext        
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    

    機能:
  • MIMEタイプ取得;
  • MIMEタイプ:インターネット通信中に定義されたファイルデータ型:
  • フォーマット:
    大タイプ/小タイプtext/html image/jpg
  • 取得:String getMimeType(String file);
  • protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1.  HttpServlet  
            ServletContext context2 = this.getServletContext();
            // 2.      
            String  fileName = "a.jpg";
            // 3.  MIME   
            String mimeType = context2.getMimeType(fileName);  
            System.out.println(mimeType);  //     : image/jpeg
        }
    
  • ドメインオブジェクト:共有データ;
  • setAttribute(String name, Object value);
  • getAttrbute(String name);
  • removeAttribute(String name);
    サーブレットContextオブジェクトリソース、すべてのユーザーが要求できるデータ;

  • ファイルのリアルパスを取得する.
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1.  HttpServlet  
            ServletContext context2 = this.getServletContext();
            // 2.          
            String realPath = context2.getRealPath("/a.text");
            System.out.println(realPath);
    }
    

  • 二、Response機能:
    1.機能:
    応答情報を設定します.
  • フォーマット:HTTP/1.1 200 ok
  • ステータスコード設定:setStatus(int sc)
  • 応答ヘッダの設定:setHeader(String name,String value)
    応答体の設定:
  • 出力ストリームの取得:
    文字出力ストリーム:PrintWriter getWriter()
    バイト出力ストリーム:サーブレットOutput Stream()
  • 出力ストリームを使用してクライアントブラウザにデータを出力する.

  • 導入事例:
  • リダイレクトのケース:
    // demo      demo2      demo  
    package cn.web.servlet;
    
    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 java.io.IOException;
    
    /*
             
     */
    @WebServlet("/responseDemo")
    public class ResponseDemo extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo   ............");
            /*
                  /responseDemo  ,       /responseDemo02   
             */
            // 1.         , 302      
            // response.setStatus(302);
            // 2.       ,           
            // response.setHeader("location", "/day_16/responseDemo02");
    
            //          
            response.sendRedirect("/day_16/responseDemo02");
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    **リダイレクトの最も簡単な書き方:**response.sendRedirect("/day_16/responseDemo 02");
    // dam02   
    package cn.web.servlet;
    
    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 java.io.IOException;
    
    @WebServlet("/responseDemo02")
    public class ResponseDemo02 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo02   ..................");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
        }
    }
    
    //     :    demo       demo2 
    demo   ............
    demo02   ..................
    
  • リダイレクト特徴(redirect):
  • アドレスバーが変化した;
  • リダイレクトは他のサイト(サーバ)リソースにアクセス可能;
  • リダイレクトは2回のリクエストである.

  • 転送特徴(forward):
  • アドレスバーは変化しない.
  • 転送は現在のサーバ下のリソースにしかアクセスできない.
  • 転送は1回の要求である.(requestオブジェクトでデータ共有可能)


  • 2.簡単なケース:
    サーバは、文字/バイトデータをブラウザに出力します.
    手順:
  • 文字/バイト出力ストリームを取得する.
  • 出力データ;

  • 注意:
  • 文字化けし問題:
  • PrintWirter pw = response.getWriter(); 取得されたストリームのデフォルト符号化はISO-8859-1である.
  • ストリームのデフォルト符号化を設定する.
  • ブラウザ応答体に使用する符号化を伝える.

  • 単純な形式で、エンコーディングを設定します.
    response.setContentType(“text/html; charset=utf-8”)

    コード:
    package cn.web.servlet;
    
    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 java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/responseServlet")
    public class ResponseServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //        ,        : ISO-8859-1    :GBK
            // response.setCharacterEncoding("utf-8");
    
            //      ,               ,             
            // response.setHeader("content-type", "text/html;charset=utf-8");
    
            //          
            response.setContentType("text/html;charset=utf-8");
            // 1.       
            PrintWriter writer = response.getWriter();
            // 2.    
            writer.write("   ~ hello");
            
            // 1.       
            ServletOutputStream outputStream = response.getOutputStream();
            // 2.    
            outputStream.write("  ".getBytes("utf-8"));
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }