1. 程式人生 > >01-2 servlet

01-2 servlet

servlet

 1. 概念:
    Servlet是一個執行在服務端的java小程式,
    是sun公司提供的一套規範(介面), 用來處理客戶端請求,
    Servlet的實質其實就是java程式碼, 通過java的API向客戶端輸出(動態)內容

 Servlet執行需要一個執行環境,即需要一個Servlet容器,這裡我們使用Tomacat。

 2. Servlet (生命週期) API
    1) void init(ServletConfig config)
        何時執行: Servlet物件建立後執行
        
        config引數的3個作用
        a. 獲得Servlet的名字
        b. 獲得ServletContext
        c. 獲得初始化引數initParm

    2) void service(ServletRequest request, ServletResponse response)
        何時執行: 每次請求都會執行
        
    3) void destroy()
        何時執行: Servlet物件銷燬前執行

tomcat伺服器工作流程


    面試題:


    1. 對XXServlet進行了10次訪問, init destroy service各執行幾次
    request物件建立了幾個 response物件建立了幾個?
    init 1次
    destroy 不執行
    service 10次
    request物件 10個
    response物件 10個

    2. 請簡述Servlet的生命週期


     預設第一次訪問時建立Servlet物件, 並執行init方法
     伺服器關閉前會銷燬Servlet物件, 並執行destroy方法
     每次訪問都會執行service方法

 3. Servlet的配置(2.5版本,3.0版本採用註解)

    注意:所有的JavaWeb專案中web.xml都繼承自伺服器下的web.xml
    1. url-pattern(url路徑) 的配置
        1) 完全匹配 訪問的路徑要和配置的路徑完全相同才能訪問到
        2) 目錄匹配     /a/b/*        *表示任意
        3) 拓展名匹配     *.拓展名
    
    注意1: 2 3不能混用  /a/b/*.do

    注意2: 預設路徑: /
        表示匹配任意路徑
        Tomcat中任意資源訪問都是通過Servlet

    2. <load-on-startup>
        會讓Servlet在伺服器啟動時就建立物件
        裡面填的數字是優先順序

    3. <welcome-file-list>

<welcome-file-list>用於指定應用的首頁
裡面可以指定多個檔案,應用伺服器會按從上到下的順序搜尋,如果找到就了進入該頁面,如果都遍歷完了還沒找到就會返回404錯誤程式碼給瀏覽器。

    4. 開發中往往不會實現Servlet介面, 而會繼承HttpServlet類
        這樣不用重寫很多的方法

 


【ServletContext】

 1. ServletContext物件
  表示一個web應用的環境(上下文)物件,
  內部封裝了web應用的資訊
  該物件一個web應用只有一個

  問題: 一個web應用裡有幾個Servlet物件?

  可以有多個Servlet物件,但是隻有一個ServletContext物件

 2. 生命週期
  建立: 該web應用被載入的時候建立(伺服器啟動或者釋出web應用時)
  銷燬: web應用被解除安裝(伺服器關閉的時候)


 3. 獲取ServletContext物件
    ServletConfig.getServletContext();
    也可以在HttpServlet中直接呼叫getServletContext()

 4. 作用
    a. 獲得全域性初始化引數
    b. 獲取web應用中任何資源的絕對路徑(關鍵)
    c. 是一個域物件

    域物件的通用方法
        context.setAttribute(name, object);
        context.getAttribute(name)
        context.removeAttribute(name);

  

例題:
1. 做一個登入功能

2. 登入成功之後, 顯示一個標題, 5秒後跳轉

3. 跳轉到的頁面顯示 你是第幾個登入成功的使用者

package com.wowowo.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.wowowo.database.ConnectionFactory;
import com.wowowo.service.UserService;
import com.wowowo.service.impl.UserServiceImpl;

/**
 * Servlet implementation class LoginServletexe
 */
public class LoginServletexe extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private UserService us = new UserServiceImpl();
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String uname = request.getParameter("uname");
		String upwd = request.getParameter("upwd");
		try {
            //用了三層架構,異常處理事務,service層和dao層的程式碼不再給出,可以看看架構基礎
			us.login(uname,upwd);
            //獲取servlet上下文
			ServletContext context = getServletContext();
			Object value = context.getAttribute("hero");
            //如果獲取的值為空,那麼就是第一次登陸,把k-v放到context裡面
			if(value==null){
				context.setAttribute("hero", 1);
			}else{
             //否則不是第一次登陸,把value的值+1再放入
				context.setAttribute("hero", (int)value+1);
			}
            //沒有出現異常(使用者名稱或者密碼錯誤)就列印success,5秒後跳轉
			response.getWriter().write("success,5seconds to demo4");
			response.setHeader("refresh", "5;url=/my1018/demo4");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
            //捕獲到異常,即使用者名稱密碼錯誤
			response.getWriter().write("failed");
			response.setHeader("refresh", "1;url=/my1018/login.html");
		}
	}

}