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");
}
}
}