1. 程式人生 > >java學習筆記————本質篇1

java學習筆記————本質篇1

1.HTML:超文字標記語言!不是一種程式語言,是一種描述性的標記語言,用於描述超文字中內容的顯示方式。比如字型、顏色、大小等。 // 顯示資料  JSP也是最終響應回 一個HTML格式頁面來顯示資料!


2.CSS:層疊樣式表!作用:定義網頁的顯示效果。簡單一句話:CSS將網頁內容和顯示樣式進行分離,提高了顯示功能。
外聯:<link href=“”/>引入的方式
ID選擇器:#ID{ xxxx  }
類選擇器:.class { xxxx }
後代選擇器: .class ul(子) { xxxxx }
並集選擇器: h1, h3, p, ul { xxxxx }
子元素選擇器: h1 > strong { xxxxx }
屬性選擇器: h1[id][class] { xxxxx }
偽類順序:(LoVe HAte原則)  a:link > a:visited > a:hover > a:active
字型屬性的繼承性(子-->父)   eg:在<body>中同一設定字型屬性
優先順序: 行內樣式 > ID選擇器 > class選擇器 > 標籤選擇器 > *(萬用字元)選擇器 > 繼承的樣式 > 預設樣式


塊級標籤:獨佔一行或多行  <div>    <h1> <p> <ul> <ol> <li>  ===>互轉 display:inline
行級標籤:不佔獨立區域 多個行標籤 可以共用一行 <span>   <strong> <a> <u> <s> <b> <i> <em> <del> <ins>      ===>互轉 display:block


3.JavaScript:JavaScript是弱變數型別的語言. 弱變數型別:定義變數的時候變數,沒有具體的型別.當變數被賦值的時候.變數才會有具體的資料型別.// JS都會由事件觸發.
JS不是面向物件的 是基於物件. JS中的函式就是物件.
JavaScript中5種原始資料型別:
Undefined、Null、Boolean、Number 和 String
全等和非全等(===   !==)


4.Xml:是指可擴充套件標記語言(eXtensible——Markup——Language),它是一種標記語言,很類似HTML。 //  它被設計的宗旨是 傳輸資料,而非顯示資料。
   應用場景(作用):1.儲存資料;2.作為配置檔案使用
4.a)DOM解析:需要讀取整個XML文件
API:
NodeList nodeList = document.getElementsByTagName(String node);
Element element=(Element) nodeList.item(0);//可能涉及到強轉
Element element = document.createElement(String element);
element.setTextContent(String content)
element.getTextContent()
element.setAttribute(String name,String value)
element.getAttribute(String name)


熟練dom解析xml的7種操作:
//1、得到某個具體節點的內容
//2、遍歷所有節點
//3、修改某個元素節點的主體內容
//4、向指定元素節點中增加子元素節點
//5、向指定元素節點中增加同級節點
//6、刪除指定節點
//7、操作XML檔案屬性






4.b)SAX解析:邊讀取邊解析        // SAX 是事件驅動的 XML 處理方法  =====   基於事件驅動






dom4j工具類解析xml  // DOM4J解析XML是一級一級的解析   根 > 子 > 孫 > ...
用SAXReader物件的read()方法讀取xml檔案,得到的是dom4j的document物件(不是w3c)   ======>  new SAXReader().read("/.../abc.xml");   // Tips: 此處是檔案
document  <==> String   互轉:    document.asXML()  ==> String /    String.parseText(xmlString) ==> document


dom4j儲存Document物件: // XMLWriter物件的write()方法(寫入到本地磁碟中)
OutputFormat format=OutputFormat.createPrettyPrint()    // 格式化後的xml    // OutputFormat format = OutputFormat.createCompactFormat(); // 無格式化的
format.setEncoding("utf-8");
new XMLWriter(  new FileOutputStream("src/first.xml"),  format )
writer.write(document);  // 此document為 上文中用SAXReader物件解析本xml得到的 ---中途做了CRUD操作,完了再寫回原始檔
常用API:
Element getRootElement()Document的方法,用來獲取根元素;
List elements()Element的方法,用來獲取所有子元素;
String attributeValue(String name)Element的方法,用來獲取指定名字的屬性值;
Element element(String name)Element的方法,用來獲取第一個指定名字的子元素;
Element elementText(String name)Element的方法,用來獲取第一個指定名字的子元素的文字內容
int indexOf(Node node)Branch的方法,查詢指定節點,在當前Branch的子節點集合中的下標位置。




