天天看點

WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

目錄

​​1,response對象【重點】​​

​​1.1:簡述&繼承關系&生命周期​​

​​1.2:響應行​​

​​1.3:響應頭​​

​​1.4:響應體​​

​​2,案例2:讀取WEB工程的資源檔案​​

​​2.1:需求說明及分析​​

​​2.2:SE實作​​

​​2.3:EE實作【階段重點】​​

💟作者簡介:大家好呀!我是愛吃豆的洋芋    

🏆部落客資訊:人必有所執,方能有所成!

🐋希望大家多多支援😘一起進步呀!

🌈若有幫助,還請【關注➕點贊➕收藏】,不行的話我再努力努力呀!💪

1,response對象【重點】

1.1:簡述&繼承關系&生命周期

WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

1.2:響應行

WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
/**
 * 狀态碼
 */
public void run1(){
    HttpServletResponse response = getResponse();
    response.setStatus(404);//若不設定狀态碼,由伺服器自動設定。正常預設狀态碼:200
}      
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

建議該方法僅發送4xx和5xx狀态碼

public void run2() throws IOException {
    getResponse().sendError(404,"找不到該頁面,<font color='red'>呵呵</font>");
}      
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

1.3:響應頭

WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
/**
 * 響應頭
 * @throws IOException
 */
public void run3() throws IOException {
    HttpServletResponse response = getResponse();
    //k1=v1  k2=v2   k1=v3
    //注意:若需要新值覆寫舊值,使用setHeader。 若需要儲存所有值,使用addHeader
    //setHeader 設定/覆寫 響應頭
    /*response.setHeader("k1","v1");
    response.setHeader("k2","v2");
    response.setHeader("k1","v3");//覆寫了k1=v1*/
    //addHeader 追加     響應頭
    response.addHeader("k1","v1");
    response.addHeader("k2","v2");
    response.addHeader("k1","v3");
}      
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章
//ajax:設定響應體:response.setCharacterEncoding
//response.setCharacterEncoding("utf-8");//設定響應體編碼碼表為utf-8

//非ajax傳統操作:response.setContentType
//mime類型;charset=碼表
//response.setContentType("text/html;charset=utf-8");      

1.4:響應體

伺服器向響應體寫出的内容,都會被浏覽器接收。

若需要傳遞大量資訊,把大量資訊寫在響應體。

字元流:

PrintWriter writer = response對象.getWriter();

writer.write("HTML代碼+CSS代碼+JS代碼");

/**
 * 響應體
 */
public void run4() throws IOException {
    //字元流
    PrintWriter writer = getResponse().getWriter();
    writer.write("<h1 align='center' id='d'>字元流</h1><script>document.getElementById('d').innerHTML='字元流呵呵'</script>");
}      
WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

位元組流:

ServletOutputStream outputStream = getResponse().getOutputStream();

outputStream.write(位元組數組);

/**
 * 響應體
 */
public void run5() throws IOException {
    ServletOutputStream outputStream = getResponse().getOutputStream();
    outputStream.write("<h1 align='center' id='d'>位元組流</h1><script>document.getElementById('d').innerHTML='位元組流呵呵'</script>".getBytes("utf-8"));
}      

小結:

  1. 何時使用位元組流、何時使用字元流?

文本、代碼輸出展示:字元流

圖檔、聲音等檔案輸出:位元組流(檔案下載下傳)

     2. 流是否需要重新整理和關閉?

一般情況下,無需對響應中的流進行重新整理和關閉操作。

關閉是由tomcat來進行控制。

字元流中,若字元資料超過8K,需要人工調用flush()進行重新整理。

注意事項:一個響應體不能同時被兩種類型的流進行寫出操作。(一山難容二虎)

/**
 * 響應體被兩個流操作的報錯
 */
public void run6() throws IOException {
    getResponse().getWriter();
    getResponse().getOutputStream();//java.lang.IllegalStateException: getWriter() has already been called for this response
}      

JSP:特殊Servlet。   展示HTML+CSS+JS使用 字元流。

