-1 web Client 向servlet服務器,發出Http請求
-2 servlet接受web Client的請求
-3 servlet容器創建一個HttpRequest 對象,將Web Client請求的信息封裝到這個對象中
-4 servlet容器創建一個HttpResponset對象
-5 servlet容器調用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數傳給HttpServlet對象
-6 HttpServlet調用HttpRequest對象的有關方法,獲取Http請求信息
-7 HttpServlet調用HttpResponst 對象的有關方法,生成響應數據
-8 Servlet容器把 HttpServlet的響應結果給Web Client
簡單的說:init service destroy
Servlet不是線程安全的,多線程并發的讀寫會導致數據不同步的問題。
解決的辦法是盡量不要在實現servlet接口的類中定義實例變量,而是要把變量分別定義在doGet()和doPost()方法內。雖然使用synchronized(name){}語句塊可以解決問題,但是會造成線程的等待,不是很科學的辦法。
注意:多線程的并發的讀寫Servlet類屬性會導致數據不同步。但是如果只是并發地讀取屬性而不寫入,則不存在數據不同步的問題。因此Servlet里的只讀屬性最好定義為final類型的。
<%@ page isThreadSafe=”false”%>
①get請求用來從服務器上獲得資源,而post是用來向服務器提交數據;
②get將表單中數據按照name=value的形式,添加到action 所指向的URL 后面,并且兩者使用"?"連接,而各個變量之間使用"&"連接;post是將表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;
③get傳輸的數據要受到URL長度限制(1024字節);而post可以傳輸大量的數據,上傳文件通常要使用post方式;
④使用get時參數會顯示在地址欄上,如果這些數據不是敏感數據,那么可以使用get;對于敏感數據還是應用使用post;
⑤get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規范的文本組成,例如一個空格的編碼是"%20"。
1.重定向訪問服務器兩次,轉發只訪問服務器一次。
2.轉發頁面的URL不會改變,而重定向地址會改變
3.轉發只能轉發到自己的web應用內,重定向可以重定義到任意資源路徑。
4.轉發相當于服務器跳轉,相當于方法調用,在執行當前文件的過程中轉向執行目標文件,兩個文件(當前文件和目標文件)屬于同一次請求,前后頁 共用一個request,可以通過此來傳遞一些數據或者session信息,request.setAttribute()和 request.getAttribute()。而重定向會產生一個新的request,不能共享request域信息與請求參數。
5.由于轉發相當于服務器內部方法調用,所以轉發后面的代碼仍然會執行(轉發之后記得return);重定向代碼執行之后是方法執行完成之后進行重定向操作,也就是訪問第二個請求,如果是方法的最后一行進行重定向那就會馬上進行重定向(重定向也需要return)。
6.無論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中移除。
可以這么理解:轉發相當于,張三向你借錢,但是你兜里沒錢,所以你去找李四借到錢之后借給張三。對于張三而言并不知道你的錢是和李四借的;重定向相當于,張三向你借錢,你兜里沒錢,你告訴他李四有錢,所以張三再次去找李四借錢。
request:封裝客戶端的請求,其中包含來自GET或POST請求的參數;
response:封裝服務器對客戶端的響應;
pageContext:通過該對象可以獲取其他對象;
session:封裝用戶會話的對象;
application:封裝服務器運行環境的對象;
out:輸出服務器響應的輸出流對象;
config:Web應用的配置對象;
page:JSP頁面本身(相當于Java程序中的this);
exception:封裝頁面拋出異常的對象。
JSP中的四種作用域包括page、request、session和application,具體來說:
page代表與一個頁面相關的對象和屬性。
request代表與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時數據可以置于此作用域。
session代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的session中。
application代表與整個Web應用程序相關的對象和屬性,它實質上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局作用域。
靜態包含是通過JSP的include指令包含頁面,動態包含是通過JSP標準動作<jsp:forward>包含頁面。靜態包含是編譯時包含,如果包含的頁面不存在則會產生編譯錯誤,而且兩個頁面的"contentType"屬性應保持一致,因為兩個頁面會合二為一,只產生一個class文件,因此被包含頁面發生的變動再包含它的頁面更新前不會得到更新。動態包含是運行時包含,可以向被包含的頁面傳遞參數,包含頁面和被包含頁面是獨立的,會編譯出兩個class文件,如果被包含的頁面不存在,不會產生編譯錯誤,也不影響頁面其他部分的執行。
瀏覽器首先要請求一個以.jsp擴展名結尾的頁面,發起JSP請求,然后,Web服務器讀取這個請求,使用JSP編譯器把JSP頁面轉化成一個Servlet類。需要注意的是,只有當第一次請求頁面或者是JSP文件發生改變的時候JSP文件才會被編譯,然后服務器調用servlet類,處理瀏覽器的請求。一旦請求執行結束,servlet會把響應發送給客戶端。這里看下如何在JSP中獲取請求參數。
1.jsp的本質是Servlet ,jvm只能識別java的類,不能識別jsp的代碼;
2 jsp更擅長表現與頁面顯示,Servlet更擅長與邏輯控制;
3 servlet中沒有內置對象,jsp中有九大內置對象;
過濾器是一個對象,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet/JSP之后對其進行后處理。所以如果你有幾個Servlet/JSP需要執行同樣的數據轉換或頁面處理的話,你就可以寫一個過濾器類,然后在部署描述文件(web.xml)中把該過濾器與對應的Servlet/JSP聯系起來。你可以一個過濾器以作用于一個或一組servlet,零個或多個過濾器能過濾一個或多個servlet。一個過濾器實現java.servlet.Filter接口并定義它的三個方法:
1.void init(FilterConfig config) throws ServletException:在過濾器執行service前被調用,以設置過濾器的配置對象。
2.void destroy();在過濾器執行service后被調用。
3.void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
<c:if>、<c:item>、<c:foreach>、<c:out>、<c:set>