java web----servlet概念
阿新 • • 發佈:2020-10-12
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");