注意:JSP因為已經調用了字元流,根據servlet的response對象特性,不能再調用位元組流了。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write("haha".getBytes("utf-8"));
    %>
</head>
<body>

</body>
</html>      

java.lang.IllegalStateException: getOutputStream() has already been called for this response

2,案例2:讀取WEB工程的資源檔案

2.1:需求說明及分析

WEB項目,java代碼讀取資源檔案(html/css/js/jsp/servlet/jpg/avi...)。

資源檔案的有效路徑。

目标:

通過該案例,熟練掌握getRealPath方法

WEB核心【response對象(重點),案例:讀取WEB工程資源檔案】第十一章

要求分别使用JavaSE和JavaEE的技術來擷取4個檔案 

2.2:SE實作

public class Demo1 {
    public static void main(String[] args) throws IOException {
        //javaSE
        //相對路徑出發目錄 是目前源碼目錄的根目錄。 相對路徑,最終會被拼接為絕對路徑來定位資源檔案
        getFile("src/1.txt");//idea執行時,會将該相對路徑,拼接為絕對路徑  D:/IDEA2020/class12/10web2/day07_2/src/1.txt
        getFile("web/2.txt");
        getFile("web/WEB-INF/3.txt");
        getFile("4.txt");
    }
    /**
     *根據路徑讀取檔案的第一行内容
     */
    public static void getFile(String path) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(new File(path)));
        System.out.println(reader.readLine());
        reader.close();
    }
}      

小結:

JavaSE寫法:

相對路徑的出發目錄為:源碼的根目錄

在定位檔案時,會将相對路徑 變為帶盤符的絕對路徑來使用。

2.3:EE實作【階段重點】

//原因:SE和EE代碼的執行位置不同的,相對路徑出發目錄也不同
//SE代碼執行位置是:目前項目的Out執行。 相對路徑出發目錄:目前源碼目錄的根目錄
//EE代碼執行位置時:tomcat的bin目錄執行。 相對路徑出發目錄:Tomcat的bin目錄
//結論:1、SE和EE最終都需要絕對路徑
//      2、SE的相對路徑出發目錄是目前源碼根目錄,是以可以正常使用
//         EE的相對路徑的出發目錄是tomcat的bin目錄,不能使用。
String absolutePath = new File("./").getAbsolutePath();
System.out.println(absolutePath);//D:\temp\apache-tomcat-7.0.52\bin\      
public void run1() throws IOException {
    //嘗試使用SE方式進行WEB項目資源擷取
    /*getFile("src/1.txt");//java.io.FileNotFoundException
    getFile("web/2.txt");//java.io.FileNotFoundException
    getFile("web/WEB-INF/3.txt");//java.io.FileNotFoundException
    getFile("4.txt");//java.io.FileNotFoundException*/
    //原因:SE和EE代碼的執行位置不同的,相對路徑出發目錄也不同
    //SE代碼執行位置是:目前項目的Out執行。 相對路徑出發目錄:目前源碼目錄的根目錄
    //EE代碼執行位置時:tomcat的bin目錄執行。 相對路徑出發目錄:Tomcat的bin目錄
    //結論:1、SE和EE最終都需要絕對路徑
    //      2、SE的相對路徑出發目錄是目前源碼根目錄,是以可以正常使用
    //         EE的相對路徑的出發目錄是tomcat的bin目錄,不能使用。
    String absolutePath = new File("./").getAbsolutePath();
    System.out.println(absolutePath);//D:\temp\apache-tomcat-7.0.52\bin\

    //擷取釋出目錄根目錄在硬碟的絕對位置
    String path = getServletContext().getRealPath("/");
    getFile(path+"/WEB-INF/classes/1.txt");
    getFile(path+"/2.txt");
    getFile(path+"/WEB-INF/3.txt");
}      

最後:

        如果文章對您有幫助,就拿起小手趕緊給部落客點贊💚評論❤️收藏💙 一下吧! 

       願我們在未來的日子裡。熠熠生輝!!!