XPath:是一門在 XML 文件中查詢資訊的語言。XPath 可用來在 XML 文件中對元素和屬性進行遍歷。   // 匯入jaxen 的jar包
selectNodes("xpath表示式")用來查詢多個匹配xpath表示式的元素
selectSingleNode("/book/author") 用來查詢一個匹配xpath表示式的元素




Schema約束: XML文件的約束,.xsd檔案,用來替代DTD.




5.HTTP:即超文字傳輸協議。這個協議詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則。(Hypertext Transport Protocol)
HTTP協議:(客戶端)瀏覽器與伺服器之間的通訊協議!協議不過就是一種格式!
http協議是建立在TCP協議基礎上。http協議也是基於請求與響應的模型,http協議預設的埠是80.


/** 筆試題:GET與POST請求區別?
1. get只能傳遞1kb以下資料,POST可以傳遞大資料。
2. get請求如果有請求引數,那麼,瀏覽器上會顯示請求引數
post請求不會,所以post請求會更安全。
3. 如果是get請求,有請求引數,請求引數是在http請求行的資源路徑上。
如果是post請求,有請求引數,請求引數是在請求正文中。——————————>並且有請求引數,才會有請求正文。
*/


1.請求協議:(傳送給伺服器看的,告知伺服器:我的資訊,我可以支援哪些技術,讓伺服器根據這些資訊判斷,並返回我支援展示的頁面內容)
//  瀏覽器傳送給伺服器的內容就這個格式的,如果不是這個格式伺服器將無法解讀!
//  Tips:在HTTP協議中,請求有很多種請求方法,其中最為常用的就是GET和POST
請求行;
請求頭資訊;//Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈。
//Referer : 請求來自哪個頁面,例如你在百度上點選連結到了這裡,那麼Referer:http://www.baidu.com;如果你是在瀏覽器的位址列中直接輸入的地址,那麼就沒有Referer這個請求頭了;  ====> 就是說:從那個頁面跳轉到的本站
空行;
請求體      // 只能放POST請求引數 ——————> POST請求 + 且有請求引數POST請求是可以有請求體的,而GET請求不能有請求體
------> GET請求沒有請求體,無法通過request.setCharacterEncoding()來設定引數的編碼;


//Content-Type請求頭: application/x-www-form-urlencoded表單的資料型別,說明會使用url格式編碼資料;
// url編碼的資料都是以“%”為字首,後面跟隨兩位的16進位制,例如“中國”這兩個字使用UTF-8的url編碼用為“%E4%B8%AD%E5%9B%BD”;
   // URL編碼 : URLEncoder.encode(String s, String enc)      //使用指定的編碼機制將字串轉換為 application/x-www-form-urlencoded 格式。
   // URL解碼 : URLDecoder.decode(String s, String enc)  //使用指定的編碼機制對 application/x-www-form-urlencoded 字串解碼。
%EF%BC%9F ===== utf-8發現:直接位址列輸入中文,可能會在前面 新增此編碼輸入中國,發現前面多了3個url編碼,經decode發現 值為utf-8
%EF%BC%9F%E4%B8%AD%E5%9B%BD


2.響應協議:(傳送給瀏覽器看的)


響應首行;
響應頭資訊;
// 響應頭:
Last-Modified:最後的修改時間;
// 請求頭:
If-Modified-Since:把上次請求的index.html的最後修改時間還給伺服器;
// 狀態碼:
304,比較If-Modified-Since的時間與檔案真實的最後修改時間一樣時,伺服器會響應304,而且不會有響正文,表示瀏覽器快取的就是最新版本!




//告訴瀏覽器不要快取的響應頭:
Expires: -1;
Cache-Control: no-cache;
Pragma: no-cache;


// response.setContentType("text/html;charset=utf-8"),   這個方法即規定了編碼用utf-8,  同時還設定了content-type響應頭,告訴瀏覽器用utf-8來解碼.
// response.setHeader(“content-type”, “text/html;charset=utf-8”)
// response.setHeader("Refresh","5; URL=http://www.baidu.com")


