通過一段時間的學習,對於Servlet有了新的不同的看法,在這裏作一下總結,將近來學習到的知識總結一下。html
瀏覽器發出請求:http://localhost:80/xxx1/xxx2 (80端口能夠默認不寫,由於這是http協議默認的端口,平時咱們訪問https://www.baidu.com/ 時其實訪問的是https://www.baidu.com:80/)java
<Context docBase="D:\javaPros\test\webapp" path="xxx1" />
<Context />
元素的 path屬性 屬性爲 xxx1
<Context />
元素,獲得docBase
屬性,獲取當前訪問 Web 項目的跟的絕對路徑:D:\javaPros\test\webapp
D:\javaPros\test\webapp
下的 WEB-INF 下找到 web.xml 文件<url-pattern>
的文本內容爲 /xxx2
Map<String,Servlet> cache = ......(Tomcat提供的); key:存Servlet類的全限定名稱 value:該Servlet類的對象. Servlet obj = cache.get("xxx.xxx"); if(obj==null){ //Servlet實例緩存中沒有該類的對象,第一次. GOTO 6: }else{ //有對象,非第一次. GOTO 8: } }
使用反射調用構造器,建立對應的對象
obj = Class.forName("xxx.xxx").newInstance();
把當前建立的 Servlet 對象,存放在緩存之中,供給下一次的使用.
cache.put("xxx.xxx",obj);
git
建立 ServletConfig 對象,並調用 init() 方法
obj.init(config);
github
建立 ServletRequest 對象和 ServletResponse 對象,並調用 service()方法
obj.service(req,resp);
web
在 service() 方法中對瀏覽器做出響應操做。設計模式
在 Web 容器中,Servlet 主要經歷 4 個階段,以下圖:
跨域
這一部分參考文章:這裏是連接數組
前面的文章裏面提到過,廣義上,Servlet 即實現了 Servlet 接口 的類,當咱們建立一個自定義類,實現 Servlet 接口 的時候,會發現有 5 個方法須要重寫,有init【初始化】,destroy【銷燬】,service【服務】,ServletConfig【Servlet配置】,getServletInfo【Serlvet信息】。瀏覽器
這樣作的話,咱們每次都須要實現 5 個方法,太麻煩了!緩存
咱們能夠直接繼承 HttpServlet 類,該類已經默認實現了 Servlet 接口中的全部方法,在編寫 Servlet 的時候,你只須要重寫你須要的方法就行了,而且該類還在原有 Servlet 接口上添加了一些與 HTTP 協議處理相關的方法,比 Servlet 接口的功能更強大。
this.doPost(req, resp);
(由於不管是get或post請求提交的數據,處理方式都基本相同,下同)this.doGet()(req, resp);
瀏覽器屢次對Servlet的請求,通常狀況下,服務器只建立一個Servlet對象,也就是說,Servlet對象一旦建立了,就會駐留在內存中,爲後續的請求作服務,直到服務器關閉。
對於每次訪問請求,Servlet引擎都會建立一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,而後將這兩個對象做爲參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。
當多個用戶訪問Servlet的時候,服務器會爲每一個用戶建立一個線程。當多個用戶併發訪問Servlet共享資源的時候就會出現線程安全問題。
原則:
1. 若是一個變量須要多個用戶共享,則應當在訪問該變量的時候,加同步機制synchronized (對象){}
2. 若是一個變量不須要共享,則直接在 doGet() 或者 doPost()定義.這樣不會存在線程安全問題
對於每次訪問請求,Servlet引擎都會建立一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,即 request 和 response 對象。
既然 request 對象表明 http 請求,那麼咱們獲取瀏覽器提交過來的數據,就找 request 對象 便可。response 對象表明 http 響應,那麼咱們向瀏覽器輸出數據,找 response 對象便可。
resp.setContentType("text/html;charset=utf-8");
要知道,GET 和 POST 都是請求方式
http://localhost/test.html
?name=wmyskxz&sex=malename
屬性值爲wmyskxz
,另外一個是sex
屬性值爲male
,這是一種直接的請求方式,在請求資源後面跟上 ? 符號與參數鏈接,其餘的參數使用 & 符號鏈接。缺點:
1.暴露請求信息,不安全
2.請求信息不能超過1kb,可傳輸的信息有限,不能上傳圖片
http://localhost/test.html#
優勢:
1.隱藏了請求信息,較安全(但仍能夠經過相關工具訪問到數據)
2.POST 方式沒有限制請求的數據大小,能夠作圖片的上傳
但並非全部的數據都須要使用 POST 請求來完成,事實上,GET 請求方式會比 POST 請求更快,當數據小而且安全性要求不是那麼高的時候,GET 仍然是很好的選擇.(而且 GET 相較 POST 簡單)
在 Tomcat 服務器中,接受請求的時候,默認的編碼方式爲 ISO-8859-1,而該編碼方式只佔一個字節,不支持中文(兩個字節),因此當咱們作請求的時候,會出現亂碼的問題
byte[] data = name.getBytes("ISO-8859-1");
name = new String(data,"UTF-8");
request.setCharacterEncoding("UTF-8");
Tomcat根目錄/conf/server.xml(修改端口的那一行)
<url-pattern>
,可使用多個資源名稱找到當前的 Servlet*
表示任意字符/*
:可使用任意的字符訪問當前的 Servlet*.xxx
:如 wmyskxz.wudi<servlet-name>
不可以爲 default ,使用它會形成項目下面的靜態資源找不到,在 Tomcat/conf/web.xml
文件中配置一個名字爲default的Servlet,該Servlet在負責訪問項目下的靜態資源這是 Servlet 3.0 提出的新特性,支持註解配置,這大大簡化了咱們的工做。
在以前的開發工做中,咱們老是去 web.xml
文件中進行配置,至少會出現8行:
而當一個項目中存在不少 Servlet ,那麼配置文件就會變得很是臃腫,不便於後期的維護,在 Servlet 3.0 推出以後,咱們可使用註解來配置 Servlet,上面 8 行的配置能夠簡化爲下面的簡單的註解:
或者也可使用屬性 value
定義訪問的 URL,只有 URL 這個屬性是必要的,name
是能夠缺省的值,而默認的 value
也能夠省略不寫,因此能夠簡寫成:
@WebServlet("/foreServlet")
又叫作直接轉發方式,客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每一個信息資源是共享的。
好比:從 AServlet 請求轉發到 BServlet
request.getRequestDispatcher(path).forward(request, response);
參數:path
,要跳轉到的資源路徑:上下文路徑 / 資源路徑
request.setAttribute(String var1,Object var2)
設置要共享的數據資源,並經過request.getAttribute(String var1);
來獲取傳遞的資源又叫作間接轉發方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另一個URL發出請求,從而達到轉發的目的。
好比:從AServlet重定向到BServlet
response.sendRedirect(String location);
參數:location
,轉發到的資源路徑
MVC 是一種分層的設計模式 。
這部分能夠參考一下這裏
歡迎轉載,轉載請註明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz 歡迎關注公衆微信號:wmyskxz_javaweb 分享本身的Java Web學習之路以及各類Java學習資料