1. include指令
語法: <%@ include file=""%>
作用:通知容器,在將jsp文件轉換成servlet類時,將file屬性指定的文件的內容插入到該指令所在的位置。
注:被包含的文件并沒有對應的servlet類。
2.比較轉發與重定向
(1)能否共享request
轉發可以,而重定向不行。
? 注:request和response的生存時間很短暫(一次請求和響應期間存在)。
(2)目的地有無限制
轉發有限制(同一個應用),而重定向沒有限制。
(3)瀏覽器地址欄的地址有無變化
轉發沒有變化,而重定向有變化。
3.路徑問題
(鏈接,表單提交,重定向,轉發如何填寫路徑)
1)相對路徑
a.什么是相對路徑?
不以"/"開頭的路徑。
2)絕對路徑
a.什么是絕對路徑?
以"/"開頭的路徑
b.如何寫絕對路徑?
鏈接,表單提交,重定向從應用名開始寫,轉發從應用名之后開始寫。
注:不要將應用名直接寫在路徑里面,而應該使用getContextPath方法來獲得應用名。
String request.getContextPath();
4. Servlet的生命周期
(1)什么是servlet的生命周期
容器如何創建servlet對象,如何對其進行初始化處理,如果調用其方法來處理請求,以及如何銷毀該對象的整個過程。(即容器如何管理servlet)。
(2)四個階段
1)實例化
a.什么是實例化?
容器創建servlet對象。
b.什么時候實例化?
情況1:容器收到請求之后才會創建。
情況2: 容器啟動之后,立即創建(需要額外配置)。
? 注:容器默認情況下,只會創建一個實例。
2)初始化
a.什么是初始化?
實例化之后,容器會調用該實例的init方法。
? 注:該方法只會執行一次!
b.GenericServlet的init方法是如何實現的?(了解)
將容器傳遞過來的ServletConfig對象保存下來了,并且提供了getServletConfig方法。
c.如何實現自已的初始化處理邏輯?
override GenericServlet的init方法(不帶參的那個)。
d.初始化參數
step1.配置初始化參數
step2.調用ServletConfig提供的方法
String getInitParameter(String paramName)
3)調用(就緒)
a.什么是就緒?
容器收到請求之后,會調用servlet實例的service方法。
b.HttpServlet的service方法是如何實現的?
依據請求類型,分別調用對應的doXXX方法(比如,get請求就調用doGet方法)。
4)銷毀
a.什么是銷毀?
容器在刪除servlet實例之前,會調用該實例的destroy方法。該方法只會執行一次。
b.可以override GenericServlet提供的init方法來實現自已的銷毀處理邏輯。
(3)相關的幾個接口和類
1)Servlet接口
a.init(ServletConfig config)
b.service(ServletRequest req,ServletResponse res)
? 注:ServletRequest是一個接口,HttpServletRequest是其子接口。ServletResponse與之類似。
c.destroy()
2)GenericServlet抽象類
實現了Servlet接口的init和destroy方法。
3)HttpServlet抽象類
繼承了GenericServlet,實現了service方法。
練習:
提示:
step1.建表
create table t_user(
id number(8) primary key,
username varchar2(50) unique,
name varchar2(100),
password varchar2(20),
gender char(1)
);
create sequence t_user_seq;
step2.實體類 User
step3.UserDAO類
//完成插入操作
public void save(User user);
//查看用戶名是否存在,如果不存在,返回null,
//否則返回User對象。
public User findByUsername(String username);
step4.regist.jsp
step5.ActionServlet
a. 讀取注冊信息
b. 查看用戶名是否存在,如果存在,提示用戶(使用轉發)
request.setAttribute("regist_failed","用戶名已經存在");
c.如果用戶名不存在,則將注冊信息插入到數據庫,跳轉到登錄頁面(使用重定向)。