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