空行;
響應體     // response物件的響應流 ————————> 對於http響應正文,它是真正被瀏覽器解析並顯示在瀏覽器上的。   JSP————>HTML




HTTP響應也是由三個部分組成,分別是:狀態行、訊息報頭、響應正文
1、狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示伺服器HTTP協議的版本;Status-Code表示伺服器發回的響應狀態程式碼;Reason-Phrase表示狀態程式碼的文字描述。


狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求


常見狀態程式碼、狀態描述、說明:
200 OK      //客戶端請求成功
400 Bad Request  //客戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden  //伺服器收到請求,但是拒絕提供服務
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable  //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常


eg:HTTP/1.1 200 OK (CRLF)






6.1.Servlet:是一個資源,是一個java類,是執行在伺服器上的。 sun的定義:它就是一個javax.servlet.Servlet介面。
作用:處理請求
接收請求資料;處理請求;完成響應


HttpServlet對Servlet介面的service()進行了重寫 ==> 細分為doPost() 和 doGet() 兩種請求


生命週期:1.建立servlet物件,常駐記憶體(我們一般會在web.xml中配置預載入,tomcat啟動時就載入一個servlet物件到記憶體中   load-on-startup配置  1...> 10)
2.執行init(ServletConfig)方法,初始化配置檔案等 //引數注入吧。。。 傳遞伺服器建立的 ServletConfig物件   封裝有context(全域性)/init(區域性)-param  初始化引數資訊
  //配置在web.xml中的
3.執行servce()方法處理請求,每次都新開啟一個執行緒(多執行緒,不安全)
4.tomcat正常關閉時,執行destroy()方法,銷燬servlet物件
//通過檢視HttpServlet類的service()方法,可以看到 請求方式除了GET 和 POST ,至少還有5種:DELETE、HEAD、OPTIONS、PUT、TRACE


在web.xml中配置servlet訪問路徑: 同一個servlet可以 有多個 對映存在(多個訪問路徑)


預設: 沒有對應的servlet<url-pattern>配置的頁面,全部由預設的servlet來處理其請求。(如:html頁面)


訪問服務端資源(servlet)的方式:
1.瀏覽器
2.form表單
3.<a href="#">訪問資源</a>
4.js程式碼  location.href="#"


站外資源:http://www.baidu.com
站內資源:工程名+url-pattern值       (站內站外都使用絕對路徑,不要用相對路徑就是了)


靜態:html
動態:jsp/servlet  asp  php         使用java來完成動態的web資源的開發




6.2.ServletConfig:ServletConfig它是Servlet的一個配置物件,是javax.servlet.包下的一個介面。
1.ServletConfig是由誰建立的?他是怎樣傳遞到Servlet中的?
//ServletConfig物件是由伺服器建立的,它是通過Servlet的init方法傳遞到Servlet中。


2.ServletConfig物件,它的作用是什麼
a) 獲取Servlet名稱 getServletName()
b) 獲取Servlet初始化引數 getInitParamete()  getInitParameterNames()
c) 獲取ServletContext物件。 getServletContext()


3.我們如何獲取一個ServletConfig物件?
// getServletConfig()   ======> this.getServletConfig();
// 通過檢視 父類GenericServlet的原始碼,我們知道 GenericServlet 實現了ServletConfig介面,Servlet介面 -----重寫init(ServletConfig)傳入還儲存了ServletConfig物件 ,
                                                    // 還另外給我們提供了一個無參init() , 有參init( ...呼叫了無參init())
// 它已經將伺服器傳遞的ServletConfig儲存了,並且對外提供了一個公共方法用於獲取ServletConfig




6.3.ServletContext:web級域物件,是Servlet存在的環境,實現同一個web應用內的資源共享。//資源:Servlet                //它也是javax.servlet包下的一個介面。
1.一個web應用對應一個ServletContext,在web伺服器啟動時由伺服器建立,通過它可以實現servlet之間的資源共享 =====> 域物件 // 同一個web應用中
   // 在伺服器關閉時銷燬
