Java Web入門:HttpResonseとHttpRequest詳細


HttpResonse解説
HttpServlet Responseの概要:
Servletを作成するときは、Service()方法、またはdoGet()/doPost()をカバーします。これらの方法はいずれも2つのパラメータがあります。一つは、要求を表すrequestとレスポンスponseを表します。service方法におけるレスポンスのタイプはServlets Resonseであり、doGet/doPostメソッドのレスポンスのタイプはHttpServletResonseであり、HttpServletResonseはServlet Resonseのサブインターフェースであり、機能と方法はより強力である。
Resonse運転プロセス
img
応答ヘッダがたくさんあります。ここではよく使うものだけを紹介します。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAvaDBGw-1620739367741)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511163256716.png)]
ブラウザでは、F 12クローズドで応答ヘッダ、要求ヘッダ、特定のものを確認することができます。
応答行を設定
応答の状態コードを設定します。

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test3")
public class HttpResponseTest3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("     ,         ,         ");
        resp.setStatus(404);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
テスト
在这里插入图片描述
応答ヘッダを設定
ジャンプページを更新

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test4")
public class HttpResponseTest4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //        1     
        System.out.println("       1     ");
        resp.setHeader("Refresh", "1");
        //     3       
//        resp.setHeader("Refresh","3;URL=hello.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
テスト
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGJQhKor-1620739367743)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511162434487.png)]
一つの小さなデモが更新ページの累積を実現しました。

/**
 * response
 * @author Adimi
 */
@WebServlet("/test4")
public class ResponseTest4 extends HttpServlet {
    private static Integer id=1;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Refresh","1");
        PrintWriter writer = response.getWriter();
        id++;
        writer.print("id==>"+id);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
文字コードを設定して、中国語の文字化け問題を解決します。

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test1")
public class HttpResponseTest1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //         
        //      
        //        resp.setCharacterEncoding("UTF-8");
        //                                  
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("  ,  !!!");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
テスト
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5VCR2LeF-1620739367746)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511162823603.png)]
リダイレクトredirect

/**
 *    
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("hello.jsp");
//        resp.setHeader("location","www.baidu.com");          
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
リクェスト転送

/**
 *    
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.sendRedirect("hello.jsp");
        req.getRequestDispatcher("hello.jsp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
リダイレクトと転送の違い
ファイルのダウンロード
パスリソースを取得

String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");
リソースを読み込み

FileInputStream fileInputStream=new FileInputStream(path);
ファイル名を取得して、パスをコンピュータに保存する形式は\\です。

String fileName=path.substring(path.lastIndexOf("\\")+1);
メッセージヘッダを設定してブラウザに教えてください。この画像設定コードをダウンロードしたいです。

resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
読んだ内容をブラウザに返す

 int len=0;
byte[] bytes=new byte[1024];
// ServletOutputStream                     
ServletOutputStream servletOutputStream=resp.getOutputStream();
while((len=fileInputStream.read(bytes))>0) {
    servletOutputStream.write(bytes,0,len);
}
リソースを閉じる

servletOutputStream.close();
        fileInputStream.close();
注:8.jpgは私のレスキューフォルダの下に置いてありますが、ここで書くべきのは8.jpgをコンパイルした場所です。

具体的なコード

/**
 * @Author: crush
 * @Date: 2021-05-09 19:40
 * version 1.0
 */
@WebServlet("/down")
public class ResponseDownFile extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //      
        String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");
        //    
        FileInputStream fileInputStream=new FileInputStream(path);
        //      ,            \\
        String fileName=path.substring(path.lastIndexOf("\\")+1);
        //          ,    1.png    
        //              
        //      
        resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //             
        int len=0;
        byte[] bytes=new byte[1024];
        ServletOutputStream servletOutputStream=resp.getOutputStream();
        while((len=fileInputStream.read(bytes))>0) {
            servletOutputStream.write(bytes,0,len);
        }
        //     
        servletOutputStream.close();
        fileInputStream.close();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
HttpRequestの解説
HttpServletRequestの概要
Servletを作成するときは、Service()方法、またはdoGet()/doPost()をカバーします。これらの方法はいずれも2つのパラメータがあります。一つは、要求を表すrequestとレスポンスponseを表します。service()メソッドには、要求の仕方に応じてdoget()とdopost()を呼び出すと書かれています。
service法におけるrequestのタイプはServletRequestであり、doGet/doPost法のrequestタイプはHttpServletRequestであり、HttpServletRequestはServletRequestのサブインターフェースであり、機能と方法はより強力である。
Request運行フロー
img
要求されたパラメータを取得します。

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request1")
public class RequestTest1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //                   
        String username = req.getParameter("username"); 
        String password = req.getParameter("password");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>"+username+":"+password+"</h1>");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zxGslkb-1620739367750)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511170056042.png)]
複数のパラメータの値を取得します。

  @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //               
        req.setCharacterEncoding("utf-8");
        Enumeration<String>  names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            String[]  values = req.getParameterValues(name);
            System.out.println(name+":"+ Arrays.toString(values));
        }
    }
要求行の情報を取得する

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request3")
public class RequestTest3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //      url
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("   URL===>"+requestURL);
        //      Servlet   
        String path = req.getServletPath();
        System.out.println("   Servlet   ===>"+path);
        //        HTTP     ,  GET,POST PUT
        String method = req.getMethod();
        System.out.println("        HTTP     ==>"+method);
        //                  Internet  (IP)  
        String remoteAddr = req.getRemoteAddr();
        System.out.println("remoteAddr==>"+remoteAddr);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
requestは転送を実現します

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request2")
public class RequestTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //   request2     request4 
        req.getRequestDispatcher("/request4").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
requestはドメインオブジェクトです。
requestオブジェクトもデータを格納する領域オブジェクトであるので、以下のような方法もある。setAttribute(String name, Object o)getAttribute(String name)removeAttribute(String name)Servlet Contectのスコープ:
作成:webアプリケーションを起動するときに作成します。
廃棄:webアプリケーションを閉じるときに廃棄する
ドメインの役割範囲:ウェブアプリケーション全体の起動周期
requestスコープ:
作成:アクセス時にrequestを作成します。
廃棄:応答完了request廃棄
ドメインの作用範囲:一回の要求において
締め括りをつける
この文章はここまでです。あなたに助けを与えたいです。私たちのもっと多い内容に注目してください。