Java_servlet

1.public interface Servlet
   Servlet接口的基本目標是提供Servlet生命週期有關的方法:
init()
destroy()
service(ServletResquest req,ServletResponse resp):當用戶對於Servlet發出請求的時候容器會調用該方法處理用戶的請求,ServletResquest 提供用戶訪問請求數據的方法,ServletResponse提供構造Servlet響應的方法
getServletConfig()
源碼以下:java

public interface Servlet {
    //容器在啓動的被調用,僅調用一次
    void init(ServletConfig var1) throws ServletException;
    //獲取Servlet配置
    ServletConfig getServletConfig();
    //處理具體請求
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    //獲取Servlet的相關信息
    String getServletInfo();
    //Servlet銷燬後釋放資源
    void destroy();
}

 



2.public abstruct class GenericServlet extends Object implements Servlet,ServletConfig、Serilalizable
GenericServlet是一個抽象類,是Servlet接口的直接實現
init()
init()
service()
destory()
getServletConfig()
getServletContext()
getServletInfo()
GenericServlet源碼:

web

package javax.servlet;
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.ResourceBundle;
public abstract class GenericServlet
  implements Servlet, ServletConfig, Serializable
{
  private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
  private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
  private transient ServletConfig config;
  public void destroy()
  {
  }
  public String getInitParameter(String name)
  {
    ServletConfig sc = getServletConfig();
    if (sc == null) {
      throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
    }
    return sc.getInitParameter(name);
  }
  public Enumeration getInitParameterNames()
  {
    ServletConfig sc = getServletConfig();
    if (sc == null) {
      throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
    }
    return sc.getInitParameterNames();
  }
  public ServletConfig getServletConfig()
  {
    return this.config;
  }
  public ServletContext getServletContext()
  {
    ServletConfig sc = getServletConfig();
    if (sc == null) {
      throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
    }
    return sc.getServletContext();
  }
  public String getServletInfo()
  {
    return "";
  }
  public void init(ServletConfig config)
    throws ServletException
  {
    this.config = config;
    init();
  }
  public void init()
    throws ServletException
  {
  }
  public void log(String msg)
  {
    getServletContext().log(getServletName() + ": " + msg);
  }
  public void log(String message, Throwable t)
  {
    getServletContext().log(getServletName() + ": " + message, t);
  }
  public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse)
    throws ServletException, IOException;
  public String getServletName()
  {
    ServletConfig sc = getServletConfig();
    if (sc == null) {
      throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
    }
    return sc.getServletName();
  }
}

 


3.public abstract class HttpServlet extends GenericServlet implements Serilalizable

HttpServlet類的主要方法:
1.service(HttpServletResquest req,HttpServletResponse resp)
HttpServlet重寫了Servlet接口中的service方法,該方法用於判斷用戶的請求方式,若是是Get請求就調用相應的doGet方法,若是是Post方法,就調用相應的doPost方法。所以開放人員在編寫Servlet的時候,只須要重寫doGet、doPost方法便可,而不要去重寫service方法,若是Servlet收到一個Http請求而並無調用相應的do方法,它就返回一個說明此方法對於本資源不可用的報告,在HttpServlet的源碼中有所體現
2.doGet:用來處理Get請求
3.doPost:用來處理Post請求
須要注意的是:HttpServlet方法是能夠處理Http請求的Servlet,在Servlet原有的基礎上邊添加了對Http協議的處理,所以開發人員在編寫Servlet的時候多數是繼承與HttpServlet,而不是直接去實現Servlet接口(毫無心義)。

4.Servlet生命週期:從建立到相應客戶請求直至銷燬的過程
 1.加載和實例化:服務器運行中、Servlet被更改
 2.初始化:調用Init()方法,能夠讀取一些固定數據、初始化JDBC的鏈接以及創建與其餘資源的鏈接等操做
 3.處理請求:服務器接收到客戶端的請求時,會爲該請求建立一個請求對象和相應對象並調用Service(),service()方法肯定了請求方式,調用相應的do方法,若是有多個客戶端同時訪問Servlet時,服務器就會爲每個請求建立一個線程,這樣就能夠並行處理多個請求。
 4.銷燬