2.要想獲取一個ServletContext可以通過ServletConfig來獲取,方法是 getServletContext();
======> this.getServletConfig().getServletContext();  ==可以簡化為==> this.getServletContext(); //原因自然是:GenericServlet底層做了封裝
getRealPath()
//  主要使用getRealPath()方法:它的作用是獲取工程中資原始檔的絕對磁碟路徑。
//  getRealPath("/")這代表的是一個絕對路徑,它指向的是當前工程在tomcat下的絕對磁碟路徑






7.request:開發中通過request物件來獲取http請求資訊及客戶機資訊 是Servlet.service方法的一個引數
在客戶端發出每個請求時,伺服器都會建立一個request物件,並把請求資料封裝到request中!!!我們利用request來操作http請求資訊
// TomCat 預設通過HTTP協議的編碼方式————ISO-8859-1對請求頭、行、(體)進行編碼,然後將編碼後的請求資訊 全部封裝到———request物件中!!!


request的功能可以分為以下幾種:
封裝了請求頭資料;
request.getHeader(String name)
request.getContextPath()        // 返回上下文路徑,即工程路徑,例如:/OneServlet
request.getServletPath()// 返回Servlet訪問路徑,url-pattern例如:/oneServlet


request獲取請求引數的API:
String getParameter(String name):通過指定名稱獲取引數值;
String[] getParameterValues(String name):當多個引數名稱相同時,可以使用該方法來獲取;
Map getParameterMap():獲取所有引數封裝到Map中,其中key為引數名,value為引數值,因為一個引數名稱可能有多個值,所以引數值是String[],而不是String。
Enumeration getParameterNames():獲取所有引數的名字;


Getparameter: 瀏覽器端資料  -------- 引數// 從request物件中提取封裝在它自身的引數資訊
GetAttribute:  伺服器端資料  -------- 屬性  // request域共享資料




封裝了請求正文資料,如果是GET請求,那麼就沒有正文;


request是一個域物件,可以把它當成Map來新增獲取資料;
// request可以在一個請求中共享資料。   eg: 請求轉發和請求包含
// 一個請求會建立一個request物件,如果在一個請求中經歷了多個Servlet,那麼多個Servlet就可以使用request來共享資料


request提供了請求轉發和請求包含功能。  //表示:由多個Servlet共同來處理一個請求


request.getRequestDispatcher("/BServlet").forward(request, response); // 在AServlet中,把請求轉發到BServlet:     tips:留(請求)頭不留(請求)體


// 請求轉發大多是應用在Servlet中,轉發目標大多是JSP頁面;   利用request域共享(傳遞)資料










request.getRequestDispatcher("/BServlet").include(request, response); // 在AServlet中,把請求包含到BServlet:   tips:AB共同完成響應頭和響應體
 // 請求包含大多是應用在JSP頁面中,完成多頁面的合併;


7.2問題:請求引數亂碼問題,它如何產生的,怎樣解決?  // 服務端————的亂碼問題
亂碼產生的最根本的原因是在編碼與解碼時使用的是不同的編碼表。
分析一下關於請求引數亂碼問題:
簡單說,就是瀏覽器使用了utf-8對漢字進行了編碼,伺服器使用了iso8859-1物件資訊進行了解碼。就出現了亂碼。


解決亂碼方案:
將得到的資訊再以iso8859-1進行編碼,使用utf-8進行解碼就可以。




Get請求解決亂碼問題: // reqeust.setCharacterEncoding(encoding) 僅對POST有效!  對GET是無效的!!!   編碼內部處理是很複雜的,並不像表面上看的這麼簡單,
1. 修改conf/server.xml編碼//這僅僅是我們去掉了中間複雜傳輸轉換過程,有待深入研究!!!
<Connector port="80" protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443" URIEncoding="utf-8"/>// 經測試,發現:僅修改此配置,對GET有效,但對POST卻無效!! POST還需加 ————>
//   reqeust.setCharacterEncoding("utf-8")
2. New String() 進行編碼(最多)
new String( name.getBytes("iso-8859-1"), "utf-8" );對get/post請求方式均有效. //前提:沒有修改TomCat中conf/server.xml編碼  ————否則,GET亂碼
// 配置檔案 和 new String() ————GET只能二選一     |對POST是無所謂的!


