JavaWeb核心之Servlet
1、Servlet簡介
一、什麼是Servlet
Servlet 運行在服務端的Java小程序,是sun公司提供一套規範(接口),用來處理客戶端請求、響應給瀏覽器的動態資源。但servlet的實質就是java代碼,經過java的API 動態的向客戶端輸出內容
servlet規範:包含三個技術點(三大組件)
- servlet技術
- filter技術---過濾器
- listener技術---監聽器
二、Servlet快速入門
實現步驟(必須、缺一不可):
a、建立類實現Servlet接口
b、覆蓋還沒有實現的方法-----service方法
c、在web.xml進行servlet的配置
三、Servlet的API
a、Servlet接口中的方法
(1)init(ServletConfig config)
什麼時候執行:servlet對象建立的時候執行。
ServletConfig:表明的是該servlet對象的配置信息。
//1.得到servlet的name---<servlet-name>QuickStartServlet</servlet-name>
String servletName = arg0.getServletName();
System.out.println(servletName);//QuickStartServlet,配置文件中本身定義的名字
//2.得到該servlet的初始化的參數
arg0.getInitParameter(null);
//3.獲取ServletContext對象
ServletContext servletContext = arg0.getServletContext();
(2)service(ServletRequest request, ServletResponse response)。
什麼時候執行:每次請求都會執行
ServletRequest:表明請求 ,認爲ServletRequest 內部封裝的是http請求的信息。
ServletResponse:表明響應,認爲要封裝的是響應的信息。
(3)destroy()
什麼時候執行:servlet銷燬的時候執行。
四、Servlet的生命週期(面試問題?)
(1)Servlet什麼時候建立
默認第一次訪問servlet時建立該對象(調用init()方法)
(2)Servlet什麼時候銷燬
服務器關閉servlet就銷燬了(調用destroy()方法)
(3)每次訪問必須執行的方法
public void service(ServletRequest arg0, ServletResponse arg1)
面試題:介紹下servlet的生命週期?
五、Servlet的執行過程
客戶端 |
服務器端(Tomcat服務器) |
數據庫 |
http://localhost:8888/XXXX
|
Tomcat
Tomcat引擎
一、解析請求的資源地址
二、建立Servlet對象
三、建立表明對象請求的request對象和表明響應的response對象
|
服務器
WEB工程
由Tomcat引擎傳遞request、response。
service(request,response)
每次訪問services方法都會建立一對新的request和response對象。
|
|
問題:對XXXServlet進行了10次訪問,init(),destory(),service(),doGet(),doPost() 一共執行力多少次?request對象建立幾個?response建立幾個?
Servlet訪問的過程:
Http請求---->web.xml--------> url -pattern----->servlet-name----->servlet-class-----> QuickStratServlet(對應的Class文件)
六、servlet的配置
基本配置web.xml文件
<!--servlet的類的配置-->
<!--servlet的虛擬路徑的配置-->
其中url-pattern的配置方式:
a、徹底匹配:訪問的資源與配置的資源徹底相同才能訪問到
<url-pattern>/quickStartServlet</url-pattern>
b、目錄匹配:格式:/虛擬的目錄..../*
<url-pattern>/aaa/bbb/ccc/*</url-pattern> //* 表明任意
c、擴展名訪問:格式:*.擴展名;
<url-pattern>*.abcd</url-pattern>
注意:第二種與第三種混用 如 :/aaa/bbb/*.cba (錯誤)
服務器啓動實例化Servlet配置
Servlet什麼時候建立:默認第一次訪問時建立
爲何是默認?
當在Servlet的配置是,加上一個配置<load-onstartup> ;
servlet對象在服務器啓動時就建立。<!--數字表明優先級,數字越小優先級越高-->
<load-on-startup>4</load-on-startup> 最好取中間數字 4/5。
缺省Servlet ?
能夠將url-pattern 配置一個/,表明該servlet是缺省的servlet。
什麼是缺省的servlet?
當你訪問資源地址全部的servlet都不匹配時,缺省的servlet賦值處理。
其實,web應用中全部的資源的響應都是servlet負責,包括靜態資源(html頁面)。(有配置缺省的servlet,沒法訪問到靜態資源。)
歡迎頁面?
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
能夠本身設置歡迎頁面!
若是本身沒有配置,則找全局的web.xml裏面的配置信息。
(Tomcat---->conf----->web.xml)
本身添加模板!servlet
注:在實際開發中,基本不用以上方法創建Servlet,但仍是須要了解明白其過程。
直接新建---->Servlet
七、案例:實現用戶登陸功能
客戶端 |
服務器端 |
數據庫端 |
登陸的頁面
用戶名
密碼
提交
|
LoginServlet
doPost(request,response)
//經過request得到請求參數
//使用DBUtils去數據庫中校驗
//登陸成功--顯示該用戶的全部信息
//登陸失敗--給錯誤提示
|
數據庫
|
第一步:建立登陸頁面login.html
第二步:創建包以及子包
(小技巧:怎樣建立子包?Project Explorer工程哪裏向下小箭頭,點擊以後將package presentation調爲hierarchical)
第三步:建立數據庫鏈接已經domain(JAVABean)
添加的jar包有:
c3p0-0.9.1.2.jar
commons-dbutils-1.4.jar
mysql-connector-java-5.1.7.-bin.jar
建立:
c3p0-config.xml
DataSourceUtils.java (數據庫鏈接工具)
User.java
第四步:完成Servlet
LoginServlet.java
(注意:若是該類名的話,系統不會自動改哪裏使用了該類的類名,特別是配置文檔裏面的內容。全部必定要手動修改)
//1.得到用戶名和密碼
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.從數據庫中驗證該用戶名和密碼是否正確
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select * from user where username= ? and password = ?";
User user = null ;
try {
user = runner.query(sql,new BeanHandler<User>(User.class), username,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.根據返回的結果給用戶不一樣顯示信息
if (user!=null) {
//從servletContext中取出count進行++運算
Integer count = (Integer) this.getServletContext().getAttribute("count");
count++;
//用戶登陸成功
response.getWriter().write(user.toString() + "\n welcome to you " + count +"!!!");
this.getServletContext().setAttribute("count", count);
}else {
//用戶登陸失敗
response.getWriter().write("sorry your username or password is wrong");
}
八、ServletContext對象(重要)
一、什麼是ServletContext對象?
ServletContext表明一個web應用的環境(上下文)對象。web應用。
內部封裝是該web應用的信息。一個web應用只有一個ServletContext對象。
問題:一個web應用中有多少個servelt?------多個
ServletContext對象的生命週期?
建立:該web應用被加載(服務器啓動或發佈應用(前提,服務器是啓動狀態))
銷燬:web應用被加載(服務器關閉,移除該web應用)
二、怎樣得到ServletContext對象?
a、ServletContext servletContext = config.getServletContext();
b、ServletContext servletContext = this.getServletContext();
//得到ServletContext對象
ServletContext servletContext = this.getServletContext();
三、ServletContext的做用
a、得到web應用全局初始化參數
web.xml中配置初始化參數。
<!--配置全局的初始參數 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.scalpel.login.LoginServlet</param-value>
</context-param>
經過context對象得到參數
//得到ServletContext對象
ServletContext servletContext = this.getServletContext();
String initParameter = servletContext.getInitParameter("driver");
System.out.println(initParameter);
b、得到web應用中任何資源的絕對路徑(重要、重要、重要)
方法: String path = context.getRealPath(相對於該web應用的相對地址);
a.txt 在WebContent下:
String realpath_A = context.getRealPath("/a.txt");
b.txt在WebContent下WEB—INF下面:
String realpath_B = context.getRealPath("/WEB-INF/b.txt");
c.txt在src下面:
String realpath_C= context.getRealPath("/WEB-INF/classes/c.txt");
d.txt在WEB13下面:
沒法獲取。
在讀取src(classes)下的資源是能夠同類加載器---專門加載classes下的文件的。
//getResource()參數是一個相對地址 相對classes
String path = ContextServlet.class.getClassLoader().getResource("文件名").getPath();
跟c.txt差很少。
c、ServletContext是一個域對象(重要 重要 重要)
什麼是域對象?什麼是域?
存儲數據的區域就是域對象
ServletContext域對象的做用範圍:
整個web應用程序(全部的web資源均可以隨意向servletcontext域中存取數據,數據能夠共享)
統計用戶登陸次數:
@Override
public void init() throws ServletException {
//在ServeltContext域中存一個數據count
int count = 0;
this.getServletContext().setAttribute("count", count);
}
//3.根據返回的結果給用戶不一樣顯示信息
if (user!=null) {
//從servletContext中取出count進行++運算
Integer count = (Integer) this.getServletContext().getAttribute("count");
count++;
//用戶登陸成功
response.getWriter().write(user.toString() + "\n welcome to you " + count +"!!!");
this.getServletContext().setAttribute("count", count);
域對象的通用的方法:
setAtrribute(String name,obj) 存
getAttribute (String name) 取
removeAttribute(String name) 刪除