Day15-servlet
Servlet
概述:
Servlet Applet 服務器上的一個小程序, 主要是用來生成動態的web資源servlet 通常通過 HTTP(超文本傳輸協議)接收和響應來自 Web 客戶端的請求。要實現此接口,可以編寫一個擴展 javax.servlet.GenericServlet 的一般 servlet,或者編寫一個擴展 javax.servlet.http.HttpServlet 的 HTTP servlet。此接口定義了初始化 servlet 的方法init()、為請求提供服務的方法service()和從服務器移除 servlet 的方法destroy()。這些方法稱為生命周期方法,它們是按以下順序調用的:- 構造 servlet,然后使用 init 方法將其初始化。(第一次訪問的時候執行,如果沒有配置在web.xml中配置load-on-startup參數,就是調用了某個servlet的時候它的init()函數才會執行,如果配置了load-on-startup的話,就是在服務器啟動的時候,自動執行init()函數。) - 處理來自客戶端的對 service 方法的所有調用。(每次訪問的時候執行) - 從服務中取出 servlet,然后使用 destroy 方法銷毀它,最后進行垃圾回收并終止它。 除了生命周期方法之外,此接口還提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一種方法獲得任何啟動信息,而后一種方法允許 servlet 返回有關其自身的基本信息,比如作者、版本和版權。Servlet接口里面的5個重要的方法。
servlet的體系結構:
HttpServlet中兩個service,可以通過查看源碼知道,其實執行的時候,從父類繼承來的service()方法是調用了子類的service(HttpServletRequest,HttpServletResponse)方法的。所以無論如何都會執行子類的service方法的。而子類的方法里面有兩個方法doGet()方法和doPost()方法,其實本質上在執行的時候就是執行doget()方法,可以自己new一個servlet類繼承HttpServlet接口就可以看出來了。
servlet的生命周期:初始化方法init():第一次訪問的時候才會調用
服務的方法service():每次訪問的時候都會調用
銷毀的方法destroy():服務器正常關閉,或者工程從服務器中移除的時候調用、
servlet中的一些api(方法):
servlet中獲取請求參數和輸出內容:
- request.getParameter(String name) 從請求對象中獲取到參數
response.getWriter().println(String msg) 向頁面中獲取參數
詳細:
servlet請求對象
- getParameter(String name),從請求對象中獲取參數 以 String 形式返回請求參數的值,如果該參數不存在,則返回
null。請求參數是與請求一起發送的額外信息。對于 HTTP servlet,參數包含在查詢字符串或發送的表單數據中。
ServletResponse
servlet響應對象
getWriter() throws java.io.IOException向頁面輸出內容
返回可將字符文本發送到客戶端的 PrintWriter 對象。PrintWriter 使用 #getCharacterEncoding 返回的字符編碼。如果未如 getCharacterEncoding 中所述指定響應的字符編碼(即該方法只返回默認值 ISO-8859-1),則 getWriter 會將字符編碼更新到 ISO-8859-1。
如:
url-pattern的配置:
- 完全匹配:以/開頭
目錄匹配:以/開頭,以*結尾
后綴名匹配: .jsp,.action,.do,.xxx
優先級:完全匹配 > 目錄匹配 > 后綴名匹配
一個Servlet可以對應多個路徑
一個路徑只能夠對應一個Servlet
啟動參數:
load-on-startup,在啟動服務器的時候的時候自動進行初始化,自動調用了init(servletConfig)
數字越小,優先級越高 (一般系統的是1,所以最好自定義的就從2開始好了)
例如,在servers中的web.xml中有一個DefaultServlet,默認就啟動了。這個東西是服務于靜態的資源。就是靜態資源是服務器一啟動的時候就加載了。。。
load-on-startup是可以寫在自己寫的servlet里面的??刂扑麄兊募虞d優先級
這樣寫上之后,只要在服務器啟動的時候就會自動啟動。
作用:比如啟動定時任務,檢查數據庫是否存在或者檢查表是否存在。
servletConfig
其中getServletContext()重要
下述語句寫在servlet標簽里面
web.xml:
getServletConfigDemo:
public class getServletConfigDemo extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletConfig servletConfig = this.getServletConfig();//獲取指定參數名參數String username = servletConfig.getInitParameter("username");System.out.println(username);response.getWriter().write("username:"+username);//獲取所有參數名字Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while(initParameterNames.hasMoreElements()){System.out.println(initParameterNames.nextElement());}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}servletConfig中最重要的是getServletContext()
獲取上下文/全局上下文/全局管理者
主要作用就是用來共享servlet之間的數據
生命周期:
創建時間:服務器啟動的時候就創建了
銷毀時間:服務器關閉或者工程被移出的時候就銷毀了
在整個應用程序中只有一個實例,保證了所有servlet用的都是相同的內容(單例設計模式)
獲取方法:this.getServletContext();
這個方法本質上還是調用this.getServletConfig().getServletContext();
作用:
1)獲取全局初始化參數
2)實現資源共享
3)獲取資源路徑
4)獲取文件的mime類型。
5)獲取絕對路徑
6)獲取流
實現資源共享:servletContext
xxxAttribute;setAttribute(key,value)getAttribute(key)removeAttribute(key) @Overridepublic void init() throws ServletException {//獲取上下文ContextServletContext servletContext = this.getServletContext();servletContext.setAttribute("count", 0);System.out.println("LoginServlet執行了");};ServletContext
獲取文件的mime類型:ServletContext.getMimeType();
獲取文件的絕對路徑:
注意:文件要放在webContent文件夾下
這里要說一下,這個路徑其實是從工程下的Web-Content開始寫的路徑。
將一個文件讀取到一個流中:
ServletContext servletContext = this.getServletContext();InputStream resourceAsStream = servletContext.getResourceAsStream("/aaa.txt");System.out.println(resourceAsStream);配置默認工程的默認主頁:
web.xml中:
重定向:
//重定向
response.setStatus(302); response.setHeader("location", "/Day15_0622_03MyLoginDemo/successLogin");MD5加密
不可逆的加密算法
處理中文亂碼問題:
unicode其實就是utf-8
如果是在servlet類中:具有response的類中:
//防止中文亂碼
重點api:
getInitParameter(String name) 根據指定名稱獲取全局/局部初始化參數!調用函數的對象不同,獲取的參數就是全局和局部的
用servletContext對象調用的就是全局的,用servletConfig對象調用的就是局部的參數
getInitParameterNames();
全局初始化參數:
例:
在servlet類中:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取全局配置ServletContext servletContext = this.getServletContext();String initParameter = servletContext.getInitParameter("TestContextParam");System.out.println("get ContextParam:"+initParameter);//獲取局部配置ServletConfig servletConfig = this.getServletConfig();String initParameter2 = servletConfig.getInitParameter("TestServletConfig");System.out.println("get ServletConfig"+initParameter2);}javaEE經典三層架構:
servlet:控制服務流程service:服務業務dao:dao操作數據庫總結
以上是生活随笔為你收集整理的Day15-servlet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue实现姓名筛选
- 下一篇: 全球与中国回音壁市场深度研究分析报告