3. 通過js來對請求引數進行編碼(瞭解) ——————> jsp頁面的標籤
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
//  contentType:  1.告訴瀏覽器提交請求的編碼方式
 2.解析頁面的編碼方式
// pageEncoding:1.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> //


如果我們的請求方式是post,我們也可以直接通過reqeust.setCharacterEncoding("utf-8")來處理請求引數亂碼。
reqeust.setCharacterEncoding("utf-8")// 設定請求物件解碼的編碼為utf-8
//——————> 可能內部根據我們 傳參encoding ,做了new String("編碼",解碼)


/** ***** GET和POST方式如何解決亂碼:
* POST:
* 解決辦法:
* request.setCharacterEncoding(“UTF-8”);
* GET:
* 解決辦法:
* String name = new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”UTF-8”);
*/










8.response:response物件是用來對客戶端進行響應的 是Servlet.service方法的一個引數,
在客戶端發出每個請求時,伺服器都會建立一個response物件,用來操作http響應資訊。


response物件的功能分為以下四種:
設定響應頭資訊;
response.setHeader(“content-type”, “text/html;charset=utf-8”)
response.setHeader("Refresh","5; URL=http://www.it.cn")
傳送狀態碼;
response.setStatus(200)


設定響應正文;(重點)    // 兩個響應流物件     不能同時使用這兩個流!!!
// PrintWriter out = response.getWriter():獲取字元流;    eg: 響應文字  有緩衝區  預設8kb    response.flushBuffer()
// ServletOutputStream out = response.getOutputStream():  獲取位元組流;eg:下載


//  解決輸出亂碼問題: response.setContentType("text/html;charset=utf-8"),
//          這個方法即規定了編碼用utf-8,同時還設定了content-type響應頭,告訴瀏覽器用utf-8來解碼.


 new String( name.getByte("iso-8859-1"), "utf-8" );對get/post請求方式均有效.


重定向;(重點)
//  response.sendRedirect("/day10/TwoRedirect") 方法會設定響應頭為302,以及設定Location響應頭






/** 請求轉發與重定向比較(重點掌握)
請求轉發是一個請求,而重定向是兩個請求;
請求轉發後瀏覽器位址列不會有變化,而重定向會有變化,因為重定向是兩個請求;
請求轉發的目標只能是本應用中的資源,重定向的目標可以是其他應用;
請求轉發對AServlet和BServlet的請求方法是相同的,即要麼都是GET,要麼都是POST,因為請求轉發是一個請求;
重定向的第二個請求一定是GET;*/










9.jsp:JSP是JavaWeb伺服器端的動態資源。它與html頁面的作用是相同的,顯示資料和獲取資料。  (Java Server Pages)  // JSP 最終是響應回 HTML頁面  來顯示資料的!!!
jsp是一種特殊的Servlet,當JSP頁面首次被訪問時,容器(Tomcat)會先把JSP編譯成Servlet,然後再去執行Servlet。所以JSP其實就是一個Servlet!//  Sun公司推出的jsp技術


1.Jsp原理:
1. 當瀏覽器向伺服器傳送請求訪問demo1.jsp頁面
2. tomcat的web.xml檔案中配置了一個JspServlet,它會對所有後綴名是*.jsp的路徑進行處理
3. 會將demo1.jsp翻譯成demo1_jsp.java檔案,這個檔案儲存在tomcat/work目錄
4. 會將demo1_jsp.java檔案編譯成demo1_jsp.class檔案,伺服器會將其載入執行
5. 在jsp頁面生成的java檔案中就會通過 流 將jsp頁面的html程式碼寫回到瀏覽器端,所以我們在瀏覽器上就看到了jsp中的html程式碼顯示的效果。




注意:要知道<%  %>和<%! %>在jsp“真身”中的位置:
在_jspService()方法中間以 java程式碼原型存在


