1. 程式人生 > 實用技巧 >java web----servlet概念

java web----servlet概念

servlet概念

  狹義的Servlet 是指Java 語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的(servlet通俗理解就是所有實現了servlet介面的實現類,程式設計師自己寫了類繼承了HTTPServlet,而HttpServlet繼承了這個servlet介面,實現了這個介面,所有支援servlet標準的容器(伺服器),就可以認識和處理我們寫了servlet類了),一般情況下,人們將Servlet理解為後者。
  Servlet運行於支援Java的應用伺服器中。從原理上講,Servlet可以響應任何型別的請求,但絕大多數情況下Servlet 只用來擴充套件基於HTTP協議的Web伺服器 

特點

  • Servlet的執行必須要支援Servlet標準的Web容器,像Tomcat、Jboss、Weblogic、WebSphere、Jetty等都支援。
  • Servlet的實現遵循了伺服器能夠識別的規則,也就是伺服器會自動的根據請求呼叫對應的servlet進行請求處理。
  • 簡單方便,可移植性強

執行流程

  • 瀏覽器傳送請求到伺服器,伺服器根據請求URL地址中的URI資訊在webapps目錄下找到對應的專案資料夾,然後在web.xml中檢索對應的servlet類(找到繼承了servlet介面的類),通過反射例項化這個類。呼叫service方法,通過service方法來呼叫doget、dopost方法(注意,這個其他的方法,都是通過service方法來呼叫的,因為tomcat預設只會呼叫service方法)

Servlet生命週期

1、生命週期(預設)

  當第一次servlet(類)被例項化載入到記憶體之後(預設第一次請求到來,才載入到記憶體),一直到伺服器關閉

2、生命週期(配置)

  在web.xml中設定了load-on-startup

<servlet>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>com.zy.servlet.ServletDemo</servlet-class>
        <load-on-startup>1</load-on-startup>  //設定隨伺服器啟動,就將servlet載入到記憶體,數字越小,越優先載入到記憶體中
</servlet>
<servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/my</url-pattern>
</servlet-mapping>
  • 1.載入:容器通過類載入器使用Servlet類對應的檔案來載入Servlet
  • 2.建立:通過呼叫Servlet的建構函式來建立一個Servlet例項
  • 3.初始化:通過呼叫Servlet的init()方法來完成初始化工作,這個方法是在Servlet已經被建立,但在向客戶端提供服務之前呼叫。(只初始化一次)
  • 4.處理客戶請求:Servlet建立後就可以處理請求,當有新的客戶端請求時,Web容器都會建立一個新的執行緒(在併發程式設計下servlet是執行緒不安全的)來處理該請求。接著呼叫Servlet的Service()方法來響應客戶端請求(Servic方法中根據請求的method屬性來呼叫doGet()和doPost())
  • 5.解除安裝:容器在解除安裝Servlet之前需要呼叫destroy()方法,讓Servlet釋放其佔用的資源。

Servlet使用

request物件獲取

1、伺服器在呼叫對應的servlet介面,肯定會把request傳遞進去,我們可以直接獲取到

public class ServletDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("<h1>hahaha</h1>");
    }
}

2、通過工具類獲取

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

Request物件

#獲取請求頭資料
#獲取請求方式
    String method=req.getMethod();
#獲取請求URL 
    StringBuffer url=req.getRequestURL();
    String uri=req.getRequestURI();
#獲取協議
    String h=req.getscheme();
#獲取請求行資料
    //獲取指定的請求行資訊
    String value=req.getHeader("User-Agent");
#獲取所有的請求行的鍵的列舉
    Enumeration e=req.getHeaderNames();
    while(e. hasMoreElements()){
    string name=(String)e. nextElement());
#獲取引數
    String name=req.getParameter("uname),  #注意getparameter不能獲取同鍵不同值的多個數據(像複選框之類的);
    String[] likes=req.getParameterValues("like"); #可以獲取多個值了

請求的資料如果出現亂碼

請求中文亂碼解決:
使用公共配置
    get方式:
        步驟一:req.setcharacterEncoding("utf-8");
        步驟二:
              在tomcat的目錄下的conf目錄中修改server.xml檔案:在Connector標籤中增加屬性<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/>  //多加了一個useBodyEncodingForURI="true";
              或者參考:https://www.jb51.net/article/145741.htm
    post方式:
        req.setCharacterEncoding("utf-8");