那些年关于JavaWeb的点点滴滴,你想看的这里全都有噢~
JavaWeb知識(shí)匯總
- 一、Servlet
- 二、HTTP
- 1. HTTP協(xié)議簡介
- 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類被瀏覽器訪問到(tomcat識(shí)別)的規(guī)則。
- 未來我們可以自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法。
-
快速入門:
-
創(chuàng)建JavaEE項(xiàng)目
-
定義一個(gè)類,實(shí)現(xiàn)Servlet接口
public class ServletDemo1 implements Servlet -
實(shí)現(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ù)器接受到客戶端瀏覽器的請(qǐng)求后,會(huì)解析請(qǐng)求URL路徑,獲取訪問的Servlet的資源路徑。 2. 查找web.xml文件,是否有對(duì)應(yīng)的<url-pattern>標(biāo)簽體內(nèi)容。 3. 如果有,則在找到對(duì)應(yīng)的<servlet-class>全類名。 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,判斷該類的對(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)?銷毀對(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)情況下,第一次被訪問時(shí),Servlet被創(chuàng)建。通過web.xml文件,可以配置Servlet的創(chuàng)建時(shí)機(jī)。在<servlet>標(biāo)簽下配置1. 第一次被訪問時(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í)行一次,說明一個(gè)Servlet在內(nèi)存中只存在一個(gè)對(duì)象,Servlet是單例的多個(gè)用戶同時(shí)訪問時(shí),可能存在線程安全問題。解決:盡量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對(duì)修改值2. 提供服務(wù):執(zhí)行service()方法,執(zhí)行多次每次訪問Servlet時(shí),service()方法都會(huì)被調(diào)用一次。3. 被銷毀:執(zhí)行destroy()方法,只執(zhí)行一次Servlet被銷毀時(shí)執(zhí)行。服務(wù)器關(guān)閉時(shí),Servlet被銷毀只有服務(wù)器正常關(guān)閉時(shí),才會(huì)執(zhí)行destroy()方法。destroy()方法在Servlet被銷毀之前執(zhí)行,一般用于釋放資源* Servlet3.0:好處:支持注解配置。可以不需要web.xml了。步驟:1. 創(chuàng)建JavaEE項(xiàng)目,選擇Servlet的版本3.0以上,可以不創(chuàng)建web.xml2. 定義一個(gè)類,實(shí)現(xiàn)Servlet接口3. 復(fù)寫方法4. 在類上使用@WebServlet注解,進(jìn)行配置* @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接口中其他的方法做了默認(rèn)空實(shí)現(xiàn),只將service()方法作為抽象* 將來定義Servlet類時(shí),可以繼承GenericServlet,實(shí)現(xiàn)service()方法即可* HttpServlet:對(duì)service()方法做了詳細(xì)的實(shí)現(xiàn),不再需要我們寫代碼判斷用戶的請(qǐng)求方式,對(duì)http協(xié)議的一種封裝,簡化操作1. 定義類繼承HttpServlet2. 復(fù)寫doGet/doPost方法
- Servlet相關(guān)配置1. urlpartten:Servlet訪問路徑(資源路徑)1. 一個(gè)Servlet可以定義多個(gè)訪問路徑 : @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é)議簡介
-
概念:超?本傳輸協(xié)議(英?:HyperText Transfer Protocol,縮寫:HTTP)是?種?于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)?層協(xié)議。HTTP是萬維?的數(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)使?短連接。也就是說,客戶端和服務(wù)器每進(jìn)??次HTTP操作,就建??次連接,任務(wù)結(jié)束就中斷連接。
5. 無狀態(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è)??打開完成后,客戶端和服務(wù)器之間?于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guā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長度有限制的3. 不太安全POST:1. 請(qǐng)求參數(shù)在請(qǐng)求體中2. 請(qǐng)求的url長度沒有限制的3. 相對(duì)安全 2. 請(qǐng)求頭:客戶端瀏覽器告訴服務(wù)器一些信息請(qǐng)求頭名稱: 請(qǐng)求頭值常見的請(qǐng)求頭:1. User-Agent:瀏覽器告訴服務(wù)器,我訪問你使用的瀏覽器版本信息* 可以在服務(wù)器端獲取該頭的信息,解決瀏覽器的兼容性問題2. Referer:http://localhost/login.html告訴服務(wù)器,我(當(dāng)前請(qǐng)求)從哪里來?作用:1. 防盜鏈:通過條件判斷指定從某條URL跳轉(zhuǎn)過來到當(dāng)前頁面才正常顯示2. 統(tǒng)計(jì)工作:可以統(tǒng)計(jì)從某個(gè)URL跳轉(zhuǎn)到當(dāng)前頁面的用戶數(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. 分類:1. 1xx:服務(wù)器接收客戶端消息,但沒有接受完成,等待一段時(shí)間后,發(fā)送1xx多狀態(tài)碼2. 2xx:成功。代表:2003. 3xx:重定向。代表:302(重定向),304(訪問緩存)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. 格式:頭名稱: 值2. 常見的響應(yīng)頭:1. Content-Type:服務(wù)器告訴客戶端本次響應(yīng)體數(shù)據(jù)格式以及編碼格式2. Content-disposition:服務(wù)器告訴客戶端以什么格式打開響應(yīng)體數(shù)據(jù)* 值:* in-line:默認(rèn)值,在當(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 只有?部分請(qǐng)求被服務(wù)器接收,但只要沒被服務(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è)超鏈接并訪問,最??持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 禁?訪問所請(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 (全稱:Hyper Text Transfer Protocol over SecureSocket Layer), 是以安全為目標(biāo)的 HTTP 通道,在HTTP的基礎(chǔ)上通過傳輸加密和身份認(rèn)證保證了傳輸過程的安全性 。 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ǎng)上安全敏感的通訊,例如交易支付等方面。- 詳情請(qǐng)看 HTTPS
三、Request
-
Request對(duì)象和Response對(duì)象的原理
1.客戶端發(fā)送請(qǐng)求后,Tomcat服務(wù)器會(huì)根據(jù)請(qǐng)求URL中的資源路徑(Servlet訪問路徑),創(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ù),程序員可以通過request對(duì)象獲取請(qǐng)求消息數(shù)據(jù),通過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 類(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 例如:中華人民共和國* URI:統(tǒng)一資源標(biāo)識(shí)符 : /day14/demo1 例如:共和國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):通過請(qǐng)求頭的名稱獲取請(qǐng)求頭的值* Enumeration<String> getHeaderNames():獲取所有的請(qǐ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é)輸入流,可以操作所有類型數(shù)據(jù)2. 再從流對(duì)象中拿數(shù)據(jù) 2. 其他功能:1. 獲取請(qǐng)求參數(shù)通用方式:不論get還是post請(qǐng)求方式都可以使用下列方法來獲取請(qǐng)求參數(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():獲取所有請(qǐng)求的參數(shù)名稱4. Map<String,String[]> getParameterMap():獲取所有參數(shù)的map集合* 中文亂碼問題:* get方式:tomcat 8 已經(jīng)將get方式亂碼問題解決了* 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. 通過request對(duì)象獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象:RequestDispatcher getRequestDispatcher(String path)2. 使用RequestDispatcher對(duì)象來進(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ì)象來共享數(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):通過鍵獲取值3. void removeAttribute(String name):通過鍵移除鍵值對(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,即是說所有的非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ī)范中,沒有對(duì)URL的?度和傳輸?shù)臄?shù)據(jù)??進(jìn)?限制。但是在實(shí)際開發(fā)過程中,對(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");//簡單的重定向方法response.sendRedirect("/day15/responseDemo2");* forward 和 redirect 區(qū)別* 重定向的特點(diǎn):redirect1. 地址欄發(fā)生變化2. 重定向可以訪問其他站點(diǎn)(服務(wù)器)的資源3. 重定向是兩次請(qǐng)求。不能使用request對(duì)象來共享數(shù)據(jù)* 轉(zhuǎn)發(fā)的特點(diǎn):forward1. 轉(zhuǎn)發(fā)地址欄路徑不變2. 轉(zhuǎn)發(fā)只能訪問當(dāng)前服務(wù)器下的資源3. 轉(zhuǎn)發(fā)是一次請(qǐng)求,可以使用request對(duì)象來共享數(shù)據(jù)2. 服務(wù)器輸出字符數(shù)據(jù)到瀏覽器* 步驟:1. 獲取字符輸出流2. 輸出數(shù)據(jù)* 注意:* 亂碼問題:1. PrintWriter pw = response.getWriter();獲取的流的默認(rèn)編碼是ISO-8859-12. 設(shè)置該流的默認(rèn)編碼 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. 相對(duì)路徑:通過相對(duì)路徑不可以確定唯一資源* 如:./index.html 或者 servletDemo1* 不以/開頭、以.開頭路徑* 規(guī)則:找到當(dāng)前資源和目標(biāo)資源之間的相對(duì)位置關(guān)系* ./:當(dāng)前目錄* ../:后退一級(jí)目錄2. 絕對(duì)路徑:通過絕對(duì)路徑可以確定唯一資源* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2* 以/開頭的路徑* 規(guī)則:判斷定義的路徑是給誰用的?判斷請(qǐng)求將來從哪兒發(fā)出* 給客戶端瀏覽器使用:需要加虛擬目錄(項(xiàng)目的訪問路徑)* 建議虛擬目錄動(dòng)態(tài)獲取:request.getContextPath()*如 <a> , <form> 標(biāo)簽重定向到某個(gè)頁面* 給服務(wù)器使用:不需要加虛擬目錄,使用相對(duì)路徑即可* 轉(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對(duì)象范圍:所有用戶所有請(qǐng)求的數(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)的配置的對(duì)象
- 獲取
通過當(dāng)前Servlet實(shí)例來獲取
ServletConfig config = this.getServletConfig(); - 功能
- 獲取ServletContext對(duì)象
* ServletContext getServletContext(); - 獲取當(dāng)前Servlet的初始化參數(shù)
* String getInitParameter(String name) - 獲取當(dāng)前Servlet的所有初始化參數(shù)的名稱
* Enumeration getInitParameterNames() - 獲取當(dāng)前Servlet實(shí)例的名稱
* 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ì)話建立,直到有一方斷開為止
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ù)器就可以通過這個(gè)標(biāo)識(shí)來識(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();
* // 通過遍歷獲取各個(gè)cookie的值
for (Cookie c : cs) {
String name = c.getName(); //獲取cookie的名稱
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ù)被銷毀
2. 持久化存儲(chǔ):
* setMaxAge(int seconds)
(1)正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲(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共享問題?
? * 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
快速入門:
HttpSession session = request.getSession();
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理
- Session的實(shí)現(xiàn)是依賴于Cookie的。
- 第一次獲取Session,沒有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í)候被銷毀?
1. 本地服務(wù)器正常關(guān)閉后不會(huì)被銷毀,idea上配置的tomcat服務(wù)器關(guān)閉后會(huì)被銷毀
2. session對(duì)象調(diào)用invalidate() 。
3. session默認(rèn)失效時(shí)間 30分鐘
* Session的超時(shí)時(shí)間為maxInactiveInterval屬性,可以通過對(duì)應(yīng)的 getMaxInactiveInterval()獲取,通過 setMaxInactiveInterval(longinterval)修改
* 還可以在config目錄下的web.xml中選擇性配置修改
4.瀏覽器中含有JSESSIONID的cookie被銷毀時(shí),服務(wù)器會(huì)重新創(chuàng)建一個(gè)新的session對(duì)象,原有的session對(duì)象會(huì)在失效時(shí)間過后被銷毀。
session的特點(diǎn)
什么時(shí)候創(chuàng)建Session?
1.Session在?戶第?次訪問page指令中的session屬性值不為false的JSP頁面時(shí)被創(chuàng)建。
2.若servelt是第瀏覽器客戶端訪問的第一個(gè)WEB應(yīng)用的資源,則只有調(diào)用了request.getSession()或request.getSession(true)才會(huì)創(chuàng)建session對(duì)象。
其中request.getSession(boolean),
boolean為false時(shí),若沒有和當(dāng)前JSP頁面關(guān)聯(lián)的session對(duì)象則返回null,若有,則返回true。
Boolean為true時(shí),一定返回一個(gè)session對(duì)象,若沒有和當(dāng)前JSP頁面關(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沒有數(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í)符來存取服務(wù)器端的Session存儲(chǔ)空間。?SessionID這?數(shù)據(jù)則是保存到客戶端,?Cookie保存的,?戶提交??時(shí),會(huì)將這?SessionID提交到服務(wù)器端,來存取Session數(shù)據(jù)。這?過程,是不?開發(fā)?員?預(yù)的。所以?旦客戶端禁?Cookie,那么Session也會(huì)失效。
八、JSP
1. 概念:
* Java Server Pages: java服務(wù)器端頁面
* 可以理解為:一個(gè)特殊的頁面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼
* 用于簡化書寫!!!
2. 原理
* JSP本質(zhì)上就是一個(gè)Servlet,當(dāng)瀏覽器訪問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代碼通過流進(jìn)?輸出,也就是說最終翻譯成class,被虛擬機(jī)加載,它本質(zhì)是servlet,它就會(huì)往回響應(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頁面的編碼(只能是高級(jí)的IDE才能生效,如果使用低級(jí)工具,則需要設(shè)置pageEncoding屬性設(shè)置當(dāng)前頁面的字符集)
- import:導(dǎo)包
- errorPage:當(dāng)前頁面發(fā)生異常后,會(huì)自動(dòng)跳轉(zhuǎn)到指定的錯(cuò)誤頁面
- isErrorPage:標(biāo)識(shí)當(dāng)前也是是否是錯(cuò)誤頁面。
- true:是,可以使用內(nèi)置對(duì)象exception <% String message = exception.getMessage(); %>
- false:否。默認(rèn)值。不可以使用內(nèi)置對(duì)象exception
page 指令相關(guān)屬性:
include : JSP可以通過include指令來包含其他?件。被包含的?件可以是JSP?件、HTML?件或?本?件。包含的?件就好像是該JSP?件的?部分,會(huì)被同時(shí)編譯執(zhí)?。
<%@ include file=“?件相對(duì) 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代碼,會(huì)輸出到頁面上。輸出語句中可以定義什么,該腳本中就可以定義什么。
5. JSP的內(nèi)置對(duì)象:
* 在jsp頁面中不需要獲取和創(chuàng)建,可以直接使用的對(duì)象
* jsp一共有9個(gè)內(nèi)置對(duì)象。
| pageContext | PageContext | 當(dāng)前頁面共享數(shù)據(jù),還可以獲取其他八個(gè)內(nèi)置對(duì)象 |
| request | HttpServletRequest | 一次請(qǐng)求訪問的多個(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容器處理過的對(duì)象傳回到客戶端。只在JSP??內(nèi)有效。 |
| page | Object | 當(dāng)前頁面(Servlet)的對(duì)象,類似于this |
| out | JspWriter | 輸出對(duì)象,數(shù)據(jù)輸出到頁面上 |
| config | ServletConfig | 主要作?是取得服務(wù)器的配置信息。通過 pageConext對(duì)象的 getServletConfig() ?法可以獲取?個(gè)config對(duì)象。當(dāng)?個(gè)Servlet 初始化時(shí),容器把某些信息通過config對(duì)象傳遞給這個(gè)Servlet。 開發(fā)者可以在web.xml ?件中為應(yīng)?程序環(huán)境中的Servlet程序和JSP??提供初始化參數(shù)。 |
| exception | Throwable | exception 對(duì)象的作?是顯示異常信息,只有在包含 isErrorPage=“true” 的??中才可以被使?,通常用于打印錯(cuò)誤信息輸出到日志文件,exception.getMessage() |
- out:字符輸出流對(duì)象。可以將數(shù)據(jù)輸出到頁面上。和response.getWriter()類似
* 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頁面中所有的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或者長度是否為0
- ${empty list}:判斷字符串、集合、數(shù)組對(duì)象是否為null或者長度為0
- ${not empty str}:表示判斷字符串、集合、數(shù)組對(duì)象是否不為null 并且 長度>0
${域名稱.鍵名}:從指定域中獲取指定鍵的值
- 域名稱:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
${鍵名}:表示依次從最小的域中查找是否有該鍵對(duì)應(yīng)的值,直到找到為止。
獲取對(duì)象、List集合、Map集合的值
對(duì)象:${域名稱.鍵名.屬性名}
- 本質(zhì)上會(huì)去調(diào)用對(duì)象的getter方法
List集合:${域名稱.鍵名[索引]}
- 索引越界會(huì)返回空字符
Map集合:
- ${域名稱.鍵名.key名稱}
- ${域名稱.鍵名[“key名稱”]}
* 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)簽庫(JSTL)是?個(gè)JSP標(biāo)簽集合,它封裝了JSP應(yīng)?的通?核?功能。
JSTL?持通?的、結(jié)構(gòu)化的任務(wù),?如迭代,條件判斷,XML?檔操作,國際化標(biāo)簽,SQL標(biāo)簽。 除了這些,它還提供了?個(gè)框架來使?集成JSTL的?定義標(biāo)簽。
根據(jù)JSTL標(biāo)簽所提供的功能,可以將其分為5個(gè)類別。核?標(biāo)簽 格式化標(biāo)簽 sql標(biāo)簽 xml標(biāo)簽 jstl函數(shù)(后?詳細(xì)解釋)
(2) JSTL的作?和語法格式
作?:用于簡化和替換jsp頁面上的java代碼
語法格式:
下載 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=”??使?的名稱” 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表達(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)簽沒有else情況,想要else情況,則可以再定義一個(gè)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表達(dá)式* 如果表達(dá)式為true,則顯示if標(biāo)簽體內(nèi)容,如果為false,則不顯示標(biāo)簽體內(nèi)容* 一般情況下,test屬性值會(huì)結(jié)合el表達(dá)式一起使用2. 注意:c:if標(biāo)簽沒有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 作?:將?期類型格式化為指定模式的字符串
屬性
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
概念:
- 生活中的過濾器:凈水器,空氣凈化器,土匪、
- web中的過濾器:當(dāng)訪問服務(wù)器的資源時(shí),過濾器可以將請(qǐng)求攔截下來,完成一些特殊的功能。
- 過濾器的作用:
- 一般用于完成通用的操作。如:登錄驗(yàn)證、統(tǒng)一編碼處理、敏感字符過濾…
快速入門:
過濾器細(xì)節(jié):
web.xml配置
demo1
cn.itcast.web.filter.FilterDemo1
demo1
/*
過濾器執(zhí)行流程
過濾器生命周期方法
過濾器配置詳解
- 攔截路徑配置:
- 具體資源路徑: /index.jsp 只有訪問index.jsp資源時(shí),過濾器才會(huì)被執(zhí)行
- 攔截目錄: /user/* 訪問/user下的所有資源時(shí),過濾器都會(huì)被執(zhí)行
- 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時(shí),過濾器都會(huì)被執(zhí)行
- 攔截所有資源:/* 訪問所有資源時(shí),過濾器都會(huì)被執(zhí)行
- 注解配置:
- 設(shè)置dispatcherTypes屬性
- REQUEST:默認(rèn)值。瀏覽器直接請(qǐng)求資源
- FORWARD:轉(zhuǎn)發(fā)訪問資源
- INCLUDE:包含訪問資源
- ERROR:錯(cuò)誤跳轉(zhuǎn)資源
- ASYNC:異步訪問資源
//瀏覽器直接請(qǐng)求index.jsp資源時(shí),該過濾器會(huì)被執(zhí)行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
//只有轉(zhuǎn)發(fā)訪問index.jsp時(shí),該過濾器才會(huì)被執(zhí)行
//@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)
//瀏覽器直接請(qǐng)求index.jsp或者轉(zhuǎn)發(fā)訪問index.jsp。該過濾器才會(huì)被執(zhí)行
//@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})
過濾器鏈(配置多個(gè)過濾器)
-
執(zhí)行順序:如果有兩個(gè)過濾器:過濾器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.下載資源的限制
過濾器的特點(diǎn):在servlet之前和之后都會(huì)被執(zhí)?
十一、Listener
1.什么是監(jiān)聽器
監(jiān)聽器就是監(jiān)聽某個(gè)域?qū)ο蟮牡臓顟B(tài)變化的組件
監(jiān)聽器的相關(guān)概念:
事件源:被監(jiān)聽的對(duì)象(三個(gè)域?qū)ο?request、session、servletContext)
監(jiān)聽器:監(jiān)聽事件源對(duì)象事件源對(duì)象的狀態(tài)的變化都會(huì)觸發(fā)監(jiān)聽器
注冊(cè)監(jiān)聽器:將監(jiān)聽器與事件源、事件進(jìn)?綁定。事件源上發(fā)生某個(gè)事件后,執(zhí)行監(jiān)聽器代碼
響應(yīng)?為:監(jiān)聽器監(jiān)聽到事件源的狀態(tài)變化時(shí)所涉及的功能代碼(程序員編寫代碼)
- ServletContextListener:監(jiān)聽ServletContext對(duì)象的創(chuàng)建和銷毀
- 方法:
- void contextDestroyed(ServletContextEvent sce) :ServletContext對(duì)象被銷毀之前會(huì)調(diào)用該方法
- void contextInitialized(ServletContextEvent sce) :ServletContext對(duì)象創(chuàng)建后會(huì)調(diào)用該方法
- 步驟:
- 定義一個(gè)類,實(shí)現(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域的?命周期
何時(shí)創(chuàng)建:服務(wù)器啟動(dòng)創(chuàng)建
何時(shí)銷毀:服務(wù)器關(guān)閉銷毀
ServletContextListener監(jiān)聽器的主要作?
初始化的?作:初始化對(duì)象、初始化數(shù)據(jù)(加載數(shù)據(jù)庫驅(qū)動(dòng)、連接池的初始化)
加載?些初始化的配置?件(spring的配置?件)
任務(wù)調(diào)度(定時(shí)器—Timer/TimerTask) - HttpSessionListener
監(jiān)聽Httpsession域的創(chuàng)建和銷毀的監(jiān)聽器
HttpSession對(duì)象的?命周期
何時(shí)創(chuàng)建:第?次調(diào)?request.getSession時(shí)創(chuàng)建
何時(shí)銷毀:服務(wù)器關(guān)閉銷毀、session過期(默認(rèn)30分鐘,修改默認(rèn)的30分鐘是在
Tomcat的web.xml,修改當(dāng)前項(xiàng)?的過期時(shí)間是在??項(xiàng)?的web.xml中)、?動(dòng)銷毀
HttpSessionListener監(jiān)聽器的主要作?:
由于每次訪問?站都會(huì)默認(rèn)創(chuàng)建session對(duì)象(jsp??中page指令中的session屬性默認(rèn)為
true,即被訪問時(shí)創(chuàng)建session),可以?于計(jì)數(shù)?站訪問過的? - ServletRequestListener
監(jiān)聽ServletRequest域創(chuàng)建與銷毀的監(jiān)聽器
ServletRequest的?命周期
創(chuàng)建:每?次請(qǐng)求都會(huì)創(chuàng)建request
銷毀:請(qǐng)求結(jié)束
?法同上,?處不是很?,此處省略。
十二、 MVC和三層架構(gòu)
1.MVC設(shè)計(jì)模式
- 完成具體的業(yè)務(wù)操作,如:查詢數(shù)據(jù)庫,封裝對(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ì)開發(fā)人員要求高
JavaBeans :是Java中?種特殊的類(換?之:JavaBean就是?個(gè)Java類).
?個(gè)Java類 ,滿?以下要求,則可稱為?個(gè)JavaBean
a. public修飾的類,提供public ?參構(gòu)造?法
b. 所有屬性 都是private
C. 提供getter和setter?法
從使?層?來看,JavaBean分為2?類:
a. 封裝業(yè)務(wù)邏輯的JavaBean(eg:LoginDao.java 封裝了登錄邏輯)
b. 封裝數(shù)據(jù)的JavaBean(實(shí)體類:eg:Student.java Vadio.java 。往往對(duì)應(yīng)于數(shù)據(jù)庫中的?張
表,即數(shù)據(jù)庫中有個(gè)Student表,項(xiàng)?中就有個(gè)Student.java類)通常:表名=類名,列名=屬性名
JavaBean是?個(gè)可以重復(fù)使?的組件,通過編寫?個(gè)組件來實(shí)現(xiàn)某種通?功能,“?次編寫、任何地?執(zhí)?、任何地?重?”。
2.三層架構(gòu)
三層架構(gòu) 通常意義上的三層架構(gòu)就是將整個(gè)業(yè)務(wù)應(yīng)?劃分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的?的即為了“?內(nèi)聚,低耦合”的思想。
1、表現(xiàn)層(UI):通俗講就是展現(xiàn)給?戶的界?,即?戶在使??個(gè)系統(tǒng)的時(shí)候他的所?所得。
jsp/html
2、業(yè)務(wù)邏輯層(BLL):針對(duì)具體問題的操作,也可以說是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
servlet,service
3、數(shù)據(jù)訪問層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫,針對(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ì)分?開發(fā)。
3.三層架構(gòu)和MVC的區(qū)別與聯(lián)系
MVC可以是三層中的?個(gè)表現(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 是一種在無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。
通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對(duì)網(wǎng)頁的某部分進(jìn)行更新。
傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁頁面。
功能:提升用戶的體驗(yàn)
異步和同步:客戶端和服務(wù)器端相互通信的基礎(chǔ)上
* 同步: 客戶端必須等待服務(wù)器端的響應(yīng)。在等待的期間客戶端不能做其他操作。
* 異步:客戶端不需要等待服務(wù)器端的響應(yīng)。在服務(wù)器處理請(qǐng)求的過程中,客戶端可以進(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或文本文檔類型的數(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 屬性
可以通過 responseText 屬性來取回由服務(wù)器返回的數(shù)據(jù)。
- onreadystatechange 屬性
AJAX狀態(tài)碼說明
1xx:請(qǐng)求收到,繼續(xù)處理
2xx:操作成功收到,分析、接受
3xx:完成此請(qǐng)求必須進(jìn)?步處理
4xx:請(qǐng)求包含?個(gè)錯(cuò)誤語法或不能完成
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)瀏覽過的?件
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——建議客戶訪問其他URL或訪問?式
304——客戶端已經(jīng)執(zhí)?了GET,但?件未變化
305——請(qǐng)求的資源必須從服務(wù)器指定的地址得到
306——前?版本HTTP中使?的代碼,現(xiàn)?版本中不再使?
307——申明請(qǐng)求的資源臨時(shí)性刪除
400——錯(cuò)誤請(qǐng)求,如語法錯(cuò)誤
401——請(qǐng)求授權(quán)失敗
402——保留有效ChargeTo頭響應(yīng)
403——請(qǐng)求不允許
404——沒有發(fā)現(xiàn)?件、查詢或URl
405——?戶在Request-Line字段定義的?法不允許
406——根據(jù)?戶發(fā)送的Accept拖,請(qǐng)求資源不可訪問
407——類似401,?戶必須?先在代理服務(wù)器上得到授權(quán)
408——客戶端沒有在?戶指定的餓時(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)沒有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)過載
503——服務(wù)器過載或暫停維修
504——關(guān)?過載,服務(wù)器使?另?個(gè)關(guān)?或服務(wù)來響應(yīng)?戶,等待時(shí)間設(shè)定值較?
505——服務(wù)器不?持或拒絕?請(qǐng)求頭中指定的HTTP版本
(2).JQeury實(shí)現(xiàn)方式
1. $.ajax()* 語法:$.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ù)類型)});2. $.get():發(fā)送get請(qǐng)求* 語法:$.get(url, [data], [callback], [type])* 參數(shù):* url:請(qǐng)求路徑* data:請(qǐng)求參數(shù)* callback:回調(diào)函數(shù)* type:響應(yīng)結(jié)果的類型(預(yù)期服務(wù)器返回的數(shù)據(jù)類型)3. $.post():發(fā)送post請(qǐng)求* 語法:$.post(url, [data], [callback], [type])* 參數(shù):* url:請(qǐng)求路徑* data:請(qǐng)求參數(shù)* callback:回調(diào)函數(shù)* type:響應(yīng)結(jié)果的類型十四、JSON
1. 概念: JavaScript Object Notation (JavaScript對(duì)象表示法)
JSON (JavaScript Object Notation) 是?種輕量級(jí)的數(shù)據(jù)交換格式。 易于?閱讀和編寫。同時(shí)也易于機(jī)器解析和?成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition -December 1999的?個(gè)?集。 JSON采?完全獨(dú)?于語?的?本格式,但是也使?了類似于C語?家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語?。
1.jackson
語法:
- 數(shù)據(jù)在名稱/值對(duì)中:json數(shù)據(jù)是由鍵值對(duì)構(gòu)成的
- 鍵用引號(hào)(單雙都行)引起來,也可以不使用引號(hào)
- 值得取值類型:
- 數(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解析器:
- 常見的解析器: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類似
復(fù)雜java對(duì)象轉(zhuǎn)換
案例:
Person類:
測試類
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ù)寫到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集合類似@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的点点滴滴,你想看的这里全都有噢~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器的优点
- 下一篇: 最新WIN_GHO系统(及OFC_PS8