JSP指令碼:JSP指令碼就是Java程式碼片段,它分為三種:// 明確一點:所有的這些都是 在_jspService()方法內_jspService()內定義了9個:我們俗稱的9大內建物件
<%...%>:Java語句;// 方法中能放什麼,它就能放什麼。
<%=…%>:Java表示式;// 等同於resopnse.getWriter().print()。寫到這裡的東西,都是用來輸出的!
<%!...%>:Java定義 類的成員變數;// 類能包含什麼,它就可以包含什麼。    宣告成員變數的標籤 ,注意: 宣告標籤中 沒有9大內建物件!


JSP註釋:<%-- jsp註釋 不會保留 --%><!--html註釋 會被保留-->




Jsp與servlet區別:
Jsp它的主要作用是用於顯示資料。
Servlet它的主要作用是用於處理請求完成業務邏輯操作。






2.九大內建物件: // 來歷 _jspService()方法內給我們聲明瞭9個:我們俗稱的9大內建物件直接在<% java程式碼 %>中使用
1. application  型別是 ServletContext
2. session      型別是 HttpSession
3. request      型別是 HttpServletRequest
4. pageContext  型別是 PageContext
5. response     型別是 HttpServletResponse
6. config  型別是 ServletConfig
7. page    型別是 Object
8. out      型別是 JspWriter
9. exception    型別是 Throwable




3.四大域物件: // 也是 EL 的內建物件
1.pageContext:它代表的是page域,但是jsp中page它的型別是Object,所以操作page域我們使用的是pageContext物件,page域就是指當前頁面範圍
2.request : 它是代表整個請求鏈
3.session: 整個會話
4.application:整個web應用


servlet中有三個域物件:
HttpServletRequest  整個請求鏈
HttpSession         整個會話
ServletContext      整個web應用。


對於域物件它們都具有以下方法<% java程式碼 %>
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)


4.pageContext物件作用:—————————————— java程式碼 操作 域/物件     jsp中寫java指令碼,已被淘汰————————被EL替代
1.獲取其它八個內建物件 // 我們在開發中可以將pageContext物件  作為引數  傳遞到java類中,在java類中就可以  根據需求來  獲取想要的web物件。
2.操作page域及其它域    // ~.setAttribute("pname", "pvalue")    /  ~.getAttribute("rname",PageContext.REQUEST_SCOPE)   /  pageContext.findAttribute("rname")
 // 快速查詢: 在 page < request < session < application 範圍依次查詢,如果沒有查詢到返回null.
實際開發中用法: ${pageContext.request.contextPath} ==》pageContext.getRequest.getContextPath() ——————> 獲取當前工程名


out物件:將資訊輸出到頁面上
out物件它是一個JspWriter,它是一個字元輸出流,它的作用就是將資訊輸出到頁面上。
out物件與response.getWriter()區別?   //response.getWriter() 輸出優先級別 > out


out緩衝區 ————> response緩衝區 ————> 頁面  //  真正操作響應正文的其實是response  //  在jsp頁面上要想顯示資訊,建議只使用out.


Exception:
它就是一個異常物件,描述的是當前頁面產生的異常資訊,它只有在 page指令 設定為 isErrorPage 時才會存在。








5.jsp指令:
1. page指令:這個指令用於描述頁面的一些特性   <%@page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true" %>
/** page指令中重要屬性
import: 用於在jsp頁面上使用java類時匯入包
encoding: 用於指示jsp頁面翻譯後的java檔案的編碼,其實也就是當前jsp頁面編碼
contentType: 用於指示jsp頁面生成的servlet中response獲取輸出流輸出資訊的編碼
簡單說,就是用於設定response.setContentType();


encoding 與contentType屬性的關係:
它們互相依賴,只要設定一個,另一個就參考對方值。


language:它代表的是jsp頁面上指令碼中可以使用的語言


extends:它的作用是指示jsp生成的java類它的父類


session:它的值是true/false,如果是true,代表在jsp頁面中可以直接使用session,否則不可以使用。


isElIgnored:它的值是true/false 指示的是jsp頁面上是否可以使用el表示式,如果是true,就不能使用el表示式,否則就可以使用.


errorPage 用於設定錯誤頁面,jsp頁面如果出現問題,可以直接跳轉到errorPage指定的頁面


isErrorPage值可以取true/false指示當前頁面是一個錯誤頁面,也就是說,取true時可以在當前頁面中直接使用jsp內建物件exception,


在開發中,我們一般很少使用 errorPage與isErrorPage,我們一般會使用全域性錯誤頁面處理方案:
我們可以在web.xml檔案中配置錯誤頁面。




autoFlush與buffer
它是 jsp頁面生成的 java檔案中out物件預設快取區大小及是否自動重新整理。*/


