Servlet詳解

1、Servlet是運行於支援Java的應用伺服器中,用於互動式的瀏覽和修改資料,生成動態Web內容。

我們要自定義一個Servlet廣義上必須實現Servlet介面

Servlet介面有兩個實現類,而HttpServlet又繼承GenericServlet類,這兩個類都是抽象類

GenericServlet

HttpServlet

我們一般建立JavaWeb專案都是基於Http協議,所以建立Servlet都是繼承HttpServlet

2、Servlet工作模式

客戶端傳送請求至伺服器

伺服器啟動並接受客戶端傳送的請求,呼叫對應的Servlet處理請求,並生成響應內容將其傳給伺服器

伺服器將響應內容返回給客戶端

3、Servlet的生命週期

public interface Servlet { void init(ServletConfig var1) throws ServletException; void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; void destroy();

當Servlet第一次被請求時,伺服器就會呼叫init()方法初始化一個Servlet物件,但是這個方法在後續的請求中不會再次被呼叫,

僅僅只會呼叫一次

。在呼叫這個方法時,Servlet容器會傳入一個ServletConfig物件來對Servlet物件進行初始化。

每次客戶端請求這個Servlet時,Servlet容器就會呼叫service()方法處理請求;在後續的請求中,Servlet容器就只會呼叫這個方法了。

當伺服器關閉或者停止時,Servlet容器就會呼叫destroy()銷燬這個Servlet。

每一個Servlet在容器中只會存在一個Servlet物件,是單例的

4、ServletContext物件

web容器在啟動的時候,會為每一個web應用建立一個唯一的ServletContext物件,它代表了當前的web應用

共享資料

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 使用ServletContext共享資料 ServletContext servletContext = this。getServletContext(); servletContext。setAttribute(“username”,“Vecal”); }

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取共享資料 ServletContext context = this。getServletContext(); String username = (String) context。getAttribute(“username”); resp。setContentType(“text/html;charset=utf-8”); resp。setCharacterEncoding(“utf-8”); resp。getWriter()。print(“姓名 :” + username); }

<!—— 配置Servlet對映 ——> hello com。vecal。servlet。HelloServlet hello /hello get com。vecal。servlet。GetServlet get /get

獲取初始化引數

<!—— 自定義初始化引數 ——> url jdbc:mysql://localhost:3306/mybatis

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this。getServletContext(); String url = context。getInitParameter(“url”); resp。getWriter()。print(url); }

請求轉發

// 請求轉發ServletContext context = this。getServletContext();context。getRequestDispatcher(“/initParam”)。forward(req,resp);

讀取資原始檔

在java目錄下新建資原始檔

在resources目錄下新建資原始檔

都會被打包放到了同一目錄下:classes,這個路徑統稱為 classpath: 路徑

如果發現在java目錄中的資原始檔沒有被打包放在classes目錄下,需要在pom。xml中進行以下配置

src/main/resources **/*。properties **/*。xml false src/main/java **/*。properties **/*。xml false

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 讀取配置檔案 ServletContext context = this。getServletContext(); InputStream in = context。getResourceAsStream(“/WEB-INF/classes/db。properties”); Properties prop = new Properties(); prop。load(in); String username = prop。getProperty(“username”); String password = prop。getProperty(“password”); resp。getWriter()。print(username + “:” + password); }

5、HttpServletResponse

web伺服器在接收到客戶端的http請求,針對這個請求,分別建立了一個代表請求的HttpServletRequest物件,一個代表響應的HttpServletResponse物件

如果要獲取客戶端請求的一些資料引數,使用HttpServletRequest

如果要響應一些資料給客戶端,使用HttpServletResponse

1。 向瀏覽器傳送資料

ServletOutputStream getOutputStream() throws IOException;PrintWriter getWriter() throws IOException;

2。 設定響應頭

void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);

3。 響應狀態碼

int SC_OK = 200;int SC_FOUND = 302;int SC_BAD_REQUEST = 400;int SC_INTERNAL_SERVER_ERROR = 500;

4。 下載檔案

@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1。獲取圖片路徑 String realPath = “D:\\How2JTest\\project\\javaweb-02-servlet\\response\\target\\response\\WEB-INF\\classes\\黃瀨涼太。jpg”; // 2。獲取檔名 String fileName = realPath。substring(realPath。lastIndexOf(“/”) + 1); System。out。println(“檔案下載的路徑: ” + realPath); // 3。設定響應頭,URLEncoder。encode()處理檔名中文亂碼問題 response。setHeader(“Content-Disposition”,“attachment;filename=” + URLEncoder。encode(fileName,“UTF-8”)); // 4。獲取檔案流 FileInputStream in = new FileInputStream(realPath); // 5。設定緩衝區 int len = 0; byte[] buffer = new byte[1024]; // 6。寫出檔案 ServletOutputStream os = response。getOutputStream(); while ((len = in。read(buffer)) != -1){ os。write(buffer, 0, len); } os。close(); in。close(); }

5。 實現重定向

URL位址列會發生改變

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { // 請求重定向,url位址列會發生改變 response。sendRedirect(“/r/down”);}

6、HttpServletRequest

HttpServletRequest代表客戶端的請求,使用者透過http協議訪問伺服器,HTTP伺服器會將所有的請求資訊封裝到這個物件中。

1。獲取前端傳遞的引數

// 獲取指定名稱的一個引數String getParameter(String var1);// 獲取指定名稱的多個引數String[] getParameterValues(String var1);

7、請求和轉發的區別

面試題:請你聊一聊轉發和重定向的區別?

相同點:

頁面都會實現跳轉

不同點:

請求轉發時,URL位址列不會發生改變

請求重定向時,URL位址列會發生改變