Servlet

JavaWeb核心之Servlet
1、Servlet簡介
一、什麼是Servlet
        Servlet 運行在服務端的Java小程序,是sun公司提供一套規範(接口),用來處理客戶端請求、響應給瀏覽器的動態資源。但servlet的實質就是java代碼,經過java的API 動態的向客戶端輸出內容
servlet規範:包含三個技術點(三大組件)
  1. servlet技術
  2. filter技術---過濾器
  3. 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)  刪除
相關文章
相關標籤/搜索