JAVADREAM

          hackiller
          數(shù)據(jù)加載中……
          J2EE復(fù)習(xí)(四)servlet

          一、什么是Servlet?
          Servlet 是在服務(wù)器上運(yùn)行來響應(yīng)客戶端請(qǐng)求的一種java組件。Servlet與具體的客戶服務(wù)端協(xié)議無關(guān),但Servlet常用于HTTP協(xié)議,所以,“Servle”t常被用于“HTTP Servlet”的意思。
          Servlet使用的java軟件包:javax.servlet(基本Servlet框架)和javax,servlet.http(HTTP Servlet)
          HTTP Servlets典型應(yīng)用包括:
          1.通過提交HTML表單操作存儲(chǔ)數(shù)據(jù)。
          2.提供動(dòng)態(tài)內(nèi)容,如將從數(shù)據(jù)庫中查詢到的結(jié)果返回給客戶端
          3.管理無狀態(tài)的HTTP上的有狀態(tài)的信息,如一個(gè)為多個(gè)同時(shí)存在的客戶管理購物車并映射每一個(gè)請(qǐng)求到正確的客戶的在線購物系統(tǒng)

          二、Servlets 和 CGI(Commone Gateway Interface)
          最早用來產(chǎn)生動(dòng)態(tài)網(wǎng)頁服務(wù)的方法便是CGI,CGI是一種與語言無關(guān)的接口,此種接口允許服務(wù)器啟動(dòng)通過環(huán)境變化來獲取與此次請(qǐng)求有關(guān)信息的外部程序。每一個(gè)請(qǐng)求都通過CGI程序或者CGI腳本由單獨(dú)的線程響應(yīng)。
          Servlets相比CGI的幾個(gè)優(yōu)勢(shì):
          1.Servlet中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的Java線程處理,不用為每一個(gè)請(qǐng)求啟動(dòng)新的系統(tǒng)線程。
          2.一個(gè)Servlet在請(qǐng)求期間會(huì)駐留在內(nèi)存中。
          3.響應(yīng)所有并發(fā)的請(qǐng)求只需要唯一一個(gè)實(shí)例,節(jié)省了內(nèi)存并可以使Servlet管理持久數(shù)據(jù)顯得更快捷。
          三、Servlet 生命周期
          Servlet 的生命周期就是指創(chuàng)建 Servlet 實(shí)例之后其存在的時(shí)間以及何時(shí)消失
          生命周期的 3個(gè)方法為:init()、service()、destroy()
          1.裝載servlet類以及其他可能使用到的類
          2.調(diào)用init(ServletConfig config)方法加載配置信息,初始化servlet
          3.調(diào)用service(doGet/doPost)方法處理業(yè)務(wù)邏輯,service方法在初始化前不會(huì)被調(diào)用
          4.調(diào)用destroy方法銷毀不再使用的servlet
          四、Servlet的部署
          1.用myeclipse建立好web工程,寫好HelloClientServlet.java類

           1import java.io.*;
           2import javax.servlet.*;
           3import javax.servlet.http.*;
           4
           5public class HelloClientServlet extends HttpServlet
           6{
           7  //doGet() 方法處理客戶端作出的 GET 請(qǐng)求。
           8  public void doGet(HttpServletRequest req,
           9                       HttpServletResponse res)
          10            throws ServletException, IOException
          11  {
          12    res.setContentType("text/html");
          13    PrintWriter out = res.getWriter();
          14    out.println("<HTML><HEAD><TITLE>Hello Client!</TITLE>"+
          15  "</HEAD><BODY>Hello Client!</BODY></HTML>");
          16    out.close();
          17  }

          18
          19  //doPost() 方法處理客戶端作出的 POST 請(qǐng)求。
          20  public void doPost(HttpServletRequest req,
          21                       HttpServletResponse res)
          22            throws ServletException, IOException
          23  {
          24    doGet(req,res);
          25  }
           
          26}

          2.web.xml文件中配置Servlet

           1<!-- 第一個(gè)servlet程序配置 -->
           2<servlet>
           3<servlet-name>firstServlet</servlet-name>
           4<servlet-class>HelloClientServlet的包路徑</servlet-class>
           5</servlet>
           6<!-- 第一個(gè)servlet程序映射 -->
           7<servlet-mapping>
           8<servlet-name>firstServlet</servlet-name><!-- 必須與配置中的servlet-name相同 -->
           9<url-pattern>/first.do</url-pattern>
          10</servlet-mapping>

          3.發(fā)布到本機(jī)web服務(wù)器(使用Tomcat5.5)中,通過http://localhost:服務(wù)器端口號(hào)/工程名/first.do啟動(dòng)servlet。
          五、javax.servlet 包的接口介紹
          ServletConfig
          用來封裝web.xml中對(duì)當(dāng)前Servlet的配置信息
          getInitParameter()---可以獲取初始化參數(shù)
          ServletContext
          代表當(dāng)前Servlet運(yùn)行的上下文環(huán)境,Web容器會(huì)為每一個(gè)Web工程創(chuàng)建一個(gè)對(duì)應(yīng)ServletContext對(duì)象
          setAttribute()
          getAttribute()
          removeAttribute()
          ServletRequest
          為Servlet所發(fā)送的請(qǐng)求,用ServletRequest封裝
          setAttribute()
          getAttribute()
          removeAttribute()
          getParameter()
          常用子接口HttpServletRequest
          ServletResponse
          Servlet對(duì)客戶段所做的響應(yīng),用ServletResponse描述
          getWriter():獲取PrintWriter輸出流給客戶發(fā)送的響應(yīng)內(nèi)容
          setContentType:設(shè)置響應(yīng)內(nèi)容的響應(yīng)類型和字符集信息
          sendRedirect:設(shè)置重新請(qǐng)求路徑
          子接口HttpServletResponse
          六、過濾器(Filter)
          1.Servlet 過濾器是小型的 Web 組件,它們攔截請(qǐng)求和響應(yīng),以便查看、提取或以某種方式操作正在客戶機(jī)和服務(wù)器之間交換的數(shù)據(jù)。
          2.生命周期
          初始化----當(dāng)容器第一次加載該過濾器時(shí), init() 方法將被調(diào)用。
          過濾----doFilter() 方法被容器調(diào)用,同時(shí)傳入分別指向這個(gè)請(qǐng)求/響應(yīng)鏈中的ServletRequest 、 ServletResponse 和 FilterChain 對(duì)象的引用
          銷毀----容器緊跟在垃圾收集之前調(diào)用 destroy() 方法
          3.編寫字符編碼過濾器
          (1)實(shí)現(xiàn)Filter接口中的三個(gè)方法:
          init() ----這個(gè)方法在容器實(shí)例化過濾器時(shí)被調(diào)用
          doFilter() ----與 servlet 擁有一個(gè) service() 方法(這個(gè)方法又調(diào)用 doPost() 或者 doGet() )來處理請(qǐng)求一樣,過濾器擁有單個(gè)用于處理請(qǐng)求和響應(yīng)的方法―― doFilter()。
          destroy() ---這個(gè)方法執(zhí)行任何清理操作,這些操作可能需要在自動(dòng)垃圾收集之前進(jìn)行

           1import java.io.IOException;
           2
           3import javax.servlet.Filter;
           4import javax.servlet.FilterChain;
           5import javax.servlet.FilterConfig;
           6import javax.servlet.ServletException;
           7import javax.servlet.ServletRequest;
           8import javax.servlet.ServletResponse;
           9
          10public class CharacterEncodingFilter implements Filter
          11{
          12
          13  private String encode;
          14
          15  public void destroy()
          16  {
          17    this.encode = null;
          18  }

          19
          20  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          21      throws IOException, ServletException
          22  {
          23    if(encode!=null)
          24    {
          25      request.setCharacterEncoding(encode);
          26      response.setCharacterEncoding(encode);
          27    }

          28    // 將資源鏈到下一Filter, 如果這是最后一個(gè)Filter, 則將資源鏈到目的位置.
          29    chain.doFilter(request, response);
          30  }

          31
          32  public void init(FilterConfig config) throws ServletException
          33  {
          34    encode = config.getInitParameter("encode");
          35    System.out.println("CharacterEncodingencode="+encode);
          36  }

          37
          38}

          (2)web.xml文件中配置字符編碼過濾器

           1<!-- 字符編碼過濾器配置 -->
           2<filter>
           3<filter-name>encodeFilter</filter-name>
           4<filter-class>CharacterEncodingFilter全路徑</filter-class>
           5<init-param>
           6<param-name>encode</param-name>
           7<param-value>utf-8</param-value>
           8</init-param>
           9</filter>
          10<!-- 字符編碼過濾器映射,/*過濾所有請(qǐng)求 -->
          11<filter-mapping>
          12<filter-name>encodeFilter</filter-name>
          13<url-pattern>/*</url-pattern>
          14</filter-mapping>

          七、監(jiān)聽器(ServletContextListener)
          1.ServletContext相關(guān)監(jiān)聽接口
          (1)javax.servlet.ServletContextListener:監(jiān)聽WEB應(yīng)用,當(dāng)應(yīng)用開始的時(shí)候它會(huì)調(diào)用contextInitialized()方法,當(dāng)應(yīng)用關(guān)閉的時(shí)候,它同樣會(huì)調(diào)用contextDestroyed()方法
          (2)javax.servlet.ServletContextAttributeListener:用于監(jiān)聽WEB應(yīng)用屬性改變的事件,包括:增加屬性、刪除屬性、修改屬性
          2.HttpSession相關(guān)監(jiān)聽接口
          (1)javax.servlet.http.HttpSessionListener:監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個(gè)Session時(shí),激發(fā)session Created(HttpSessionEvent se)方法;當(dāng)銷毀一個(gè)Session時(shí),激發(fā)sessionDestroyed (HttpSessionEvent se)方法。
          (2)avax.servlet.http.HttpSessionBindingListener:
          注意:HttpSessionBindingListener接口是唯一不需要再web.xml中設(shè)定的Listener
          當(dāng)我們的類實(shí)現(xiàn)了HttpSessionBindingListener接口后,只要對(duì)象加入Session范圍(即調(diào)用HttpSession對(duì)象的setAttribute方法的時(shí)候)或從Session范圍中移出(即調(diào)用HttpSession對(duì)象的removeAttribute方法的時(shí)候或Session Time out的時(shí)候)時(shí),容器分別會(huì)自動(dòng)調(diào)用下列兩個(gè)方法:
          void valueBound(HttpSessionBindingEvent event)
          void valueUnbound(HttpSessionBindingEvent event)
          (3)avax.servlet.http.HttpSessionAttributeListener:監(jiān)聽HttpSession中的屬性的操作。
          當(dāng)在Session增加一個(gè)屬性時(shí),激發(fā)attributeAdded(HttpSessionBindingEvent se) 方法;當(dāng)在Session刪除一個(gè)屬性時(shí),激發(fā)attributeRemoved(HttpSessionBindingEvent se)方法;當(dāng)在Session屬性被重新設(shè)置時(shí),激發(fā)attributeReplaced(HttpSessionBindingEvent se) 方法。
          3.寫一個(gè)統(tǒng)計(jì)在線用戶的例子
          (1)建立CunterListstener.java類

           1import javax.servlet.http.HttpSessionEvent;
           2import javax.servlet.http.HttpSessionListener;
           3
           4public class CunterListstener implements HttpSessionListener
           5{
           6  public static int count;
           7  
           8  public void sessionCreated(HttpSessionEvent arg0)
           9  {
          10    count++;
          11  }

          12
          13  public void sessionDestroyed(HttpSessionEvent arg0)
          14  {
          15    if(count>0) count--;
          16  }

          17}

          (2)建立index.jsp,查看在線人數(shù)

           1<%@ page language="java"  pageEncoding="UTF-8"%>
           2<html>
           3  <head>
           4    <title>站點(diǎn)計(jì)數(shù)監(jiān)聽器</title>
           5  </head>
           6  
           7  <body>
           8    <h1>站點(diǎn)計(jì)數(shù)監(jiān)聽器</h1>
           9    <hr>
          10    當(dāng)前在線人數(shù):<%=CunterListener.count%>
          11  </body>
          12</html>

          3.在web.xml文件中配置監(jiān)聽器

          1<!-- 配置監(jiān)聽器 -->
          2<listener>
          3 <listener-class>CunterListstener全路徑</listener-class>
          4</listener>

          4.發(fā)布工程到Tomcat上,進(jìn)入index.jsp網(wǎng)頁 ,看到網(wǎng)頁內(nèi)容:  當(dāng)前在線人數(shù):1。代表的是只有自己在線。
          九、Cookie
          Cookie 用于存儲(chǔ) Web 服務(wù)器發(fā)送給客戶端的信息。服務(wù)器通過設(shè)置響應(yīng)標(biāo)題中的 Set-Cookie 方法來發(fā)送 cookie。

          javax.servlet.http.Cookie類方法:
          getComment/setComment 獲取/設(shè)置Cookie的注釋。
          getDomain/setDomain   獲取/設(shè)置Cookie適用的域。
          getMaxAge/setMaxAge   獲取/設(shè)置Cookie過期之前的時(shí)間,以秒計(jì)。
          getName/setName       獲取/設(shè)置Cookie的名字。
          getPath/setPath       獲取/設(shè)置Cookie適用的路徑。
          getSecure/setSecure   獲取/設(shè)置一個(gè)boolean值,表示是否Cookie只能通過加密的連接(即SSL)發(fā)送。
          getValue/setValue     獲取/設(shè)置Cookie的值。
          getPath()返回的如果不指定路徑,Cookie將返回給當(dāng)前頁面所在目錄及其子目錄下的所有頁面。這里的方法可以用來設(shè)定一些更一般的條件。例如,someCookie.setPath("/"),此時(shí)服務(wù)器上的所有頁面都可以接收到該Cookie。
          如果不設(shè)置Cookie的過期時(shí)間,則Cookie只在當(dāng)前會(huì)話內(nèi)有效,即在用戶關(guān)閉瀏覽器之前有效,而且這些Cookie不會(huì)保存到磁盤上。

          通過HttpServletResponse的addCookie方法加入。

          1Cookie userCookie = new Cookie("userName""hackiller");
          2response.addCookie(userCookie);

          由于HttpServletRequest的getCookies方法返回的是一個(gè)Cookie對(duì)象的數(shù)組,因此通常要用循環(huán)來訪問這個(gè)數(shù)組查找特定名字,然后用getValue檢查它的值。

           1//獲取指定名字的Cookie值
           2public static String getCookieValue(Cookie[] cookies,String cookieName,String defaultValue) 
           3{
           4    for(int i=0; i<cookies.length; i++
           5    {
           6      Cookie cookie = cookies[i];
           7      if (cookieName.equals(cookie.getName())) return(cookie.getValue());
           8     }

           9     return(defaultValue);
          10}

          自動(dòng)保存的Cookie,Cookie能夠在瀏覽器退出的時(shí)候自動(dòng)保存下來

           1import javax.servlet.http.Cookie;
           2
           3public class MyCookie extends Cookie
           4{
           5  public static final int COOKIE_MAX_AGE = 60*60*24*7;//一周
           6  public MyCookie(String cookieName, String cookieValue)
           7  {
           8    super(cookieName, cookieValue);
           9    //設(shè)置Cookie的過期時(shí)間為一周
          10    setMaxAge(COOKIE_MAX_AGE);
          11  }

          12}

          十、Servlet 通信方法
          (1)Servlet 使用 RequestDispatcher 接口的 forward() 和include() 方法訪問網(wǎng)絡(luò)資源
          將請(qǐng)求從一個(gè) Servlet 轉(zhuǎn)送到同一個(gè)服務(wù)器上的另一個(gè) Servlet

          public void forward (ServletRequest req, ServletResponse res);

          在一個(gè) Servlet 中包含另一個(gè) Servlet  的內(nèi)容

          public void include (ServletRequest req, ServletResponse res);

          使用javax.servlet.http.HttpServlet.getServletContext()方法創(chuàng)建RequestDispatcher對(duì)象,用于訪問另一個(gè) Servlet 的內(nèi)容

          RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("/usersServlet2");

          (2)Servlet 上下文
          將所有 Servlet 所共有的屬性和資源存儲(chǔ)于 ServletContext 接口對(duì)象。處理上下文屬性的方法為:

          public Object getAttribute(String name);

          返回 Servlet 容器屬性名稱。如果該名稱沒有屬性則返回 null

          public void setAttribute(String name, Object object);

          將對(duì)象綁定到 Servlet 上下文中給定的屬性名稱

          public void removeAttribute(String name);

          刪除給定名稱的屬性

          posted on 2009-04-12 11:12 hackiller 閱讀(1156) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE第一次復(fù)習(xí)

          主站蜘蛛池模板: 融水| 乌拉特前旗| 嘉定区| 米林县| 合水县| 岢岚县| 怀柔区| 平武县| 思茅市| 体育| 伽师县| 南通市| 通辽市| 古田县| 漳平市| 宝山区| 顺昌县| 太原市| 涞源县| 柯坪县| 镇江市| 宣城市| 关岭| 兰西县| 贵德县| 西昌市| 云霄县| 乐至县| 长乐市| 宁明县| 右玉县| 夏津县| 麟游县| 峨边| 抚宁县| 瓦房店市| 九江市| 株洲县| 金乡县| 鄢陵县| 铜陵市|