5.Servlet的兩種聲明方式:兩種方式任一種均可以,我的以爲註解式在如今更爲簡單
 1.基於web.xml的配置
  <servlet>
    <description>this is dispacther</description> //簡單的敘述,可有可無
    <servlet-name>Servlet`s name</servlet-name>  //Servlet的名字,不能夠和其餘的Servlet的名字出現重複的狀況
    <servlet-class>Servlet`s class</servlet-class>
   //指定實現Servlet的java類
  <init-param>
     <param-name>ConfigLocation</param-value>
     <param-value>classpath/classpath*</param-value>
       //以後會涉及到Spring的配置方式
  </init-param>
  <load-up-startup>a number</load-up-startup>
  //指定Servlet的加載順序,默認爲當Servlet第一次被請求時踩開始加載,當值爲0或者大於0的時候
  //表示容器在啓動時便開始加載Servlet
  <async-supported>Boolean值</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servlet`s name</servlet-name> 與上邊的name務必相同
    <url-pattern>/register</url-pattern>   匹配路徑,包括精確匹配、目錄匹配、擴展名匹配
  </servlet-mapping>


 2.基於註解的配置
@WebServlet(
name="wtf", //Servlet`s name
urlPatterns="/"  匹配路徑,包括精確匹配、目錄匹配、擴展名匹配
displayName="",
initParams="@WebInitparam(name="",value="")",相似於web.xml的init-param
loadOnStartup="0/1",  指定Servlet的加載順序
asyncSupported="true/false" 是否支持異步處理
)  

6.數據處理:HttpServletResponse接口對請求的數據進行處理
兩種數據形式:表單與超連接
當用戶的請求到達Servlet容器時,請求被包裝成了ServletResquest對象,若是是Http請求的話,請求繼續
被包裝成HttpServletResquest,處理信息的方法:
1.public String getParameter(String name) 返回name所指定的參數值(value)
2.public String[] getPatarameterValues(String name) 返回name所指定的一組參數值
3.public Enumeration getParameterNames()  返回一個集合,包含着全部用戶請求參數名

7.重定向和請求轉發
 1.重定向:重定向是指的由原請求地址從新定位到某個新地址,原有的請求失效,客戶端看到的是新的請求返回的請求結果,客戶端瀏覽器的地址欄變爲新的URL;
 語法:(HttpServletResponse)Resp.sendRirdect(new Url);
 example:(HttpServletResponse)Resp.sendRirdect(項目名/index.jsp):從新定位到項目名下的WEB-CONTENT目錄下的index.jsp文件
 具體步驟爲:
 1.客戶端在ServletA發起重定向到ServletB的請求A
 2.A傳遞到服務器,以後又傳遞到客戶端
 3.客戶端對服務器端的ServletB發起請求B
 4.請求A失效
 5.完成請求B,返回客戶端
 瀏覽器

重定向不只能夠定向在當前應用的全部的資源,還能夠定向其餘站點的資源
 2.請求轉發:是將請求轉發到其餘地址,可是在轉發過程當中使用的是一個請求,也能夠理解爲一個Servlet
在一個應用內部請求另外一個Servlet,也就說請求轉發是基於同一個應用內部的,而不能把請求轉發到其餘應用。
語法:
使用ResquestDispatcher接口中的forward()方法,該方法能夠把請求轉發給另一個資源

(HttpServletResquest)req.getResquestDispatcher(new URL).forward((HttpServletResquest)req,(HttpServletResponse)resq);
注意new URL是同一應用的下的資源
具體步驟:
  1.客戶端在ServletA中發起請求轉發到ServletB的請求A
  2.在服務器內部,對ServletB進行查找,完成請求A
  3.完成ServletB,返回客戶端


















服務器

相關文章
相關標籤/搜索