2. include指令:靜態包含。在jsp頁面中靜態包含一個檔案,這個檔案可以是任意檔案,同時由jsp解析包含檔案內容. <%@include file="demo2.jsp"  %>


包含操作有什麼作用?
使用包含,可以對頁面進行佈局。// 將兩個頁面 合併成一個頁面


靜態包含的注意事項:
1. file屬性的值不能是變數
2. file屬性值不可以攜帶引數




3. taglib指令:匯入標籤庫, 如:jstl標籤庫<%@taglib  uri="http://java.sun.com/jsp/jstl/core" prefix="c"  %>




6.Jsp標籤: // 業務邏輯處理   —————— Service層
Jsp中標籤也叫jsp action(動作標籤),用於在jsp頁面中提供業務邏輯處理,避免在jsp頁面中書寫指令碼。
我們現在所說的jsp標籤,是jsp頁面內建的,可以直接使用。<jsp:標籤名稱 屬性=值 >




<jsp:forward>用於請求轉發,它與RequestDispatcher介面中的forward方法一樣,唯一不同的就是在jsp頁面中使用。 // 避免在jsp頁面寫<% java程式碼 %>    在 web.xml
// 的struts核心配置  中開啟<dispatcher>FORWARD</dispatcher>
<jsp:param> 用於頁面傳遞資料,簡單說,就是用於生成引數。


<jsp:include>這個標籤的作用與jsp中include指令功能是一樣的,都是包含操作,只不過我們叫include標籤為動態包含。


Jsp中靜態包含(include指令)與動態包含(include標籤)區別?
1. 靜態包含包含的是內容,而動態包含包含的是結果。
2. 靜態包含不可以傳遞引數 ,而動態包含可以傳遞引數




7.EL表示式:它是jsp內建的一種表示式語言,從jsp2.0開如,就不讓再使用java指令碼,而是使用el表示式來替換jsp中java指令碼。(expression Language)
主要作用是:代替jsp頁面上的<%=%>,向瀏覽器輸出資料.  eg:${1+2}向瀏覽器輸出3.


格式:  ${表示式}


/** 為什麼使用el表示式?
主要目的是為了替換jsp頁面上的指令碼,使jsp更加簡單,安全。
EL主要作用:
1. 獲取資料(主要是域中資料)
2. 執行運算
3. 獲取web常用物件
4. 呼叫java方法(EL函式)*/


jsp2.0規範    —————— servlet版本是servlet2.4 —————— javaEE1.4


1.El表示式獲取資料: // 使用el表示式獲取時,如果沒有查詢到結果, 返回的 不是null, 而是一個 "".
1. page域 ----------------------${pageScope.name}
2. request域 ----------------------${requestScope.name}
3. session域 ----------------------${sessionScope.name}
4. application域----------------------${applicationScope.name}


EL獲取域中資料可以省略範圍 ${requestScope.rname}   ---------  ${rname}  page > reqeust > session > application 依次查詢


在el中使用"."與[]可以實現同樣的效果: ${xxxScope.物件.屬性}   =    ${xxxScope["物件"]["屬性"]}  //——————全都是用名稱去找,不要混淆去用getXXX()方法.
問題:  .與[]有什麼區別? // <%= request.getXXX().getXXX()%> 這裡才用java程式碼
注意: 如果名稱中不包含特殊符號,那麼.與[]一樣,但是如果名稱中包含了特殊符號,那麼我們就只能使用[].




/** 2. EL執行運算:
在el表示式中可以使用運算子來進行操作
1.算術運算子 + - * /(div)  %(mod) ——————取餘
對於算術運算子注意+,它永遠執行的就是加法運算。


2.關係運算符  >(gt) >=(ge) <(lt) <=(le) == (eq) !=(ne)
執行關係運算它得到的結果就是boolean


3.邏輯運算子
&&(and)  ||(or)  !(not)
執行邏輯運算得到的結果也是boolean


4.三目運算子
(表示式1)?(表示式2):(表示式3)
它與java中的三元運算子一樣。


5.empty
i. 如果是一個普通物件,它判斷物件是否為null,如果為null返回true.否則返回false.
ii. 如果是一個容器(陣列或集合),它不僅判斷物件是否為null,還判斷是否有元素。*/


