轉發與重定向區別是什麼
- 在呼叫方法上
轉發
呼叫HttpServletRequest
物件的方法
request.getRequestDispatcher("test.jsp").forward(req, resp);
重定向
呼叫HttpServletResponse
物件的方法
response.sendRedirect("loginsuccess.jsp");
- 在URL顯示上
轉發:URL沒有變化
重定向:URL會發生變化
- 在HTTP請求次數上
轉發:請求1次
重定向:請求2次
- 在行為上
轉發:伺服器行為
重定向:客戶端行為
- 在資料傳遞上
轉發: 直接傳遞請求資料
重定向: 必須通過session/application全域性中間資料快取
JSP/Servlet 注意事項
- JSP/Servlet 初始化時機
JSP
:只有當客戶端第一次請求JSP時,才需要將其轉換、編譯以及例項化Servlet
: 只有當伺服器啟動時(web.xml中配置load-on-startup=1,預設為0)或者第一次請求該servlet時,才會載入和例項化
- Servlet四大物件
ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse
ServletConfig:代表當前Servlet的配置資訊(web.xml)
獲取ServletConfig方法:
ServletConfig sc = this.getServletConfig();
ServletContext:代表當前Application
獲取ServletContext方法:
ServletContext sc = this.getServletContext();
HttpServletRequest:代表請求資訊
HttpServletResponse:代表響應資訊
- ServletContext生命週期與作用
Tomcat 啟動時,
為每個web專案建立對應的ServletContext物件ServletContext物件何時銷燬?
第一種:把web應用移除;第二種:把Tomcat伺服器停止
作用:是管理WEB資源,讀取資原始檔等 (請不要使用java檔案方式去讀取
)
- 獲取RequestDispatcher物件的方法與區別
2種方法:
1、使用ServletRequest物件
request.getRequestDispatcher();
2、使用ServletContext物件
context.getRequestDispatcher();
區別:
ServletContext.getRequestDispatcher(String path)方法的引數必須以斜槓(/)開始,
被解釋為相對於當前上下文根(context root)的路徑。
例如:/myservlet是合法的路徑,而../myservlet是不合法的路徑。
ServletRequest.getRequestDispatcher(String path)方法的引數不但可以使相對於上下文根的路徑,
而且可以是相對於當前Servlet的路徑。如/myservlet和myservlet都是合法的路徑。
如果路徑以斜槓(/)開始,則被解釋為相對於當前上下文根的路徑;
如果沒有以斜槓(/)開始,則被解釋為相對於當前Servlet的路徑。
- JavaWEB四大域
1、context(代表整個應用都可以使用,servletContext)
2、request
3、session
4、page
如何讀取web資原始檔
- Servlet方式
方式1:
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config/db.properties");
Properties props = new Properties();
props.load(in);
方式2:
String path= this.getServletContext().getRealPath("/WEB-INF/config/db.properties");
FileInputStream fis = new FileInputStream(path);
Properties props = new Properties();
props.load(fis);
- 非Servlet方式(類裝載器 只能載入classses目錄下)
方式1(類載入器 載入與讀)
InputStream in = UserServlet.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
props.load(in);
方式2 (類載入器 只載入 用傳統的方式讀)
String path = UserServlet.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream fis = new FileInputStream(path);
Properties props = new Properties();
props.load(fis);
輸出中文亂碼問題(2種方法)
- 方法1:設定響應頭
response.setHeader("Content-Type", "text/html;charset=utf-8");
- 方法2:設定響應體
response.setHeader("Content-Type", "text/html");
String str = "中國";
OutputStream os = response.getOutputStream();
os.write("<meta charset="utf-8" />".getBytes());
os.write(str.getBytes("utf-8"));
- 注意事項
字元流
與位元組流
的區別(位元組流是字元流的基礎)
位元組流應用更廣泛:二進位制資料(視訊、音訊、圖片、文字)
字元流應用更專注:文字(字串)
獲取位元組流:
OutputStream os = response.getOutputStream();
獲取字元流:
PrintWriter pw = response.getWriter();
設定伺服器編碼方式:
位元組: str.getBtyes("UTF-8") //告訴伺服器使用UTF-8編碼字元
字元: response.setCharacterEncoding("utf-8"); //告訴伺服器使用UTF-8編碼字元
設定客戶端編碼方式:
response.setContentType("text/html;charset=utf-8");
下載檔案問題
- 設定HTTP的頭資訊
response.setHeader("content-disposition", "attachment;filename=" + filename);
如果下載的是中文檔案,上面這種寫法會出行亂碼並且下載不了,所以必須使用下面這種:
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));
一、為什麼要用URLEncoder
客戶端在進行網頁請求的時候,網址中可能會包含非ASCII碼形式的內容,比如中文。
而直接把中文放到網址中請求是不允許的,所以需要用URLEncoder編碼地址,
將網址中的非ASCII碼內容轉換成可以傳輸的字元
不會被編碼的內容
1.大寫字母A-Z
2.小寫字母a-z
3.數字 0-9
4.標點符 – _ . ! ~ * ` (和 ,)
-
讀取資原始檔到記憶體
(只能獲取檔案真實路徑)
String filePath = this.getServletContext().getRealPath("/WEB-INF/upload/xxx.jpg");
InputStream is = new FileInputStream(filePath);
- 輸出資原始檔
OutputStream out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len =is.read(buffer) ) > 0){
out.write(buffer, 0 ,len);
}
JSP檔案存放位置問題
如果需要先訪問Servlet再跳轉到Jsp的話,需要把JSP頁面放在WEB-INF中
如果JSP可以直接訪問,那直接放置在WEB-INF目錄外層