天天看點

Servlet總結

一、 Web伺服器

1、Tomcat的配置

      1) 配置環境變量

         JAVA_HOME=(JDK路徑)

        CATALINA_HOME=(tomcat 的絕對路徑)

     2) 給 *.sh 檔案加上可執行權限

             chmod u+x *.sh

    3) 啟動 Tomcat

         ①運作bin目錄下startup.sh/startup.bat

         ②catalina.sh run 詳細的控制方式打開

    4) 測試啟動是否成功

    5) 停止tomcat 伺服器

         使用shutdown.sh/shutdown.bat

           附:startup.sh,shutdown.sh,shutdown.bat,startup.bat這些檔案其實是一些腳本檔案用來執行大量的指令,也就是大量java指令。

2、Tomcat伺服器具體介紹

    1) tomcat的預設監聽端口是8080,每當接受到一個連接配接請求,就會為其配置設定一個線程。

    2) Tomcat 的web應用檔案夾放在webapps下。每個 web應用的檔案夾下都要有WEB-INF 檔案夾,

        WEB-INF檔案夾下有classes, 和lib檔案夾, 以及一個web.xml檔案, 類檔案放在classes中,jar檔案可以放在lib 中。

    3) tomcat中配置了 root 預設應用,也就是在不指定的情況下會預設

    4) 通路應用時,在端口号後加上web應用檔案夾的名字

靜态頁面隻能放在 web應用的檔案夾下,不能放在WEB-INF

檔案夾中的資源是受保護的,不能夠通過網絡通路到。

二、 Servlet的配置檔案

web 伺服器接受到使用者發出的請求,會根據使用者通路的路徑,從web.xml 配置檔案中查找

所需要的類,伺服器會從web 應用的WEB-INF檔案夾下的classes 檔案夾中搜尋要加載的class 檔案。

web.xml 檔案的配置,一個 web.xml 中可以配置多個Servlet

<?xml version="1.0" encoding="UTF-8"?>

<welcome-file-list>

      <welcome-file>index.jsp</welcome-file>

     </welcome-file-list>

         <servlet>

                <servlet-name>servlet的名字</servlet-name>

                <servlet-class>servlet類全名</servlet-class>

         </servlet>

                <servlet-name>servlet的名字1</servlet-name>

               <servlet-class>servlet類全名1</servlet-class>

         <servlet-mapping>

               <servlet-name>servlet的名字(要和servlet标簽中的相同)</servlet-name>

               <url-pattern>指定servlet相對于應用目錄的路徑</url-pattern>

         </servlet-mapping>

        <servlet-mapping>

               <servlet-name>servlet的名字1</servlet-name>

              <url-pattern>指定servlet相對于應用目錄的路徑</url-pattern>

</web-app>

