目錄
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:簡述&繼承關系&生命周期
1.2:響應行
/**
* 狀态碼
*/
public void run1(){
HttpServletResponse response = getResponse();
response.setStatus(404);//若不設定狀态碼,由伺服器自動設定。正常預設狀态碼:200
}
建議該方法僅發送4xx和5xx狀态碼
public void run2() throws IOException {
getResponse().sendError(404,"找不到該頁面,<font color='red'>呵呵</font>");
}
1.3:響應頭
/**
* 響應頭
* @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");
}
//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>");
}
位元組流:
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"));
}
小結:
- 何時使用位元組流、何時使用字元流?
文本、代碼輸出展示:字元流
圖檔、聲音等檔案輸出:位元組流(檔案下載下傳)
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方法
要求分别使用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");
}