/** 3. EL十一大內建物件:// 我們在el中使用pageContext一般使用:${pageContext.request.contextPath}


pageScope  requestScope  sessionScope  applicationScope


pageContext 它與jsp頁面上內建物件pageContext一樣。


獲取 http請求資訊 的6個內建物件:
param: 獲取一個Map<String,String>  key就是請求引數名稱,value是值
paramValues: 獲取一個Map<String,String[]>它與request.getParameterMap()結果一樣。


header: 獲取一個Map<String,String>它封裝的是所有的http請求頭資訊
headerValues: 獲取一個Map<String,String[]>它封裝的是所有的http請求頭資訊


initParam 獲取一個Map<String,String>它封裝了所有的全域性初始化引數


cookie: 獲取一個Map<String,Cookie> 它封裝了所有的http請求的中cookie資訊,key就是cookie的名稱,value就是這個cookie物件。


*/




4.El函式:Jstl標籤庫,在jstl標籤庫中有已經定義好的一些EL函式。在jsp頁面上要使用EL函式必須匯入jstl標籤庫。
     本質是:呼叫了一個java類的方法。 //   <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>


注意:如果在開發中,我們使用的不是myeclipse,那麼我們在使用el函式時,必須匯入jstl的jar包。
因為我們使用的是myeclipse,它會預設匯入javaee5.0的庫,在這個庫中包含了jstl標籤庫的jar檔案,所以不用匯入了。








8.JSTL標籤庫:






8.2.javaWeb設計模式:
jsp設計模式: jsp+javaBean       /       jsp+servlet+JavaBean            // Sun公司在推出jsp後,提供的兩種jsp開發模式
// <Jsp:userBean id="" class="" /><Jsp:get/setProperty   property=""   name=""/>
javaBean介紹: 一個javaBean它應該是具有無引數構造,並且屬性private,對外提供get/set方法讓其訪問,一般javaBean是可序列化,也就是說,它要實現序列化介面。


在javaweb開發中,javaBean的主要功能是什麼?
javaBean可以分為兩種,一種是使用者介面的UI 的javaBean , javaweb中使用的不是這一種。
另外一種它沒有使用者介面,主要負責處理資料封裝,jsp中通常使用的是這一種, 我們在實際開發中,所使用的javaBean主要是用於 將資料進行封裝操作。


Beanutils: 我們可以使用beanutils工具來完成請求引數封裝。 // 底層是使用java內省機制,而內省它的實現是依賴於java反射。
它是apache開發的一套用於 操作javaBean的API, 通過這套API,可以簡化我們操作javaBean程式碼的編寫。
API:
Beanutils.populate(user , request.getParameterMap())  // 引數1:javaBean物件引數2:所有的請求引數的map集合




Web開發的三層架構與mvc區別?// 先架構,再選模式
三層架構它是一個分層式的體系架構設計,它可適用於任何一個專案,MVC它只是一個設計模式,它是根據專案的具體需求來決定是否適用於該專案。
在開發,首要對專案進行架構,在架構以後,我們要根據具體的需求,來選擇設計模式。例如mvc  工廠模式等。


MVC設計模式: MVC全名是model  view  controller
它是一種軟體設計典範,用一種業務邏輯,資料,介面分離的方式來組織程式碼,將業務邏輯聚集到一個部件中,方便程式的重用,提高我們的開發效率。
M:model 即模型層,維護資料提供資料的訪問 javaBean // 業務處理: service / dao / POJO
V:view 即檢視層 資料的顯示  jsp// 顯示資料:html / jsp 
C:controller 控制層,用於業務處理。Servlet// 接收請求 + 響應結果 :servlet / filter

eg: struts2框架 、 SpringMVC ...

// 注意:Model並不是單純的指POJO.  Model是指業務邏輯處理——————service/dao/POJO/甚至action也可以算model








8.3.i18n國際化: