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