JavaWeb(一)-Servlet
一、涉及的包
Servlet API涉及4個java包 :
javax.servlet Servlet容器
javax.servlet.http Servlet容器和http協議的關係
javax.servlet.annotation Servlet,filter,Listener 進行標註的註解
javax.servlet.descriptor 包含為web應用程式的配置資訊提供程式設計式訪問的型別。
二、Servlet的生命週期
2-0:HttpServlet和Servlet
HTTPServlet是關於於Http協議的;而Servlet是與具體的協議無關。
2-1:Servlet的建立
在一個應用中,每一個Servlet型別只能有一個例項,因此不要在Servlet的實現類中定義成員變數,類變數
Servlet建立有兩種情況:
1. 在Servlet第一次接受請求的時候建立。(預設)
2.在伺服器開啟的時候建立。
在web.xml檔案的<servlet>標籤下加一個<load-on-startup>正數序號</load-on-startup>;伺服器會根據序號決定建立順序。
2-2:Servlet處理請求
當客戶端傳送請求到伺服器。Tomcat會根據Servlet的URL,接入對應的Servlet物件的service()方法;
(在HttpServlet中,service會根據請求的型別,決定呼叫doGet()或者......)
2-3:Servlet銷燬
當伺服器關閉的前夕,會對Servlet進行銷燬;Servlet銷燬前,會呼叫destory()方法
2-4:Servlet其他方法
getServletInfo 返回Servlet的描述
getServletConfig 返回init()傳入的ServletConfig
三、關於JAVA WEB的檔案結構
- 專案根目錄下放置的資源可以被URL直接訪問。
- WEB-INF下的classes存放著java類編譯的位元組碼檔案
- WEB-INF下的lib下存放著WEB應用程式所要的jar包
- 注意:若要資源不直接被URL訪問到,將資源放在WEB-INF即可。
- web.xml是java WEB的描述檔案。
四、關於ServletRequest和ServletResponse
此處討論HTTPServletRequest和HttpServletResponse。
4-1:HttpServletRequest
request是應用於封裝客戶端的所有請求資料
獲取常用資訊:
- 獲取客戶端IP:request.getRemotoAddr()
- 請求方式 request.getMethod()
- 獲取請求頭 String getHeader(String name);int getIntHeader(String name);long getDateHeader(String Date);..............
- 獲取URL資訊
獲取請求引數
- String getParameter(String name) 指定引數名,獲取單值引數值
- String[] getParametervalues(String name) 指定引數名,獲取多值引數值
- Map<String,String[]> getParameterMap() 獲取所有請求引數;返回鍵值對(key引數名,value 引數值)
- Enumeration<String> getParameterNames();獲取所有請求引數名
關於請求轉發和請求包含,請求重定向
- 請求轉發:由下一個Servlet完成響應頭,當前Servlet只可設定響應頭。(留頭不留體)
- 請求包含:由兩個及以上的Servlet共同完成響應頭(都有)
- 實現程式碼
//在
RequestDispatcher d=request.getRequestDispatcher("/BServlet");
//轉發:
d.forward(request, response);
//包含
d.include(request, response);
重定向和轉發的區別
轉發是一個請求。重定向是兩個請求。
轉發:是伺服器跳轉,瀏覽器的位址列不發生改變;request域不會被保留。
重定向:是客戶端跳轉;request域不會被保留。
關於防盜鏈
通過Referer響應頭判斷該url的跳轉來源。
4-2HttpServletResponse
關於重定向實現
//方法1:設定響應碼302,設定location響應頭
response.setStatus(302);
response.setHeader("location", "....");
//方法2直接呼叫 sendRedirect
response.sendRedirect(".......");
//重定向填寫url需要寫/的。(http://localhost:8080/)
設定狀態碼
- sendError(int sc) 傳送錯誤狀態碼
- sendError(int sc,String mgs) 傳送錯誤狀態碼,還帶一個錯誤資訊
- sendStatus(int sc) 傳送一個成功的狀態碼。可用於302
設定響應頭
- response.setHeader(String name, String value); 適合單值的響應頭
- response.addHeader(String name, String value);適合多值的響應頭
- response.setIntHeader(String name, int value);適合單值的int響應頭
- response.addIntHeader(String name, int value);適合多值的int響應頭
- response.setDateHeader(String name, long value);適合單值的毫秒型別的響應頭
- response.addDateHeader(String name, long value);適合多值的毫秒型別的響應頭。
設定響應體
通常是html和圖片
response有兩個流:ServletOutputStream和printWriter
ServletOutputStream: 用於向客戶端傳送位元組資料
printWriter:用於向客戶端傳送字元資料。
注意:兩個流是不能同時使用的。(若同時用會丟擲異常)
4-3:編碼問題
注意:伺服器和客戶端使用的編碼必須一致
編碼問題分為 請求編碼,響應編碼
請求編碼
Tomcat預設使用ISO-8859-1來處理請求引數。
- 關於POST請求
- 在獲取引數之前,呼叫request.setCharacterEncoding("UTF-8");然後再獲取引數。
- 關於GET請求
- 方法1: 設定伺服器處理請求引數的預設編碼。
- 例如Tomcat。在/conf/server.xml中配置 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 方法2:如下操作
-
String name =request.getParemeter("name"); byte[] b=name.getBytes("ISO-8859-1"); name=new String(b,"UTF-8")
-
- 方法1: 設定伺服器處理請求引數的預設編碼。
響應編碼
若不設定,預設是ISO-8859-1
在使用響應流前使用如下操作
//設定字元流的編碼
response.setCharacterEncoding("UTF-8");
//通知瀏覽器以UTF-8的形式解析 等價於 response.setHeader("content-Type", "text/html;chatset=utf-8");
response.setContentType("text/html;chatset=utf-8");
五、本章例子
例子: 包括 編碼,重定向,轉發,包含
六、注意
6-1:request中引數和屬性的區別
- 引數是由客戶端到伺服器
- 屬性是伺服器到伺服器的域