那些年关于JavaWeb的点点滴滴,你想看的这里全都有噢~
JavaWeb知識匯總
- 一、Servlet
- 二、HTTP
- 1. HTTP協(xié)議簡介
- 2.HTTPS
- 三、Request
- 四、Response
- 五、ServletContext
- 六、ServletConfig(了解)
- 七、Cookie和Session
- 1.會話技術(shù)
- 2.Cookie
- 3.Session
- 八、JSP
- 九、 EL &JSTL
- 1. EL表達式
- 2. JSTL
- 十、Filter
- 十一、Listener
- 十二、 MVC和三層架構(gòu)
- 十三、Ajax
- 十四、JSON
- 1.jackson
- 2.Jsonlib
使用PC瀏覽,體驗更加!!!!
一、Servlet
- 概念:servlet是一個在Web服務(wù)器中運行的小型Java程序。主要功能在于交互
式地瀏覽和修改數(shù)據(jù),?成動態(tài)Web內(nèi)容。A servlet is a small Java program that runs within a Web server
- Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規(guī)則。
- 未來我們可以自定義一個類,實現(xiàn)Servlet接口,復(fù)寫方法。
-
快速入門:
-
創(chuàng)建JavaEE項目
-
定義一個類,實現(xiàn)Servlet接口
public class ServletDemo1 implements Servlet -
實現(xiàn)接口中的抽象方法
-
配置Servlet
<!--配置Servlet --><servlet><servlet-name>demo1</servlet-name><!--全類名--><servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class></servlet><servlet-mapping><servlet-name>demo1</servlet-name><!--資源路徑--><url-pattern>/demo1</url-pattern></servlet-mapping>
在web.xml中配置: -
執(zhí)行原理:
1. 當(dāng)服務(wù)器接受到客戶端瀏覽器的請求后,會解析請求URL路徑,獲取訪問的Servlet的資源路徑。 2. 查找web.xml文件,是否有對應(yīng)的<url-pattern>標(biāo)簽體內(nèi)容。 3. 如果有,則在找到對應(yīng)的<servlet-class>全類名。 4. tomcat會將對應(yīng)的Servlet字節(jié)碼文件加載進內(nèi)存,并且創(chuàng)建其對象。 5. 調(diào)用其方法。 -
Servlet生命周期
1. 當(dāng)客戶端?次發(fā)送第?次請求后,由容器(web服務(wù)器(tomcat))去解析請求。 2. 根據(jù)請求找到對應(yīng)的servlet,判斷該類的對象是否存在。 3. 不存在則創(chuàng)建servlet實例,調(diào)取init()?法 進?初始化操作。 4. 初始化完成后調(diào)取service()?法,由service()判斷客戶端的請求?式。 5. 如果是get,則執(zhí)?doGet()。 6. 如果是post則執(zhí)?doPost()。 7. 處理?法完成后,作出相應(yīng)結(jié)果給客戶端.單次請求處理完畢。 8. 當(dāng)服務(wù)器關(guān)閉時調(diào)取destroy()?法進?銷毀對于同一個Servlet,當(dāng)?戶發(fā)送第2~n次請求時,不再執(zhí)?init(),?直接執(zhí)?service()?法,調(diào)取doGet()/doPost()?法。
- Servlet中的生命周期方法1. 被創(chuàng)建:執(zhí)行init()方法,只執(zhí)行一次Servlet什么時候被創(chuàng)建?默認情況下,第一次被訪問時,Servlet被創(chuàng)建。通過web.xml文件,可以配置Servlet的創(chuàng)建時機。在<servlet>標(biāo)簽下配置1. 第一次被訪問時,創(chuàng)建<load-on-startup>的值為負數(shù)。2. 在服務(wù)器啟動時,創(chuàng)建<load-on-startup>的值為0或正整數(shù),正數(shù)情況下,數(shù)值越?,加載該Servlet的優(yōu)先級越?。Servlet的init()方法,只執(zhí)行一次,說明一個Servlet在內(nèi)存中只存在一個對象,Servlet是單例的多個用戶同時訪問時,可能存在線程安全問題。解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值2. 提供服務(wù):執(zhí)行service()方法,執(zhí)行多次每次訪問Servlet時,service()方法都會被調(diào)用一次。3. 被銷毀:執(zhí)行destroy()方法,只執(zhí)行一次Servlet被銷毀時執(zhí)行。服務(wù)器關(guān)閉時,Servlet被銷毀只有服務(wù)器正常關(guān)閉時,才會執(zhí)行destroy()方法。destroy()方法在Servlet被銷毀之前執(zhí)行,一般用于釋放資源* Servlet3.0:好處:支持注解配置。可以不需要web.xml了。步驟:1. 創(chuàng)建JavaEE項目,選擇Servlet的版本3.0以上,可以不創(chuàng)建web.xml2. 定義一個類,實現(xiàn)Servlet接口3. 復(fù)寫方法4. 在類上使用@WebServlet注解,進行配置* @WebServlet("資源路徑")示例:@WebServlet(urlPatterns = {"/test"},initParams ={@WebInitParam(name = "code",value = "utf-8") },loadOnStartup = 1)public class TestServlet extends HttpServlet {}
關(guān)于@WebServlet的注解類如下:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface WebServlet {String name() default "";//相當(dāng)于<Servlet-name>String[] value() default {};//代表urlPatterns()屬性配置String[] urlPatterns() default {};//相當(dāng)于<url-pattern>int loadOnStartup() default -1;//相當(dāng)于<load-on-startup>WebInitParam[] initParams() default {};boolean asyncSupported() default false;String smallIcon() default "";String largeIcon() default "";String description() default "";String displayName() default "";}- Servlet體系結(jié)構(gòu) Servlet -- 接口|GenericServlet -- 抽象類|HttpServlet -- 抽象類* GenericServlet:將Servlet接口中其他的方法做了默認空實現(xiàn),只將service()方法作為抽象* 將來定義Servlet類時,可以繼承GenericServlet,實現(xiàn)service()方法即可* HttpServlet:對service()方法做了詳細的實現(xiàn),不再需要我們寫代碼判斷用戶的請求方式,對http協(xié)議的一種封裝,簡化操作1. 定義類繼承HttpServlet2. 復(fù)寫doGet/doPost方法
- Servlet相關(guān)配置1. urlpartten:Servlet訪問路徑(資源路徑)1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})2. 路徑定義規(guī)則:1. /xxx:路徑匹配2. /xxx/xxx:多層路徑,目錄結(jié)構(gòu)3. *.do:擴展名匹配ps: /user/.do、/.do、test*.do都是非法的,啟動時候會報錯
二、HTTP
1. HTTP協(xié)議簡介
-
概念:超?本傳輸協(xié)議(英?:HyperText Transfer Protocol,縮寫:HTTP)是?種?于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)?層協(xié)議。HTTP是萬維?的數(shù)據(jù)通信的基礎(chǔ)。定義了客戶端和服務(wù)器端通信時,交互報文的格式
-
特點:
1. 基于TCP/IP的高級協(xié)議
2. 默認端口號:80
3. 基于請求/響應(yīng)模型的:一次請求對應(yīng)一次響應(yīng)
4. 在HTTP/1.0中默認使?短連接。也就是說,客戶端和服務(wù)器每進??次HTTP操作,就建??次連接,任務(wù)結(jié)束就中斷連接。
5. 無狀態(tài)協(xié)議:HTTP協(xié)議自身不對請求和響應(yīng)之間的通信狀態(tài)進行保存。每次請求之間相互獨立,不能交互數(shù)據(jù)。
6. HTTP/1.1起,默認使??連接,?以保持連接特性。使??連接的HTTP協(xié)議,會在響應(yīng)頭加?這?
代碼:Connection:keep-alive
在使??連接的情況下,當(dāng)?個??打開完成后,客戶端和服務(wù)器之間?于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使?這?條已經(jīng)建?的連接。Keep-Alive不會永久保持連接,它有?個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間。實現(xiàn)?連接需要客戶端和服務(wù)端都?持?連接。
-
請求消息(報文)格式: 客戶端發(fā)送給服務(wù)器端的數(shù)據(jù)
1. 請求行請求方式 請求url 請求協(xié)議/版本GET http://localhost:8080/thumbupTest/index.jsp HTTP/1.1請求方式:HTTP協(xié)議有7中請求方式,常用的有2種GET:1. 請求參數(shù)在請求行中,在url后。2. 請求的url長度有限制的3. 不太安全POST:1. 請求參數(shù)在請求體中2. 請求的url長度沒有限制的3. 相對安全 2. 請求頭:客戶端瀏覽器告訴服務(wù)器一些信息請求頭名稱: 請求頭值常見的請求頭:1. User-Agent:瀏覽器告訴服務(wù)器,我訪問你使用的瀏覽器版本信息* 可以在服務(wù)器端獲取該頭的信息,解決瀏覽器的兼容性問題2. Referer:http://localhost/login.html告訴服務(wù)器,我(當(dāng)前請求)從哪里來?作用:1. 防盜鏈:通過條件判斷指定從某條URL跳轉(zhuǎn)過來到當(dāng)前頁面才正常顯示2. 統(tǒng)計工作:可以統(tǒng)計從某個URL跳轉(zhuǎn)到當(dāng)前頁面的用戶數(shù) 3. 請求空行空行,就是用于分割POST請求的請求頭,和請求體的。 4. 請求體(正文):封裝POST請求消息的請求參數(shù)的格式: username=zhangsan * 字符串格式(請求頭):POST /login.html HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://localhost/login.htmlConnection: keep-aliveUpgrade-Insecure-Requests: 1 -
響應(yīng)消息(報文)格式: 服務(wù)器端發(fā)送給客戶端的數(shù)據(jù)
數(shù)據(jù)格式: 1. 響應(yīng)行1. 組成:協(xié)議/版本 響應(yīng)狀態(tài)碼 狀態(tài)碼描述示例: HTTP/1.1 200 OK2. 響應(yīng)狀態(tài)碼:服務(wù)器告訴客戶端瀏覽器本次請求和響應(yīng)的一個狀態(tài)。1. 狀態(tài)碼都是3位數(shù)字 2. 分類:1. 1xx:服務(wù)器接收客戶端消息,但沒有接受完成,等待一段時間后,發(fā)送1xx多狀態(tài)碼2. 2xx:成功。代表:2003. 3xx:重定向。代表:302(重定向),304(訪問緩存)4. 4xx:客戶端錯誤。* 代表:* 404(請求路徑?jīng)]有對應(yīng)的資源) * 405:請求方式?jīng)]有對應(yīng)的doXxx方法5. 5xx:服務(wù)器端錯誤。代表:500(服務(wù)器內(nèi)部出現(xiàn)異常) 2. 響應(yīng)頭:1. 格式:頭名稱: 值2. 常見的響應(yīng)頭:1. Content-Type:服務(wù)器告訴客戶端本次響應(yīng)體數(shù)據(jù)格式以及編碼格式2. Content-disposition:服務(wù)器告訴客戶端以什么格式打開響應(yīng)體數(shù)據(jù)* 值:* in-line:默認值,在當(dāng)前頁面內(nèi)打開* attachment;filename=xxx:以附件形式打開響應(yīng)體。文件下載需設(shè)置此響應(yīng)頭 3. 響應(yīng)空行 4. 響應(yīng)體:傳輸?shù)臄?shù)據(jù) 5. * 響應(yīng)字符串格式HTTP/1.1 200 OKContent-Type: text/html;charset=UTF-8Content-Length: 101Date: Wed, 06 Jun 2018 07:08:42 GMT<html><head><title>$Title$</title></head><body>hello , response</body></html> -
常見狀態(tài)碼
狀態(tài)碼狀態(tài)碼描述含義 100 Continue 只有?部分請求被服務(wù)器接收,但只要沒被服務(wù)器拒絕,客戶端就會延續(xù)這個請求 101 Switching Protocols 服務(wù)器交換機協(xié)議 200 OK 請求被確認 201 Created 請求時完整的,新的資源被創(chuàng)建 202 Accepted 請求被接受,但未處理完 300 Multiple Choices ?個超鏈接表,?戶可以選擇?個超鏈接并訪問,最??持5個超鏈接 301 Moved Permanently 被請求的??已經(jīng)移動到了新的URL下 302 Found 被請求的??暫時性地移動到了新的URL下 303 See Other 被請求的??可以在?個不同的URL下找到 400 Bad Request 服務(wù)器?法識別請求 403 Forbidden 禁?訪問所請求的?? 404 Not Found 服務(wù)器?法找到所請求的?? 405 Method Not Allowed 請求中所指定的?法不被允許 500 Internal Server Error 請求不完整,服務(wù)器遇?了出乎意料的狀況 501 Not Implemented 請求不完整,服務(wù)器不提供所需要的功能 502 Bad Gateway 請求不完整,服務(wù)器從上游服務(wù)器接受了?個?效的響應(yīng) 503 Service Unavailable 請求不完整,服務(wù)器暫時重啟或關(guān)閉 504 Gateway Timeout ?關(guān)超時 505 HTTP Version Not Supported 服務(wù)器不?持所指定的HTTP版本
2.HTTPS
HTTPS (全稱:Hyper Text Transfer Protocol over SecureSocket Layer), 是以安全為目標(biāo)的 HTTP 通道,在HTTP的基礎(chǔ)上通過傳輸加密和身份認證保證了傳輸過程的安全性 。 HTTPS 在HTTP 的基礎(chǔ)下加入SSL,HTTPS 的安全基礎(chǔ)是SSL,因此加密的詳細內(nèi)容就需要SSL。 HTTPS 存在不同于 HTTP 的默認端口及一個加密/身份驗證層(在 HTTP與 TCP 之間)。 這個系統(tǒng)提供了身份驗證與加密通訊方法。 它被廣泛用于萬維網(wǎng)上安全敏感的通訊,例如交易支付等方面。- 詳情請看 HTTPS
三、Request
-
Request對象和Response對象的原理
1.客戶端發(fā)送請求后,Tomcat服務(wù)器會根據(jù)請求URL中的資源路徑(Servlet訪問路徑),創(chuàng)建對應(yīng)的Servlet對象。
2. Tomcat服務(wù)器,會創(chuàng)建request和response對象,并將請求消息(請求報文)數(shù)據(jù)封裝到request對象中。
3. Tomcat將request和response兩個對象傳遞給service()方法,并且調(diào)用service()方法。
4. 后續(xù),程序員可以通過request對象獲取請求消息數(shù)據(jù),通過response對象設(shè)置響應(yīng)消息(響應(yīng)報文)數(shù)據(jù)。
5. 服務(wù)器給瀏覽器作出響應(yīng)之前會從response對象中獲取程序員設(shè)置的響應(yīng)消息數(shù)據(jù)。 -
Request對象繼承體系結(jié)構(gòu)
ServletRequest -- 接口| 繼承 HttpServletRequest -- 接口| 實現(xiàn) org.apache.catalina.connector.RequestFacade 類(tomcat)public class RequestFacade implements HttpServletRequest -
Request功能
1. 獲取請求消息(報文)數(shù)據(jù)1. 獲取請求行數(shù)據(jù)* GET http://localhost:8080/day14/demo1?name=zhangsan HTTP/1.1* 方法:1. 獲取請求方式 :GET* String getMethod() 2. (*)獲取虛擬目錄:/day14* String getContextPath()3. 獲取Servlet路徑: /demo1* String getServletPath()4. 獲取get方式請求參數(shù):name=zhangsan* String getQueryString()5. (*)獲取請求URI:/day14/demo1* String getRequestURI(): /day14/demo1* StringBuffer getRequestURL() :http://localhost/day14/demo1* URL:統(tǒng)一資源定位符 : http://localhost/day14/demo1 例如:中華人民共和國* URI:統(tǒng)一資源標(biāo)識符 : /day14/demo1 例如:共和國6. 獲取協(xié)議及版本:HTTP/1.1* String getProtocol()7. 獲取客戶機的IP地址:* String getRemoteAddr() // 0:0:0:0:0:0:0:12. 獲取請求頭數(shù)據(jù)* 方法:* (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值* Enumeration<String> getHeaderNames():獲取所有的請求頭名稱3. 獲取請求體(正文)數(shù)據(jù):* 請求體:只有POST請求方式,才有請求體,在請求體(正文)中封裝了POST請求的請求參數(shù)* 步驟:1. 獲取流對象* BufferedReader getReader():獲取字符輸入流,只能操作字符數(shù)據(jù)* ServletInputStream getInputStream():獲取字節(jié)輸入流,可以操作所有類型數(shù)據(jù)2. 再從流對象中拿數(shù)據(jù) 2. 其他功能:1. 獲取請求參數(shù)通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數(shù)1. String getParameter(String name):根據(jù)參數(shù)名稱獲取參數(shù)值 username=zs&password=1232. String[] getParameterValues(String name):根據(jù)參數(shù)名稱獲取參數(shù)值的數(shù)組 hobby=xx&hobby=game3. Enumeration<String> getParameterNames():獲取所有請求的參數(shù)名稱4. Map<String,String[]> getParameterMap():獲取所有參數(shù)的map集合* 中文亂碼問題:* get方式:tomcat 8 已經(jīng)將get方式亂碼問題解決了* Tomcat 8以前:?式1: //針對于get提交時中?亂碼String s=new String(請求參數(shù).getBytes("ISO-8859-1"),"UTF-8");示例: String s=new String(request.getParameter("key").getBytes("ISO-8859-1"),"GBK");?式2:修改tomcat中配置?件://使?于get提交在Tomcat?錄結(jié)構(gòu)\conf\server.xml中設(shè)置字符集 URLEncoding<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />* post方式:會亂碼* 解決:在獲取參數(shù)前,設(shè)置request的編碼request.setCharacterEncoding("utf-8");2. 請求轉(zhuǎn)發(fā):一種在服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式1. 步驟:1. 通過request對象獲取請求轉(zhuǎn)發(fā)器對象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher對象來進行轉(zhuǎn)發(fā):forward(ServletRequest request, ServletResponse response) 2. 特點:1. 瀏覽器地址欄路徑不發(fā)生變化2. 只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源中。3. 轉(zhuǎn)發(fā)是一次請求,可以使用request對象來共享數(shù)據(jù)3. 共享數(shù)據(jù):* 域?qū)ο?#xff1a;一個有作用范圍的對象,可以在范圍內(nèi)共享數(shù)據(jù)* request域:代表一次請求的范圍,一般用于請求轉(zhuǎn)發(fā)的多個資源中共享數(shù)據(jù)* 方法:1. void setAttribute(String name,Object obj):存儲數(shù)據(jù)2. Object getAttitude(String name):通過鍵獲取值3. void removeAttribute(String name):通過鍵移除鍵值對4. 獲取ServletContext:* ServletContext getServletContext() -
GET和POST的區(qū)別
1、GET請求:請求的數(shù)據(jù)會附加在URL之后,以?分割URL和傳輸數(shù)據(jù),多個參數(shù)?&連接。URL的編碼格式采?的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸。POST請求:請求的數(shù)據(jù)放在請求消息(報文)的請求體(正文)中。因此,GET請求的數(shù)據(jù)會暴露在地址欄中,?POST請求則不會。 2、傳輸數(shù)據(jù)的大小在HTTP規(guī)范中,沒有對URL的?度和傳輸?shù)臄?shù)據(jù)??進?限制。但是在實際開發(fā)過程中,對于GET,特定的瀏覽器和服務(wù)器對URL的?度有限制。因此,在使?GET請求時,傳輸數(shù)據(jù)會受到URL?度的限制。對于POST,由于不是URL傳值,理論上是不會受限制的,但是實際上各個服務(wù)器會規(guī)定對POST提交數(shù)據(jù)??進?限制,Apache、IIS都有各?的配置。 3、安全性POST的安全性比GET的相對較?。
四、Response
-
功能: 設(shè)置響應(yīng)消息
1. 設(shè)置響應(yīng)行1. 格式:HTTP/1.1 200 ok2. 設(shè)置狀態(tài)碼:setStatus(int sc) 2. 設(shè)置響應(yīng)頭:setHeader(String name, String value) 添加響應(yīng)頭:void addHeader(String name, String value) //兩者作用一致 3. 設(shè)置響應(yīng)體:* 使用步驟:1. 獲取輸出流* 字符輸出流:PrintWriter getWriter()* 字節(jié)輸出流:ServletOutputStream getOutputStream()2. 使用輸出流,將數(shù)據(jù)輸出到客戶端瀏覽器 -
案例
1. 完成重定向* 重定向:資源跳轉(zhuǎn)的方式* 代碼實現(xiàn)://1. 設(shè)置狀態(tài)碼為302response.setStatus(302);//2.設(shè)置響應(yīng)頭locationresponse.setHeader("location","/day15/responseDemo2");//簡單的重定向方法response.sendRedirect("/day15/responseDemo2");* forward 和 redirect 區(qū)別* 重定向的特點:redirect1. 地址欄發(fā)生變化2. 重定向可以訪問其他站點(服務(wù)器)的資源3. 重定向是兩次請求。不能使用request對象來共享數(shù)據(jù)* 轉(zhuǎn)發(fā)的特點:forward1. 轉(zhuǎn)發(fā)地址欄路徑不變2. 轉(zhuǎn)發(fā)只能訪問當(dāng)前服務(wù)器下的資源3. 轉(zhuǎn)發(fā)是一次請求,可以使用request對象來共享數(shù)據(jù)2. 服務(wù)器輸出字符數(shù)據(jù)到瀏覽器* 步驟:1. 獲取字符輸出流2. 輸出數(shù)據(jù)* 注意:* 亂碼問題:1. PrintWriter pw = response.getWriter();獲取的流的默認編碼是ISO-8859-12. 設(shè)置該流的默認編碼 response.setHeader("content-type","text/htm;charset=utf-8")告訴瀏覽器響應(yīng)體所使用的編碼//簡單的形式,設(shè)置編碼,是在獲取流之前設(shè)置response.setContentType("text/html;charset=utf-8");3. 服務(wù)器輸出字節(jié)數(shù)據(jù)到瀏覽器* 步驟:1. 獲取字節(jié)輸出流 ServletOutputStream getOutputStream()2. 輸出數(shù)據(jù) -
路徑寫法
1. 路徑分類1. 相對路徑:通過相對路徑不可以確定唯一資源* 如:./index.html 或者 servletDemo1* 不以/開頭、以.開頭路徑* 規(guī)則:找到當(dāng)前資源和目標(biāo)資源之間的相對位置關(guān)系* ./:當(dāng)前目錄* ../:后退一級目錄2. 絕對路徑:通過絕對路徑可以確定唯一資源* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2* 以/開頭的路徑* 規(guī)則:判斷定義的路徑是給誰用的?判斷請求將來從哪兒發(fā)出* 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)* 建議虛擬目錄動態(tài)獲取:request.getContextPath()*如 <a> , <form> 標(biāo)簽重定向到某個頁面* 給服務(wù)器使用:不需要加虛擬目錄,使用相對路徑即可* 轉(zhuǎn)發(fā)路徑
五、ServletContext
request.getServletContext();
this.getServletContext();
-
MIME類型:在互聯(lián)網(wǎng)通信過程中定義的一種文件數(shù)據(jù)類型
- 格式: 大類型/小類型 text/html image/jpeg
-
獲取:String getMimeType(String file)
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
// ServletContext對象范圍:所有用戶所有請求的數(shù)據(jù)
方法:String getRealPath(String path)
String b = context.getRealPath("/b.txt");//web目錄下資源訪問
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目錄下的資源訪問
System.out.println(c );
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目錄下的資源訪問
System.out.println(a);
六、ServletConfig(了解)
- 概述
ServletConfig是用來獲得Servlet相關(guān)的配置的對象
- 獲取
通過當(dāng)前Servlet實例來獲取
ServletConfig config = this.getServletConfig(); - 功能
- 獲取ServletContext對象
* ServletContext getServletContext(); - 獲取當(dāng)前Servlet的初始化參數(shù)
* String getInitParameter(String name) - 獲取當(dāng)前Servlet的所有初始化參數(shù)的名稱
* Enumeration getInitParameterNames() - 獲取當(dāng)前Servlet實例的名稱
* String getServletName() - Servlet初始化參數(shù)
針對某個Servlet的初始化參數(shù)
實現(xiàn)?式: (1) web.xml中先定義初始化參數(shù)<servlet><servlet-name></servlet-name><servlet-class></servlet-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></servlet> (2) 注解方式實現(xiàn) initParams@WebServlet(urlPatterns = {"/test"},initParams ={@WebInitParam(name = "code",value = "utf-8") })public class TestServlet extends HttpServlet {}*獲取: String encode = this.getServletConfig().getInitParameter("encoding");2.對于當(dāng)前web程序中所有的Servlet都有效的初始化參數(shù)
(1)定義<context-param><param-name>forAll</param-name><param-value>utf-8</param-value></context-param> (2)獲取 this.getServletConfig().getServletContext().getInitParameter("forAll");七、Cookie和Session
1.會話技術(shù)
一次會話:瀏覽器第一次給服務(wù)器資源發(fā)送請求,會話建立,直到有一方斷開為止
2.Cookie
-
概念
Cookie是客戶端(?般指瀏覽器)請求服務(wù)器后,服務(wù)器發(fā)給客戶端的?個辨認標(biāo)識,保存在客戶端,當(dāng)客戶端再次向服務(wù)器發(fā)送請求時,會攜帶著這個辨認標(biāo)識,服務(wù)器就可以通過這個標(biāo)識來識別客戶端的身份或狀態(tài)等。 -
Cookie的設(shè)置和獲取
- 使用步驟:
1. 創(chuàng)建Cookie對象,綁定數(shù)據(jù)
* new Cookie(String name, String value)
2. 發(fā)送Cookie對象
* response.addCookie(Cookie cookie)
3. 獲取Cookie,拿到數(shù)據(jù)
* Cookie[] request.getCookies()
*
* 示例:
* Cookie[] cs = request.getCookies();
* // 通過遍歷獲取各個cookie的值
for (Cookie c : cs) {
String name = c.getName(); //獲取cookie的名稱
String value = c.getValue();//獲取cookie的值
}
- 使用步驟:
-
實現(xiàn)原理
- 基于響應(yīng)頭set-cookie和請求頭cookie實現(xiàn)。
- 細節(jié)
* 可以
* 可以創(chuàng)建多個Cookie對象,使用response調(diào)用多次addCookie方法發(fā)送cookie即可。
1. 默認情況下,當(dāng)瀏覽器關(guān)閉后,Cookie數(shù)據(jù)被銷毀
2. 持久化存儲:
* setMaxAge(int seconds)
(1)正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲。并指定cookie存活時間,時間到后,cookie文件自動失效
(2)負數(shù):默認值
(3)零:刪除cookie信息
* 在tomcat 8 之前 cookie中不能直接存儲中文數(shù)據(jù)。
* 需要將中文數(shù)據(jù)轉(zhuǎn)碼—一般采用URL編碼(%E3)
* 在tomcat 8 之后,cookie支持中文數(shù)據(jù)。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
1. 假設(shè)在一個tomcat服務(wù)器中,部署了多個web項目,那么在這些web項目中cookie能不能共享?
* 默認情況下cookie不能共享。
* setPath(String path):設(shè)置cookie的獲取范圍。默認情況下,被設(shè)置為當(dāng)前的虛擬目錄
* 如果要共享,則可以將path設(shè)置為"/"
~
2. 不同的tomcat服務(wù)器間cookie共享問題?
? * setDomain(String path):如果設(shè)置一級域名相同,那么多個服務(wù)器之間cookie可以共享
? * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享。
* 特點
1. cookie存儲數(shù)據(jù)在客戶端瀏覽器
2. 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數(shù)量也有限制,不同瀏覽器對于cookie的數(shù)量限制不同。
* 作用:
1. cookie一般用于存出少量的不太敏感的數(shù)據(jù)
2. 在不登錄的情況下,完成服務(wù)器對客戶端的身份識別
3.Session
概念:服務(wù)器端會話技術(shù),在一次會話的多次請求間共享數(shù)據(jù),將數(shù)據(jù)保存在服務(wù)器端的對象中。HttpSession
快速入門:
HttpSession session = request.getSession();
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理
- Session的實現(xiàn)是依賴于Cookie的。
- 第一次獲取Session,沒有Cookie,服務(wù)器會在內(nèi)存中創(chuàng)建一個新的Session對象,假設(shè)其對應(yīng)的Id屬性值為 ID = 742938a4289。
- 服務(wù)器會自動設(shè)置響應(yīng)頭set-cookie:JSESSIONID= 742938a4289響應(yīng)消息給瀏覽器。
- 瀏覽器解析set-cookie響應(yīng)頭,將JSESSIONID=742938a4289存入Cookie請求頭。
- 后續(xù)服務(wù)器再次創(chuàng)建Session對象時會根據(jù)請求頭Cookie中的JSESSIONID先在內(nèi)存中尋找對應(yīng)的session實例,然后返回其引用。
細節(jié):
? 1. 當(dāng)客戶端關(guān)閉后,服務(wù)器不關(guān)閉,兩次獲取session是否為同一個?
? * 默認情況下。不是。
? * 如果需要相同,則可以創(chuàng)建Cookie,鍵為JSESSIONID,設(shè)置最大存活時間,讓 cookie持久化保存。
? Cookie c = new Cookie(“JSESSIONID”,session.getId());
? c.setMaxAge(60*60); //單位:秒
? response.addCookie(c );
?
session什么時候被銷毀?
1. 本地服務(wù)器正常關(guān)閉后不會被銷毀,idea上配置的tomcat服務(wù)器關(guān)閉后會被銷毀
2. session對象調(diào)用invalidate() 。
3. session默認失效時間 30分鐘
* Session的超時時間為maxInactiveInterval屬性,可以通過對應(yīng)的 getMaxInactiveInterval()獲取,通過 setMaxInactiveInterval(longinterval)修改
* 還可以在config目錄下的web.xml中選擇性配置修改
4.瀏覽器中含有JSESSIONID的cookie被銷毀時,服務(wù)器會重新創(chuàng)建一個新的session對象,原有的session對象會在失效時間過后被銷毀。
session的特點
什么時候創(chuàng)建Session?
1.Session在?戶第?次訪問page指令中的session屬性值不為false的JSP頁面時被創(chuàng)建。
2.若servelt是第瀏覽器客戶端訪問的第一個WEB應(yīng)用的資源,則只有調(diào)用了request.getSession()或request.getSession(true)才會創(chuàng)建session對象。
其中request.getSession(boolean),
boolean為false時,若沒有和當(dāng)前JSP頁面關(guān)聯(lián)的session對象則返回null,若有,則返回true。
Boolean為true時,一定返回一個session對象,若沒有和當(dāng)前JSP頁面關(guān)聯(lián)的session對象,則服務(wù)器創(chuàng)建一個新的session對象,若有,直接返回。
request.getSession()等同于request.getSession(true)。
- session與Cookie的區(qū)別:
1. session存儲數(shù)據(jù)在服務(wù)器端,Cookie在客戶端。
2. session沒有數(shù)據(jù)大小限制,Cookie有,一般為4KB。
3. session數(shù)據(jù)安全,Cookie相對于不安全。
4. Session是由應(yīng)?服務(wù)器維持的?個服務(wù)器端的存儲空間,?戶在連接服務(wù)器時,會由服務(wù)器?成?個唯?的SessionID,?該SessionID 為標(biāo)識符來存取服務(wù)器端的Session存儲空間。?SessionID這?數(shù)據(jù)則是保存到客戶端,?Cookie保存的,?戶提交??時,會將這?SessionID提交到服務(wù)器端,來存取Session數(shù)據(jù)。這?過程,是不?開發(fā)?員?預(yù)的。所以?旦客戶端禁?Cookie,那么Session也會失效。
八、JSP
1. 概念:
* Java Server Pages: java服務(wù)器端頁面
* 可以理解為:一個特殊的頁面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼
* 用于簡化書寫!!!
2. 原理
* JSP本質(zhì)上就是一個Servlet,當(dāng)瀏覽器訪問http://localhost:8080/day9_1/index.jsp。服務(wù)器發(fā)現(xiàn)后綴為.jsp,它會根據(jù)路徑找到index.jsp?件,會將index.jsp翻譯成index_jsp.java?件,對這個java?件進?編譯,產(chǎn)??個index_jsp.class?件,將class?件加載運?。將JSP翻譯成java?件,它是將JSP中的所有的HTML代碼通過流進?輸出,也就是說最終翻譯成class,被虛擬機加載,它本質(zhì)是servlet,它就會往回響應(yīng),響應(yīng)回去就是把JSP中的HTML代碼以流的?式寫回瀏覽器。所以在JSP中展示出了HTML代碼。
3. JSP指令
-
作用:用于配置JSP頁面,導(dǎo)入資源文件
- 格式:
<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 … %>
- 格式:
-
分類:
1. page :- contentType: 配置JSP頁面的 contentType屬性:等同于response.setContentType()
- 設(shè)置響應(yīng)體的mime類型以及字符集
- 設(shè)置當(dāng)前jsp頁面的編碼(只能是高級的IDE才能生效,如果使用低級工具,則需要設(shè)置pageEncoding屬性設(shè)置當(dāng)前頁面的字符集)
- import:導(dǎo)包
- errorPage:當(dāng)前頁面發(fā)生異常后,會自動跳轉(zhuǎn)到指定的錯誤頁面
- isErrorPage:標(biāo)識當(dāng)前也是是否是錯誤頁面。
- true:是,可以使用內(nèi)置對象exception <% String message = exception.getMessage(); %>
- false:否。默認值。不可以使用內(nèi)置對象exception
page 指令相關(guān)屬性:
include : JSP可以通過include指令來包含其他?件。被包含的?件可以是JSP?件、HTML?件或?本?件。包含的?件就好像是該JSP?件的?部分,會被同時編譯執(zhí)?。
<%@ include file=“?件相對 url 地址” %>
taglib : 導(dǎo)入資源(引入jsp標(biāo)簽庫)
- <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- prefix:前綴,自定義的
注釋:
4. JSP的腳本: JSP定義Java代碼的方式
1. <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什么,該腳本中就可以定義什么。
2. <%! 代碼 %>:定義的java代碼,在jsp轉(zhuǎn)換后的java類的成員位置。
3. <%= 代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中可以定義什么,該腳本中就可以定義什么。
5. JSP的內(nèi)置對象:
* 在jsp頁面中不需要獲取和創(chuàng)建,可以直接使用的對象
* jsp一共有9個內(nèi)置對象。
| pageContext | PageContext | 當(dāng)前頁面共享數(shù)據(jù),還可以獲取其他八個內(nèi)置對象 |
| request | HttpServletRequest | 一次請求訪問的多個資源(轉(zhuǎn)發(fā))間共享數(shù)據(jù)。 |
| session | HttpSession | 一次會話的多個請求間共享數(shù)據(jù) |
| application | ServletContext | 所有用戶間共享數(shù)據(jù) |
| response | HttpServletResponse | response 代表的是對客戶端的響應(yīng),主要是將JSP容器處理過的對象傳回到客戶端。只在JSP??內(nèi)有效。 |
| page | Object | 當(dāng)前頁面(Servlet)的對象,類似于this |
| out | JspWriter | 輸出對象,數(shù)據(jù)輸出到頁面上 |
| config | ServletConfig | 主要作?是取得服務(wù)器的配置信息。通過 pageConext對象的 getServletConfig() ?法可以獲取?個config對象。當(dāng)?個Servlet 初始化時,容器把某些信息通過config對象傳遞給這個Servlet。 開發(fā)者可以在web.xml ?件中為應(yīng)?程序環(huán)境中的Servlet程序和JSP??提供初始化參數(shù)。 |
| exception | Throwable | exception 對象的作?是顯示異常信息,只有在包含 isErrorPage=“true” 的??中才可以被使?,通常用于打印錯誤信息輸出到日志文件,exception.getMessage() |
- out:字符輸出流對象。可以將數(shù)據(jù)輸出到頁面上。和response.getWriter()類似
* response.getWriter()和out.write()的區(qū)別:
* 在tomcat服務(wù)器真正給客戶端做出響應(yīng)之前,會先找response緩沖區(qū)數(shù)據(jù),再找out緩沖區(qū)數(shù)據(jù)。
* response.getWriter()數(shù)據(jù)輸出永遠在out.write()之前。
九、 EL &JSTL
1. EL表達式
- jsp默認支持el表達式的。如果要忽略el表達式
- 設(shè)置jsp中page指令中:isELIgnored=“true” 忽略當(dāng)前jsp頁面中所有的el表達式
- ${表達式} :忽略當(dāng)前這個el表達式
- 運算符:
- 算數(shù)運算符: + - * /(div) %(mod)
${30 + 40}
${20 div 5} - 比較運算符: > < >= <= == !=
- 邏輯運算符: &&(and) ||(or) !(not)
- 空運算符: empty
- 功能:用于判斷字符串、集合、數(shù)組對象是否為null或者長度是否為0
- ${empty list}:判斷字符串、集合、數(shù)組對象是否為null或者長度為0
- ${not empty str}:表示判斷字符串、集合、數(shù)組對象是否不為null 并且 長度>0
${域名稱.鍵名}:從指定域中獲取指定鍵的值
- 域名稱:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
${鍵名}:表示依次從最小的域中查找是否有該鍵對應(yīng)的值,直到找到為止。
獲取對象、List集合、Map集合的值
對象:${域名稱.鍵名.屬性名}
- 本質(zhì)上會去調(diào)用對象的getter方法
List集合:${域名稱.鍵名[索引]}
- 索引越界會返回空字符
Map集合:
- ${域名稱.鍵名.key名稱}
- ${域名稱.鍵名[“key名稱”]}
* el表達式中有11個隱式對象
* pageScope
* requestScope
* sessionScope
* applicationScope
* pageContext:
* 獲取jsp其他八個內(nèi)置對象
* ${pageContext.request.contextPath}:動態(tài)獲取虛擬目錄
2. JSTL
(1) 什么是JSTL
JSP標(biāo)準(zhǔn)標(biāo)簽庫(JSTL)是?個JSP標(biāo)簽集合,它封裝了JSP應(yīng)?的通?核?功能。
JSTL?持通?的、結(jié)構(gòu)化的任務(wù),?如迭代,條件判斷,XML?檔操作,國際化標(biāo)簽,SQL標(biāo)簽。 除了這些,它還提供了?個框架來使?集成JSTL的?定義標(biāo)簽。
根據(jù)JSTL標(biāo)簽所提供的功能,可以將其分為5個類別。核?標(biāo)簽 格式化標(biāo)簽 sql標(biāo)簽 xml標(biāo)簽 jstl函數(shù)(后?詳細解釋)
(2) JSTL的作?和語法格式
作?:用于簡化和替換jsp頁面上的java代碼
語法格式:
下載 jakarta-taglibs-standard-1.1.2.zip 包并解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩
個 jar ?件:standard.jar 和 jstl.jar ?件拷?到 /WEB-INF/lib/ 下。
在JSP??中引?<%@ taglib prefix=”??使?的名稱” uri=”功能范圍的路徑”%>
常用的JSTL標(biāo)簽
- 核?標(biāo)簽
核?標(biāo)簽是最常?的 JSTL標(biāo)簽。引?核?標(biāo)簽庫的語法如下:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> -
if:相當(dāng)于java代碼的if語句
- 屬性:
- test 必須屬性,接受boolean表達式
- 如果表達式為true,則顯示if標(biāo)簽體內(nèi)容,如果為false,則不顯示標(biāo)簽體內(nèi)容
- 一般情況下,test屬性值會結(jié)合el表達式一起使用
- test 必須屬性,接受boolean表達式
- 注意:
- c:if標(biāo)簽沒有else情況,想要else情況,則可以再定義一個c:if標(biāo)簽
choose:相當(dāng)于java代碼的switch語句
foreach:相當(dāng)于java代碼的for語句
代碼案例:
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html> <head><title>if標(biāo)簽</title> </head> <body><%--c:if標(biāo)簽1. 屬性:* test 必須屬性,接受boolean表達式* 如果表達式為true,則顯示if標(biāo)簽體內(nèi)容,如果為false,則不顯示標(biāo)簽體內(nèi)容* 一般情況下,test屬性值會結(jié)合el表達式一起使用2. 注意:c:if標(biāo)簽沒有else情況,想要else情況,則可以在定義一個c:if標(biāo)簽--%><c:if test="true"><h1>我是真...</h1></c:if><br><%//判斷request域中的一個list集合是否為空,如果不為null則顯示遍歷集合List list = new ArrayList();list.add("aaaa");request.setAttribute("list",list);request.setAttribute("number",4);%><c:if test="${not empty list}">遍歷集合...</c:if><br><c:if test="${number % 2 != 0}">${number}為奇數(shù)</c:if><c:if test="${number % 2 == 0}">${number}為偶數(shù)</c:if></body> </html>
代碼案例:
代碼案例:
1、fmt:formatDate 作?:將?期類型格式化為指定模式的字符串
屬性
value:將要被格式化的數(shù)據(jù)
pattern:格式化的模式,與SimpleDateFormat的參數(shù)設(shè)置?樣
var:格式化后的字符串所要存放的變量,若不指定var,則會將格式化的結(jié)果直接顯示在??
scope:變量存放的域?qū)傩钥臻g,默認page
type:其取值為date、time、both,表示給出的value是?期、時間、還是兩者都包含,默認是date
代碼案例:
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head><title>Title</title> </head> <body><%pageContext.setAttribute("mytime",new Date());%>date=<fmt:formatDate value="${mytime}" pattern="yyyy-MM-dd"></fmt:formatDate> </body> </html>十、Filter
概念:
- 生活中的過濾器:凈水器,空氣凈化器,土匪、
- web中的過濾器:當(dāng)訪問服務(wù)器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
- 過濾器的作用:
- 一般用于完成通用的操作。如:登錄驗證、統(tǒng)一編碼處理、敏感字符過濾…
快速入門:
過濾器細節(jié):
web.xml配置
demo1
cn.itcast.web.filter.FilterDemo1
demo1
/*
過濾器執(zhí)行流程
過濾器生命周期方法
過濾器配置詳解
- 攔截路徑配置:
- 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執(zhí)行
- 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會被執(zhí)行
- 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時,過濾器都會被執(zhí)行
- 攔截所有資源:/* 訪問所有資源時,過濾器都會被執(zhí)行
- 注解配置:
- 設(shè)置dispatcherTypes屬性
- REQUEST:默認值。瀏覽器直接請求資源
- FORWARD:轉(zhuǎn)發(fā)訪問資源
- INCLUDE:包含訪問資源
- ERROR:錯誤跳轉(zhuǎn)資源
- ASYNC:異步訪問資源
//瀏覽器直接請求index.jsp資源時,該過濾器會被執(zhí)行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有轉(zhuǎn)發(fā)訪問index.jsp時,該過濾器才會被執(zhí)行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//瀏覽器直接請求index.jsp或者轉(zhuǎn)發(fā)訪問index.jsp。該過濾器才會被執(zhí)行
//@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})
過濾器鏈(配置多個過濾器)
-
執(zhí)行順序:如果有兩個過濾器:過濾器1和過濾器2
- 過濾器1
- 過濾器2
- 資源執(zhí)行
- 過濾器2
- 過濾器1
過濾器先后順序問題:
- 如: AFilter 和 BFilter,AFilter就先執(zhí)行了。
- 使?場景
1.如何防??戶未登錄就執(zhí)?后續(xù)操作
String name=(String)session.getAttribute(“key”);
if(name==null){
//跳轉(zhuǎn)到登錄??
}
2.設(shè)置編碼?式–統(tǒng)?設(shè)置編碼
3.加密解密(密碼的加密和解密)
4.?法?字篩選
5.下載資源的限制
過濾器的特點:在servlet之前和之后都會被執(zhí)?
十一、Listener
1.什么是監(jiān)聽器
監(jiān)聽器就是監(jiān)聽某個域?qū)ο蟮牡臓顟B(tài)變化的組件
監(jiān)聽器的相關(guān)概念:
事件源:被監(jiān)聽的對象(三個域?qū)ο?request、session、servletContext)
監(jiān)聽器:監(jiān)聽事件源對象事件源對象的狀態(tài)的變化都會觸發(fā)監(jiān)聽器
注冊監(jiān)聽器:將監(jiān)聽器與事件源、事件進?綁定。事件源上發(fā)生某個事件后,執(zhí)行監(jiān)聽器代碼
響應(yīng)?為:監(jiān)聽器監(jiān)聽到事件源的狀態(tài)變化時所涉及的功能代碼(程序員編寫代碼)
- ServletContextListener:監(jiān)聽ServletContext對象的創(chuàng)建和銷毀
- 方法:
- void contextDestroyed(ServletContextEvent sce) :ServletContext對象被銷毀之前會調(diào)用該方法
- void contextInitialized(ServletContextEvent sce) :ServletContext對象創(chuàng)建后會調(diào)用該方法
- 步驟:
- 定義一個類,實現(xiàn)ServletContextListener接口
- 復(fù)寫方法
- 配置1. web.xml<listener><!-- 監(jiān)聽器所在的路徑 --><listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class></listener>2. 注解:* @WebListener
- 方法:
2.監(jiān)聽器分類
3.監(jiān)聽三?域?qū)ο蟮膭?chuàng)建與銷毀的監(jiān)聽器
- ServletContextListener
監(jiān)聽ServletContext域的創(chuàng)建與銷毀的監(jiān)聽器
Servlet域的?命周期
何時創(chuàng)建:服務(wù)器啟動創(chuàng)建
何時銷毀:服務(wù)器關(guān)閉銷毀
ServletContextListener監(jiān)聽器的主要作?
初始化的?作:初始化對象、初始化數(shù)據(jù)(加載數(shù)據(jù)庫驅(qū)動、連接池的初始化)
加載?些初始化的配置?件(spring的配置?件)
任務(wù)調(diào)度(定時器—Timer/TimerTask) - HttpSessionListener
監(jiān)聽Httpsession域的創(chuàng)建和銷毀的監(jiān)聽器
HttpSession對象的?命周期
何時創(chuàng)建:第?次調(diào)?request.getSession時創(chuàng)建
何時銷毀:服務(wù)器關(guān)閉銷毀、session過期(默認30分鐘,修改默認的30分鐘是在
Tomcat的web.xml,修改當(dāng)前項?的過期時間是在??項?的web.xml中)、?動銷毀
HttpSessionListener監(jiān)聽器的主要作?:
由于每次訪問?站都會默認創(chuàng)建session對象(jsp??中page指令中的session屬性默認為
true,即被訪問時創(chuàng)建session),可以?于計數(shù)?站訪問過的? - ServletRequestListener
監(jiān)聽ServletRequest域創(chuàng)建與銷毀的監(jiān)聽器
ServletRequest的?命周期
創(chuàng)建:每?次請求都會創(chuàng)建request
銷毀:請求結(jié)束
?法同上,?處不是很?,此處省略。
十二、 MVC和三層架構(gòu)
1.MVC設(shè)計模式
- 完成具體的業(yè)務(wù)操作,如:查詢數(shù)據(jù)庫,封裝對象
- 展示數(shù)據(jù)
- 獲取用戶的輸入
- 調(diào)用模型
- 將數(shù)據(jù)交給視圖進行展示
-
優(yōu)缺點:
1. 優(yōu)點:1. 耦合性低,方便維護,可以利于分工協(xié)作2. 重用性高2. 缺點:1. 使得項目架構(gòu)變得復(fù)雜,對開發(fā)人員要求高
JavaBeans :是Java中?種特殊的類(換?之:JavaBean就是?個Java類).
?個Java類 ,滿?以下要求,則可稱為?個JavaBean
a. public修飾的類,提供public ?參構(gòu)造?法
b. 所有屬性 都是private
C. 提供getter和setter?法
從使?層?來看,JavaBean分為2?類:
a. 封裝業(yè)務(wù)邏輯的JavaBean(eg:LoginDao.java 封裝了登錄邏輯)
b. 封裝數(shù)據(jù)的JavaBean(實體類:eg:Student.java Vadio.java 。往往對應(yīng)于數(shù)據(jù)庫中的?張
表,即數(shù)據(jù)庫中有個Student表,項?中就有個Student.java類)通常:表名=類名,列名=屬性名
JavaBean是?個可以重復(fù)使?的組件,通過編寫?個組件來實現(xiàn)某種通?功能,“?次編寫、任何地?執(zhí)?、任何地?重?”。
2.三層架構(gòu)
三層架構(gòu) 通常意義上的三層架構(gòu)就是將整個業(yè)務(wù)應(yīng)?劃分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的?的即為了“?內(nèi)聚,低耦合”的思想。
1、表現(xiàn)層(UI):通俗講就是展現(xiàn)給?戶的界?,即?戶在使??個系統(tǒng)的時候他的所?所得。
jsp/html
2、業(yè)務(wù)邏輯層(BLL):針對具體問題的操作,也可以說是對數(shù)據(jù)層的操作,對數(shù)據(jù)業(yè)務(wù)邏輯處理。
servlet,service
3、數(shù)據(jù)訪問層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫,針對數(shù)據(jù)的增添、刪除、修改、更新、查找
等。dao
表現(xiàn)層實現(xiàn)的代表作品是Struts,springmvc框架,
業(yè)務(wù)層實現(xiàn)的代表作品是Spring,
持久層實現(xiàn)的代表作品是Hibernate,mybatis。
層就相當(dāng)于?個?盒?,我們不?知道它內(nèi)部怎么實現(xiàn),只需要知道如何去調(diào)?它就?了。每層只與上下相鄰的兩層打交道。當(dāng)?層內(nèi)部由于技術(shù)變遷發(fā)?變化時,只要接?不變,其他層不?做任何改變。分層之后靈活性提?,也便于團隊分?開發(fā)。
3.三層架構(gòu)和MVC的區(qū)別與聯(lián)系
MVC可以是三層中的?個表現(xiàn)層框架,屬于表現(xiàn)層。三層和mvc可以共存。
三層是基于業(yè)務(wù)邏輯來分的,?MVC是基于??來分的。
MVC主要?于表現(xiàn)層,3層主要?于體系架構(gòu),3層?般是表現(xiàn)層、中間層、數(shù)據(jù)層,其中表現(xiàn)層?可以分成M、V、C,(Model View Controller)模型-視圖-控制器
MVC是表現(xiàn)模式(Presentation Pattern)
三層架構(gòu)是典型的架構(gòu)模式(Architecture Pattern)
三層架構(gòu)的分層模式是典型的上下關(guān)系,上層依賴于下層。但MVC作為表現(xiàn)模式是不存在上下關(guān)系的,?是相互協(xié)作關(guān)系。即使將MVC當(dāng)作架構(gòu)模式,也不是分層模式。MVC和三層架構(gòu)基本沒有可?性,是應(yīng)?于不同領(lǐng)域的技術(shù)。
十三、Ajax
1. 概念: ASynchronous JavaScript And XML 異步的JavaScript 和 XML
Ajax 是一種在無需重新加載整個網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。
通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。
傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個網(wǎng)頁頁面。
功能:提升用戶的體驗
異步和同步:客戶端和服務(wù)器端相互通信的基礎(chǔ)上
* 同步: 客戶端必須等待服務(wù)器端的響應(yīng)。在等待的期間客戶端不能做其他操作。
* 異步:客戶端不需要等待服務(wù)器端的響應(yīng)。在服務(wù)器處理請求的過程中,客戶端可以進行其他的操作。
* 瀏覽器的普通交互?式(同步)
2.工作原理:
1.客戶端瀏覽器發(fā)送JS請求Ajax引擎。
2.Ajax將JS請求轉(zhuǎn)換成HTTP請求。
3.服務(wù)器對接收到的數(shù)據(jù)進行處理。
4.服務(wù)器返回XML、JSON或文本文檔類型的數(shù)據(jù)給Ajax引擎。
5.AJax引擎接收服務(wù)器返回的數(shù)據(jù)進行渲染。
3. 實現(xiàn)方式:
(1)原生的JS實現(xiàn)方式(了解)
AJAX 的核?是 XMLHttpRequest 對象。
不同的瀏覽器創(chuàng)建 XMLHttpRequest 對象的?法是有差異的。
IE 6及以下瀏覽器使? ActiveXObject,?其他的瀏覽器使?名為 XMLHttpRequest 的 JavaScript 內(nèi)建對象
- XMLHttpRequest常?屬性
- onreadystatechange 屬性
onreadystatechange 屬性存有處理服務(wù)器響應(yīng)的函數(shù)。
- readyState 屬性
readyState 屬性存有服務(wù)器響應(yīng)的狀態(tài)信息。每當(dāng) readyState 改變時,onreadystatechange 函數(shù)就會
被執(zhí)?。
readyState 屬性可能的值:
- responseText 屬性
可以通過 responseText 屬性來取回由服務(wù)器返回的數(shù)據(jù)。
- onreadystatechange 屬性
AJAX狀態(tài)碼說明
1xx:請求收到,繼續(xù)處理
2xx:操作成功收到,分析、接受
3xx:完成此請求必須進?步處理
4xx:請求包含?個錯誤語法或不能完成
5xx:服務(wù)器執(zhí)??個 完全有效請求 失敗
再具體就如下:
100——客戶必須繼續(xù)發(fā)出請求
101——客戶要求服務(wù)器根據(jù)請求轉(zhuǎn)換HTTP協(xié)議版本
200——交易成功
201——提示知道新?件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務(wù)器完成了請求,?戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的?件
206——服務(wù)器已經(jīng)完成了部分?戶的GET請求
300——請求的資源可在多處得到
301——刪除請求數(shù)據(jù)
302——在其他地址發(fā)現(xiàn)了請求數(shù)據(jù)
303——建議客戶訪問其他URL或訪問?式
304——客戶端已經(jīng)執(zhí)?了GET,但?件未變化
305——請求的資源必須從服務(wù)器指定的地址得到
306——前?版本HTTP中使?的代碼,現(xiàn)?版本中不再使?
307——申明請求的資源臨時性刪除
400——錯誤請求,如語法錯誤
401——請求授權(quán)失敗
402——保留有效ChargeTo頭響應(yīng)
403——請求不允許
404——沒有發(fā)現(xiàn)?件、查詢或URl
405——?戶在Request-Line字段定義的?法不允許
406——根據(jù)?戶發(fā)送的Accept拖,請求資源不可訪問
407——類似401,?戶必須?先在代理服務(wù)器上得到授權(quán)
408——客戶端沒有在?戶指定的餓時間內(nèi)完成請求
409——對當(dāng)前資源狀態(tài),請求不能完成
410——服務(wù)器上不再有此資源且?進?步的參考地址
411——服務(wù)器拒絕?戶定義的Content-Length屬性請求
412——?個或多個請求頭字段在當(dāng)前請求中錯誤
413——請求的資源?于服務(wù)器允許的??
414——請求的資源URL?于服務(wù)器允許的?度
415——請求資源不?持請求項?格式
416——請求中包含Range請求頭字段,在當(dāng)前請求資源范圍內(nèi)沒有range指示值,請求也不包含IfRange請求頭字段
417——服務(wù)器不滿?請求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下?級服務(wù)器不能
滿?請求
500——服務(wù)器產(chǎn)?內(nèi)部錯誤
501——服務(wù)器不?持請求的函數(shù)
502——服務(wù)器暫時不可?,有時是為了防?發(fā)?系統(tǒng)過載
503——服務(wù)器過載或暫停維修
504——關(guān)?過載,服務(wù)器使?另?個關(guān)?或服務(wù)來響應(yīng)?戶,等待時間設(shè)定值較?
505——服務(wù)器不?持或拒絕?請求頭中指定的HTTP版本
(2).JQeury實現(xiàn)方式
1. $.ajax()* 語法:$.ajax({鍵值對});//使用$.ajax()發(fā)送異步請求$.ajax({url:"ajaxServlet1111" , // 請求路徑type:"POST" , //請求方式//data: "username=jack&age=23",//請求參數(shù)data:{"username":"jack","age":23},success:function (data) {alert(data);},//響應(yīng)成功后的回調(diào)函數(shù)error:function () {alert("出錯啦...")},//表示如果請求響應(yīng)出現(xiàn)錯誤,會執(zhí)行的回調(diào)函數(shù)dataType:"text"//設(shè)置接受到的響應(yīng)數(shù)據(jù)的格式(預(yù)期服務(wù)器返回的數(shù)據(jù)類型)});2. $.get():發(fā)送get請求* 語法:$.get(url, [data], [callback], [type])* 參數(shù):* url:請求路徑* data:請求參數(shù)* callback:回調(diào)函數(shù)* type:響應(yīng)結(jié)果的類型(預(yù)期服務(wù)器返回的數(shù)據(jù)類型)3. $.post():發(fā)送post請求* 語法:$.post(url, [data], [callback], [type])* 參數(shù):* url:請求路徑* data:請求參數(shù)* callback:回調(diào)函數(shù)* type:響應(yīng)結(jié)果的類型十四、JSON
1. 概念: JavaScript Object Notation (JavaScript對象表示法)
JSON (JavaScript Object Notation) 是?種輕量級的數(shù)據(jù)交換格式。 易于?閱讀和編寫。同時也易于機器解析和?成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition -December 1999的?個?集。 JSON采?完全獨?于語?的?本格式,但是也使?了類似于C語?家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語?。
1.jackson
語法:
- 數(shù)據(jù)在名稱/值對中:json數(shù)據(jù)是由鍵值對構(gòu)成的
- 鍵用引號(單雙都行)引起來,也可以不使用引號
- 值得取值類型:
- 數(shù)字(整數(shù)或浮點數(shù))
- 字符串(在雙引號中)
- 邏輯值(true 或 false)
- 數(shù)組(在方括號中) {“persons”:[{},{}]}
- 對象(在花括號中) {“address”:{“province”:“陜西”…}}
- null
json對象.鍵名
json對象[“鍵名”]
數(shù)組對象[索引]
遍歷
//1.定義基本格式
JSON數(shù)據(jù)和Java對象的相互轉(zhuǎn)換
- JSON解析器:
- 常見的解析器:Jsonlib,Gson,fastjson,jackson
導(dǎo)入jackson的相關(guān)jar包
創(chuàng)建Jackson核心對象 ObjectMapper
調(diào)用ObjectMapper的相關(guān)方法進行轉(zhuǎn)換
轉(zhuǎn)換方法:
- writeValue(參數(shù)1,obj):
參數(shù)1:
File:將obj對象轉(zhuǎn)換為JSON字符串,并保存到指定的文件中
Writer:將obj對象轉(zhuǎn)換為JSON字符串,并將json數(shù)據(jù)填充到字符輸出流中
OutputStream:將obj對象轉(zhuǎn)換為JSON字符串,并將json數(shù)據(jù)填充到字節(jié)輸出流中 - writeValueAsString(obj):將對象轉(zhuǎn)為json字符串
注解:
- @JsonFormat(pattern = “yyyy-MM-dd”) 如日期對象格式化,pattern用法與SimpleDateFormat類似
復(fù)雜java對象轉(zhuǎn)換
案例:
Person類:
測試類
public class JacksonTest {//Java對象轉(zhuǎn)為JSON字符串@Testpublic void test1() throws Exception {//1.創(chuàng)建Person對象Person p = new Person();p.setName("張三");p.setAge(23);p.setGender("男");//2.創(chuàng)建Jackson的核心對象 ObjectMapperObjectMapper mapper = new ObjectMapper();//3.轉(zhuǎn)換/*轉(zhuǎn)換方法:writeValue(參數(shù)1,obj):參數(shù)1:File:將obj對象轉(zhuǎn)換為JSON字符串,并保存到指定的文件中Writer:將obj對象轉(zhuǎn)換為JSON字符串,并將json數(shù)據(jù)填充到字符輸出流中OutputStream:將obj對象轉(zhuǎn)換為JSON字符串,并將json數(shù)據(jù)填充到字節(jié)輸出流中writeValueAsString(obj):將對象轉(zhuǎn)為json字符串*/String json = mapper.writeValueAsString(p);//{"name":"張三","age":23,"gender":"男"}//System.out.println(json);//{"name":"張三","age":23,"gender":"男"}//writeValue,將數(shù)據(jù)寫到d://a.txt文件中//mapper.writeValue(new File("d://a.txt"),p);//writeValue.將數(shù)據(jù)關(guān)聯(lián)到Writer中mapper.writeValue(new FileWriter("d://b.txt"),p);}@Testpublic void test2() throws Exception {//1.創(chuàng)建Person對象Person p = new Person();p.setName("張三");p.setAge(23);p.setGender("男");p.setBirthday(new Date());//2.轉(zhuǎn)換 Object -> JSONObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(p);System.out.println(json);//{"name":"張三","age":23,"gender":"男","birthday":1530958029263}//{"name":"張三","age":23,"gender":"男","birthday":"2018-07-07"}}// List集合 - > JSON Set集合類似@Testpublic void test3() throws Exception {//1.創(chuàng)建Person對象Person p = new Person();p.setName("張三");p.setAge(23);p.setGender("男");p.setBirthday(new Date());Person p1 = new Person();p1.setName("張三");p1.setAge(23);p1.setGender("男");p1.setBirthday(new Date());Person p2 = new Person();p2.setName("張三");p2.setAge(23);p2.setGender("男");p2.setBirthday(new Date());//創(chuàng)建List集合List<Person> ps = new ArrayList<Person>();ps.add(p);ps.add(p1);ps.add(p2);//2.轉(zhuǎn)換ObjectMapper mapper = new ObjectMapper();// List -> JSONString json = mapper.writeValueAsString(ps);// [{},{},{}]//[{"name":"張三","age":23,"gender":"男","birthday":"2018-07-07"},{"name":"張三","age":23,"gender":"男","birthday":"2018-07-07"},{"name":"張三","age":23,"gender":"男","birthday":"2018-07-07"}]System.out.println(json);// JSON -> ListList<Person> list = mapper.readValue(json, new TypeReference<List<Person>>() {}); // class java.util.ArrayListfor (Person pp : list) {System.out.println(pp);}}//Map集合 -> JSON@Testpublic void test4() throws Exception {//1.創(chuàng)建map對象Map<String,Object> map = new HashMap<String,Object>();map.put("name","張三");map.put("age",23);map.put("gender","男");//2.轉(zhuǎn)換 map -> JSONObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(map);//{"name":"張三","age":23,"gender":"男"}System.out.println(json);//{"gender":"男","name":"張三","age":23}// JSON -> Map//方式一: //class java.util.LinkedHashMapMap<String,Object> hm = mapper.readValue(json, Map.class);//方式二: //class java.util.LinkedHashMap//Map<String, Object> lhm= mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); Set<String> set = hm.keySet();for (String str : set) {System.out.println(str + ":" + hm.get(str));}}//演示 JSON字符串轉(zhuǎn)為Java對象@Testpublic void test5() throws Exception {//1.初始化JSON字符串String json = "{\"gender\":\"男\(zhòng)",\"name\":\"張三\",\"age\":23}";//2.創(chuàng)建ObjectMapper對象ObjectMapper mapper = new ObjectMapper();//3.轉(zhuǎn)換為Java對象 Person對象Person person = mapper.readValue(json, Person.class);System.out.println(person);}/*** 將數(shù)組轉(zhuǎn)換成json字符串* [{"name":"張三","age":23,"gender":"男"},{"name":"李四","age":24,"gender":"女"},{"name":"王五","age":25,"gender":"男"}]* @throws Exception*/@Testpublic void test6() throws Exception {Person p1 = new Person("張三", 23, "男");Person p2 = new Person("李四", 24, "女");Person p3 = new Person("王五", 25, "男");Person[] persons = {p1, p2, p3};ObjectMapper mapper = new ObjectMapper();// Array -> JSONString json= mapper.writeValueAsString(persons);System.out.println(json);// JSON ->ArrayPerson[] persons = mapper.readValue(json, Person[].class); // [Lcn.itcast.domain.Person;@43195e57String content = "";for (Person person : persons) {content+=person + " ";}System.out.println(content);}}2.Jsonlib
JSON轉(zhuǎn)為Java對象
1. 導(dǎo)入Jsonlib的相關(guān)jar包
java對象和json之間的轉(zhuǎn)換
《1》單個對象或map集合
java->json:
Users user2=new Users();
user2.setUsername(“李四”);
user2.setPassword(“abc”);
user2.setAge(20);
JSONObject obj=JSONObject.fromObject(user);//obj就是json格式的
json->java:
String str="{‘username’:‘李四’,‘password’:‘a(chǎn)dmin’,‘a(chǎn)ge’:19}";
JSONObject json=JSONObject.fromObject(str);
Users user=(Users)JSONObject.toBean(json,Users.class);
《2》對象集合和json的轉(zhuǎn)換
java集合->json數(shù)組:
List list=new ArrayList();
list.add(“dd”);
list.add(“aa”);
JSONArray obj=JSONArray.fromObject(list);//set也是這么轉(zhuǎn)
json數(shù)組->java集合:
?式1:
String str2="[{‘a(chǎn)ge’:20,‘password’:‘a(chǎn)bc’,‘username’:‘李四’},
{‘a(chǎn)ge’:10,‘password’:‘a(chǎn)db’,‘username’:‘張三’}]";
JSONArray json2=JSONArray.fromObject(str2);
Object[] obj=(Object[])JSONArray.toArray(json2,Users.class);
?式2:
String str3="[{‘a(chǎn)ge’:20,‘password’:‘a(chǎn)bc’,‘username’:‘李四’},
{‘a(chǎn)ge’:10,‘password’:‘a(chǎn)db’,‘username’:‘展示?’}]";
JSONArray json3=JSONArray.fromObject(str3);
//默認轉(zhuǎn)換成ArrayList
List list=(List) JSONArray.toCollection(json3,Users.class);
感謝您能閱讀至此!!respect!!!!
總結(jié)
以上是生活随笔為你收集整理的那些年关于JavaWeb的点点滴滴,你想看的这里全都有噢~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器的优点
- 下一篇: 最新WIN_GHO系统(及OFC_PS8