三、 Servlet的調用過程

  2,伺服器為使用者定位資源

      (1)靜态資源:/a.html /a/b.html

        這裡的路徑是針對web應用檔案夾目錄,讀檔案并把内容發送到用戶端

      (2)動态資源:解析web.xml定位Servlet類的名字

        裝載類(WEB-INF/classes 或 WEB-INF/lib/*.jar)

    建立該對象的執行個體

          Servlet ser=(Servlet)(Class.forName("servlet類名")).newInstance();

        //自己寫的Servlet一定要實作Servlet接口或者繼承實作了Servlet接口的類、、/

       /ser.service(request,response);

四、 Servlet的接口

   servlet 接口中的方法

   實作Servlet 接口

import java.io.IOException;

import javax.servlet.Servlet;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class TestServlet implements Servlet {

        ServletConfig config;

        public void init(ServletConfig config) throws ServletException {

                this.config = config;

               // 這個ServletConfig對象是由伺服器生成,也就是有系統提供的,通過他可以獲得啟動

資訊。ServletConfig對象和Servlet是一一對應的。

                // 這個方法是在Servlet建立後調用的。如果要是用到ServletConfig對象是一定要為對象指派。

         }

          public ServletConfig getServletConfig() {

                  return this.config;

          }

          public void service(ServletRequest request, ServletResponse response)

                  throws ServletException, IOException {

                // 這個方法是用來處理請求的核心方法

          public String getServletInfo() {

                   return "....";// 這個是用來寫Servlet 資訊的,用來寫作者,以及版本信 息

           }

            public void destroy() {

                  // 這個方法是用來銷毀Servlet 對象的

            }

}

HttpServlet和GenericServlet實作了Servlet接口。

HttpServlet中的service(HttpServletRequest request,HttpServletResponse response)方法是通過

service(ServletRequest request,ServletResponse response)方法的調用來實作對請求的處理。

五、 servlet的生命周期

    1、Servlet 的生命周期分為四個階段

         ⑴建立Servlet 對象,第一次請求到來時才會建立(預設),通過伺服器反射機制建立Servlet對象,

         ⑵調用Servlet 對象的init()方法,初始化Servlet 的資訊,init()方法隻會在建立後立即被調用一次;

         ⑶響應請求,調用service()或者是doGet(),doPost()方法來處理請求,這些方法是運作的在多線程狀态下的。多次通路時的請求内容會清掉每個Servlet 在容器中隻對應一個執行個體。

    ⑷在長時間沒有被調用或者是伺服器關閉時,會調用destroy()方法來銷毀Servlet 對象。

2、可以通過web.xml 檔案可以配置Servlet 對象的建立時間,

         <load-on-startup>數字</load-on-startup>,表示伺服器啟動時建立,并依照數字大小按順

    序建立,小數字優先加載,在<Servlet></Servlet>标簽中使用,隻有重要的Servlet 才會是用這個設定。

3 、通過<init-param> 标簽來配置初始化參數,  

<servlet>

           <init-param>

                        <param-name></param-name>

                          <param-value></param-value>

            </init-param>

</servlet>

       參數将封裝到ServletConfig對象中getInitParameter(String name)方法來得到參當沒有要取的參數時會傳回null。

六、 Get請求和Post請求

  先進Service(),Service決定進get還是post

  Servlet接口的實作類中的service()方法,在繼承HttpServlet類時,如果沒有覆寫父類的service()方那 麼父類的service()方法會根據請求類型不同的會分别調用覆寫的doGet(),doPost()方法;

 如果響應兩種請求的動作相同, 那麼可以直接覆寫service()方法。 如果覆寫了doGet(),doPost()方法  之一,那麼就會隻對一種請求作出響應。在浏覽器的位址欄操作按Enter鍵,或者是熱連接配接,都是get請求,form的method屬性如果不指定,預設為get請求。get請求,會将參數顯示在浏覽器的位址欄上,其顯示格式,在位址之後會以問号開始,以'&'分隔參數。可以通過 HttpServletRequest 對象的 getQueryString()方法來獲得 get 請求的參數值。

七、 ServletRequest

  getInputStream()方法

       可以獲得一個由Socket得來的輸入流,可以使用這個流來實作檔案的上傳。type=”file”。

  getReader()方法

        可以直接擷取 post 請求的參數。

  getParameter(String name)方法,

       讀取請求中傳送的值,可以獲得form表單中指定名字的參數,多參數同名時,隻取一個。

  getParameterNames(),

       取得所有參數的名字,可以獲得一個疊代器Enumeration,通過這個疊代器,來獲得form表單中參數的名字。

   getParameterValues(String name)

       獲得指定的所有同名參數的值。注:不存在時,會傳回null。做項目常用到的:

   getParameter(String name )

   getParameterValues()

  基本掌握了解:

       getQueryString()

       getReader()

       getInputstream()

       getContextPath()方法

       getContextPath()獲得應用的路徑,用動态擷取應用路徑

       getServletPath()獲得Servlet路徑,也就是form中的action,如果使用确切路徑那麼就會是這個

Servlet配置的url-pattern。

     getPathInfo()使用模糊路徑比對時會傳回比對模糊部分。

     注意:

            在form表單的action中,如果使用了擴充名比對,一定要寫明/xxxxx/xxx.xx,不要寫成/xxxx/*.xx

            在form的action中要盡量使用絕對路徑,也就是要用 應用名/xxx.xx或者應用名/xxx。

Servlet的url-pattern

      url-pattern可以使用以下三種方式

           1,确切路徑比對,也就是給出确定的路徑 xxx/xxxx

           2,模糊路徑比對,也就是指給出一部分路徑,xxxx/*,他會比對确定路徑,也就是xxxx/a 或者是 xxxx/b都是可以比對的

           3,擴充名比對,也就是會比對擴充名,隻要是擴充名相同就比對,xxx.xxx *.xx

        擴充名比對和确切路徑比對不能放在一起使用,也就是不能寫成 xxxx/xxxx/xxx.xx,但是可以用*.xxx。

    setAttribute(String name,Object o)方法

          可以使用HttpServletRequest對象來攜帶資訊。

          通過getAttribute(String name)方法來獲得攜帶的資訊。

  這兩個方法類似于map 中的存取方法,setAttribute 方法給資料加上辨別,getAttribute方法則是通過這個辨別來擷取資料,可以使用這一對方法的前提就是要保證是同一個請求對象(HttpServletRequest)

八、 ServletContext

     ServletContext對象是Servlet的上下文對象,這個對象是在伺服器啟動時建立的,他可以看作是一個應用的對象,他可以看作是包含Servlet,管理Servlet的對象。在每個Servlet中都會有一個ServletContext的引用,這個ServletContext是一個全局的對象,每個應用中隻有一個ServletContext對象。HttpServlet中的getServletContext()方法,獲得ServletContext對象。ServletContext 相當于JSP中的 Application。

九、 ServletConfig

     這個ServletConfig對象是由伺服器生成,也就是有系統提供的,通過他可以獲得啟動資訊。

ServletConfig對象和Servlet是一一對應的。這個方法是在Servlet建立後調用的。如果要是用ServletConfig對象是一定要為對象指派。參數将封裝到ServletConfig對象中。用getInitParameter(String name)方法來得到參數,當沒有要取的參數時,會傳回null。

         init( ServletConfig config ){

                 super.init(config); //必須将ServletConfig傳遞給父類,防止丢失

沒有必要在init方法中去調用super.init(config),可以直接覆寫 HttpServlet中init()方法。init()這個方法它将會被 GenericServlet.init(ServletConfig config)調用,預設的系統會将ServletConfig 儲存起來,此時可以通過 getServletConfig()得到ServletConfig對象。

十、 Servlet的資源通路

     Servlet的資源通路

       在Servlet中可以通路,JDBC,RMI(遠端方法調用),以及跨語言平台的元件等資源。在Servlet中是用JDBC很容易,也就是在Servlet中調用JDBC中的方法,就可以實作對資料庫的通路。如果在Servlet中要使用到其他的資源,例如連接配接資料庫的驅動,可以放在tomcat伺服器的檔案夾下的common/lib下,這個目錄中存放的是一些在伺服器啟動時就會加載的公共資源,一般在需要在應用中是用特定的資源,也就是jar檔案,那麼不要放在common/lib下,如果common/lib下的jar檔案過多會導緻伺服器啟動緩慢,應用中使用到的jar檔案要放在WEB-INF/lib下,就可以被伺服器找到了。如果要在 Servlet中是用 Hibernate的通路資料庫的方法,那麼就需要把 hibernate 需要的 jar檔案,放到 WEB-INF/lib 下就可以了,Xxxxxx.hbm.xml 還是和實體類放在一起。hibernate.cgf.xml檔案,要放在 WEB-INF/classes 下就可以了。

十一、 Servlet 過濾器(Filter)

    應用:Sessioin logging encoding

    過濾器是用于過濾Servlet 的請求和響應,過濾器是存在于請求和被請求資源之間的。過濾器就像當于一個中間件,請求要經過過濾器,然後過濾器才去掉用Servlet,Servlet 的響應也會被過濾器截獲并作相應的處理。

     Filter 是一個接口,要寫一個自己的Filter 就隻能實作Filter 接口。

     Filter 也有自己的生命周期,他的生命周期和Servlet 比較相似,也是會先調用init()方法,然後再調用核心的處理

     過濾的方法doFilter(),這個方法中可定義了過濾規則,然後是destory()方法銷毀Filter 對象。

      dofilter(ServletRequest request,ServletResponse response,FilterChain chain)這個是過濾的核心方法,FilterChain 的方法doFilter(ServletRequest request, ServletResponseresponse)也就是用過濾後的請求調用資源的方法,如果不寫這個方法,也就算不會去調用相應的資源。

Filter 的配置

Filter 的配置和Servlet 相似。

<filter>

<filter-name>SessionFilter</filter-name>

<filter-class>alan.filter.SessionFilter</filter-class>

</filter>

<filter-mapping>

<url-pattern>/protected/*</url-pattern>

<!--這裡的url-pattern 就是要過濾的Servlet 的url-pattern-->

<dispatcher>request</dispatcher>

<dispatcher>forward</dispatcher>

<dispatcher>include</dispatcher>

<!--上面的三個是過濾的範圍-->

</filter-mapping>

十二、 會話

會話是可以儲存狀态的

Session(會話)和Cookie (會話跟蹤機制)

Session 對象用來解決用戶端發送多個請求時來使用者請求資訊的存儲問題,但是他和

ServletRequest 對象是不同的, 他會在有需要時建立, 但是他的生命周期會比請求對象要長。

Session 對象的生命周期也是有限制的, 如果長時間的沒有通路,就會銷毀掉Session 對象,

可以通過Session 對象的setAttribute(String name, Object o) 和getAttribute(String name)來存

取資料資訊。Session 是使用者級的對象。

     public void service(ServletRequest request,ServletResponse response){

             String user = request.getParameter("user");

             String pass = request.getParameter("pass");

             HttpSession session = request.getSession(true);//使用請求對象來建立Session

             session.setAttribute("username", user);

             session.setAttribute("passwd", pass);

    }

getSession(true)就表示如果Session 不存在就建立一個新的Session,并把Session 的辨別

SessionID 寫到Cookie 中,如果存在就是用這個Session。 getSession(false)就是在Session 不存在時不會建立新Session 而是傳回null。如果使用getSession()方法,就等同于getSession(true)。

注意:ServletRequest 對象适用于傳輸大量的資料,因為其生命周期比較短可以有效的節省記憶體資源。

大資料量的傳輸或儲存不适合使用Session 空間。

Cookie,是記錄使用者的Session 資訊,也可以記錄使用者的請求資訊,也就是SessionID,來分辨哪一個使用者是否登陸過。在每次登陸時,還會将Cookie 發送回伺服器端,Cookie 是用來跟蹤Session 的。

       public void service(ServletRequest request,ServletResponse response){

               String user = request.getParameter("user");

               String pass = request.getParameter("pass");

               Cookie userCookie = new Cookie("user", user);

               userCookie.setMaxAge(60 * 60 * 24 * 365);//設定Cookie 的最大有效期,秒為機關

              Cookie passCookie = new Cookie("pass", pass);

               passCookie.setMaxAge(60 * 60 * 24 * 365);

               response.addCookie(userCookie);

              response.addCookie(passCookie);

Session 是基于Cookie 來跟蹤的,即:沒有Cookies 的支援,Session 是不能運作起來的。

Session 對象的生命周期也是有限制的, 如果長時間的沒有通路,就會銷毀掉Session 對象,可以通過Session 對象的setAttribute(String name, Object o) 和getAttribute(String name)來存取資料資訊。Session 是使用者級的對象。

Session 是存在于伺服器記憶體中的,用于存使用者多個請求的資訊的;同時也要求用戶端發送

個Session 的标志:SessionID (位址欄或封裝在請求的Heade r 中)。

SessionID 寫到Cookie 中,如果存在就是用這個Session。getSession(false)就是在Session 不

存在時不會建立新Session 而是傳回null。如果使用getSession()方法,就等同于getSession(true)。

注意:ServletRequest 對象适用于傳輸大量的資料,因為其生命周期比較短,可以有效的節省記憶體資源。

使用者身份認證登入時,建立session

通路資源頁面時,先判斷session 是否存在

退出時清除session:session. invalidate(),接着可以将使用者引導到登入頁面

IE 中一個視窗代表一個會話,Mozilla firefox 不一樣

多個視窗可通過Cookies 來識别Seesion。

Sssion 第二種跟蹤機制:URLRewriting

Response.sendRediret(Response.encodeRedirectURL(/serv-app/student/ctrl“))

把在位址欄後加上SessionID 位址位址參數

out.println(”<a href=”+response.encodeURL(url)”

<form actioin=”response.encodeURL(url)”>

Forward 也是encodeURL

特殊一個:Response.sendRedirect(response.encodeRedirectURL(url));

每一個URL 都要加上sessionID,但它不能跨越靜态頁面。

是以一般預設針對Cookies 可用編寫程式。

    1、session.invalidate() --- session 被立即銷毀

session.setMaxInactiveInterval(int interval) --- 設定最大的逾時時間,以秒為機關

    2、會話的空間不是系統自動建立的,是程式建立的

request.getSession(false); 判斷請求中是否存在session,以確定服務中資源的保護

Session 跟蹤機制

    1、cookie 機制

    2、URL 回寫機制:把sessionid 綁定在位址欄中

             response.sendRedirect(response.encodeRedirectURL(url));

本文轉自 646676684 51CTO部落格,原文連結:http://blog.51cto.com/2402766/514497,如需轉載請自行聯系原作者