Javaweb Q&A

104828720發表於2019-01-19

轉發與重定向區別是什麼

  • 在呼叫方法上

轉發 呼叫 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四大物件

ServletConfigServletContextHttpServletRequestHttpServletResponse


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);

javaweb讀取配置檔案的4種方法

輸出中文亂碼問題(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目錄外層