GenericServlet和HttpServlet

ServletRequest和ServletResponse真實的類型是HttpServletRequst和HttpServletResponse,可將ServletRequest類型對象強制轉化成HttpServletRequest類型。

HttpServletRequest

  • String getParameter(String name):獲取指定參數值。
    實例
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        res.getWriter().print("hello!你的用戶名爲:"+username+",您的密碼爲:"+password);
    }

web.xml配置

<servlet>
      <servlet-name>BServlet</servlet-name>
      <servlet-class>cn.my.servlet.BServlet</servlet-class>     
  </servlet>
    <servlet-mapping>
      <servlet-name>BServlet</servlet-name>
      <url-pattern>/b_servlet</url-pattern>
  </servlet-mapping>

結果
這裏寫圖片描述

GenericServlet

是Servlet接口的 實現類,我們可以繼承GenericServlet來編寫自己的Servlet。

  • 直接使用this.getInitParameter()方法,來獲取初始化參數。
  • 直接使用this.getServletContext(),來獲取ServletContext對象。
  • 要求:如果需要做初始化參數,不能再去覆蓋init(ServletConfig),而是去覆蓋GenericServlet直接提交的init()。
class MyGenericServlet extends GenericServlet{
    public void service(ServletRequest request , ServletResponse response){
    String p1=this.getInitParameter("p1");

    //這個方法是GenericServlet自己提供的,他不是Servlet的生命週期方法。
    //因爲在GenericServlet的init(ServletConfig)方法會調用init()方法。
    //默認init()方法是沒有內容的。
    public void init(){
        System.out.println("servlet出生了");
    }
}

實例

/**
 * 如果希望添加初始化操作,那麼不要去覆蓋init(ServletConfig)方法,而是去覆蓋init()方法
 * init()方法是GenericServlet提供的,他不是生命週期方法,它會被生命週期方法調用。
 * @author green
 *
 */
public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        String pp1=this.getInitParameter("pp1");//得到pp1的值
        PrintWriter out=res.getWriter();
        out.print(pp1);
    }
}

web.xml配置

<servlet>
      <servlet-name>MyGenericServlet</servlet-name>
      <servlet-class>cn.my.servlet.MyGenericServlet</servlet-class>   
      <init-param>
      <!--參數-->
         <param-name>pp1</param-name>
         <param-value>vv1</param-value>
   </init-param>  
 </servlet>

  <servlet-mapping>
      <servlet-name>MyGenericServlet</servlet-name>
      <url-pattern>/generic_servlet</url-pattern>
  </servlet-mapping>

這裏寫圖片描述

HttpServlet

它是GenericServlet得到子類。
它是專注與HTTP請求的Servlet(我們這都是HTTP請求)。
在HttpServlet中只需要覆蓋doGet()或doPost()即可,不能再覆蓋service()方法。

public void servlet(ServletRequest request , ServletResponse response) {
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    service(req,res);
}
public service(HttpServletRequest,HttpServletRespose response){
    String method=request.getMethod();//獲取當前的請求方式,可能是GET也可能是POST
    if(method.equals("GET"))
    doGet(request,response);
    else if(method.equals("POST"))
    doPost(request,response);
}
public void doGet(ServletRequest request , ServletResponse response){
    //向客戶端響應405狀態碼
}
public void doPost(ServletRequest request , ServletResponse response){
    //向客戶端響應405狀態碼
}

doGet(0和doPost()都不是抽象的,也不是空方法,響應爲405,表示客戶端出錯。不覆蓋方法調用響應爲405.

servlet總結:

1、servlet是單例的
2、servlet是線程不安全的
3、<load-on-startup>,指定當前servlet在服務器啓動時就創建實例,如果有多個servlet被指定爲服務器啓動即創建實例,那麼這個值就是用來指定創建的順序。

<servlet>
    ...
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet>
    ...
    <load-on-startup>1</load-on-startup>
</servlet>

使用<load-on-startup>的值進行排序,確定進行創建的順序,該值不能爲負。
4、<url-pattern>

<servlet>
    <servlet-name>abc</servlet-name>
    <servlet-class>cn.my.servlet.AServlet</servlet-class>
    </servlet>
<servlet-mapping>
    <servlet-name>abc</servlet-name>
    <url-pattern>/a_servlet</url-pattern>
    <url-pattern>/b_servlet</url-pattern>
</servlet-mapping>
<!-- 
http://localhost:8080/day04_2/a_servlet
http://localhost:8080/day04_2/b_servlet
以上兩個都是在訪問AServlet這個類。
-->
<!-- ..........上面換個寫法.................-->
<servlet-mapping>
    <servlet-name>abc</servlet-name>
    <url-pattern>/a_servlet</url-pattern>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!-- 其中*就是通配符,它匹配所有字母。
   http://localhost:8080/day04_2/sdf.do
   http://localhost:8080/day04_2/a/b/csds.do-->

注意:

  • 一個類屬性名必須大於等於兩個字符,並且名稱的前兩個字符大小寫必須一致。
  • “*”必須是兩頭,要麼是最前面,要麼最後,例如:/*.do,是錯誤的。
  • <url-pattern>中可以使用通配符開頭,或是“/”開頭。

web.xml文件繼承

完整的javaweb應用中都需要有web.xml。但我們不知道所有的web.xml文件都有一個共同的父文件,他在Tomcat的conf/web.xml路徑。
父web.xml

  • 定義了一個defualt的servelt,這個servelt在資源找不到時執行,它會響應404頁面。
  • 定義了一個jsp的sehrvlet。
  • seddion的超時時間爲30分鐘。
  • Mine類型。
  • 還定義歡迎頁。index.html,index.htm,index.jsp
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章