關於Servlet以及過濾器Filter要點
Servlet :Java Servlet的簡稱,用Java編寫的服務端程式,具有獨立於平臺和協議的特徵,主要功能在於互動式瀏覽和生成資料,生成動態的web內容。
Servlet為一個介面,直接實現類為 GenericServlet(抽象類) ,Httpservlet繼承此類,一般我們會繼承HttpServlet重寫其doPost()以及doGet()方法,重點關注HttpServlet中的Service()方法。
可通過父類中的getServletContext()方法獲取到ServletContext物件,此物件為web容器中的全域性物件,多個Servlet可共享此物件。因此可以使用setAttribute(p1,p2)進行不同Servlet間的資料傳遞。
要區別“重定向”跟“請求轉發”的區別:
- 重定向是兩次請求,轉發是一次請求,因此轉發的速度會快於重定向。
- 重定向之後位址列的地址會發生改變,變成第二次請求的地址,而轉發地址不會改變,還是第一次請求的地址。
- 轉發是伺服器行為,重定向是客戶端行為。
- 重定向時的網址可以是任何的網址,轉發的網址必須是本站點的網址
請求轉發可通過兩種方式實現:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getRequestDispatcher("xxx路徑").forward(req,resp); }
重定向由Httpservlet物件實現:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("xxxx地址"); }
Servlet還需要配置web.xml。需要配置兩個節點:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>hello</servlet-name> <!-- 需要對映的對應servlet類--> <servlet-class>com.david.Test2</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <!--指定訪問的路徑--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
jsp本質也是一個servlet,只是它會將頁面中的html標籤全部使用out.write("xxx")輸出到頁面上,非html標籤(即Java程式碼)原封不動的儲存,會在tomacat的work目錄下生成一個對應的class類檔案,裡面就是
經過處理後的Java程式碼,本質就是一個servlet。
重點關注jsp中的九大內建物件:
1.HttpServletRequet類的Request物件:代表請求物件,主要用於接受客戶端通過HTTP協議連線傳輸伺服器端的資料。
2.HttpSevletResponse類的Response物件:代表響應物件,主要用於向客戶端傳送資料。
3.JspWriter類的out物件:主要用於向客戶端輸出資料,out的基類是jspWriter
4.HttpSession類的session物件:主要用來分別儲存每個月的資訊與請求關聯的會話;會話狀態的維持是web應用開發者必須面對的問題。
5.ServletContext類的application物件:主要用於儲存使用者資訊,程式碼片段的執行環境;它是一個共享的內建物件,即一個容器中的多個使用者共享一個application,故其儲存的資訊被所有使用者所共享。
6.PageContext類的PageContext物件:管理網頁屬性,為jsp頁面包裝頁面的上下文,管理對屬於jsp的特殊可見部分中已經命名物件的訪問,它的建立和初始化都是由容器來完成的。
7.ServletConfig類的Config物件:程式碼片段配置物件,標識Servlet的配置。
8.Object類的Page物件,處理jsp頁面,是object類的一個例項,指的是jsp實現類的例項
9.Exception物件:處理jsp檔案執行時發生的錯誤和異常,只有在錯誤頁面裡才使用,前提是在頁面指令裡要有isErrorPage=true。
servlet中的過濾器Filter(重點):
實現Filter介面:
public class Test1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } }
重點使用方法為doFilter(),在請求到達指定servlet之前會走此方法,進行一些編碼轉換之類的處理,處理完成之後,一定要使用 filterChain.doFilter(servletRequest,servletResponse)方法將此方法丟到下一個
過濾器,如果不適用此方法,程式會一直停在此處。
過濾器也需要配置,在web.xml中的配置如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>hello</servlet-name> <!-- 需要對映的對應servlet類--> <servlet-class>com.david.Test2</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <!--指定訪問的路徑--> <url-pattern>/hello</url-pattern> </servlet-mapping> <filter> <filter-name>filterTest</filter-name> <filter-class>com.david.Test1</filter-class> </filter> <filter-mapping> <filter-name>filterTest</filter-name> <!-- 表示所有/hello/* 請求都會走這個過濾器--> <url-pattern>/helle/*</url-pattern> </filter-mapping> </web-app>