JavaWeb筆記-備份下

  1. html
  2. 簡介:
  3. 超文本標記語言
  4. Hyper Text Markup Language
  5. 網頁語言
  6. 超文本:超出文本的範疇,使用html能夠輕鬆實現
  7. 標記:html全部操做都經過標記實現 <標籤>

                     i.            html直接經過瀏覽器 直接運行javascript

  1. html的規範

a)       一個開始和結束的標籤css

b)       html包含兩部份內容html

                     i.            <head>顯示信息</head>java

                   ii.            <body>顯示頁面上的內容</body>node

c)        不區分大小寫mysql

d)       有的標籤 沒有結束標籤jquery

                     i.            <br/>換行web

                   ii.            <hr/>一條線面試

 

  1. html操做思想

a)       網頁中有許多不一樣的數據 須要不一樣的顯示效果ajax

  1. html經常使用標籤

a)       <font></font>

b)       屬性 size:文字的大小1—7

  1. color:文字顏色 兩種方式

1, 英文單詞

2, 試用rgb表示 #加16進制

c)        註釋標籤

  1. <!--   --!>

d)       標題 標籤<h1></h1> 裏面的數字是變的 數字越大標題越小 標題標籤會自動換行

e)       水平線標籤 <hr/> size粗細 color顏色

f)        特殊符號轉譯  &lt;  --- <

1, &gt; ---- >

  1. 空格也須要轉譯  &nbsp;  ----" " 一個空格

 

  1. 列表標籤

a)       <dl></dl> 無序列表範圍

                     i.            在dl裏面 <dt></dt>上層內容

1, <dd></dd>下層內容

b)       <ol></ol> 有序列表範圍

                     i.            ol屬性 type:設置排序方式 1,數字  a,英文 i,羅馬字

                   ii.            在ol裏面 <li></li>

 

c)        想要加特殊符號 使用<ul></ul>標籤 默認爲原點·

                     i.            更改 type 改變默認的 特殊符號

                   ii.            在ul裏面 <li></li>

 

  1. 圖像標籤 重點

a)       <img src="地址"></img>

b)       屬性: width height 寬高屬性  alt="鼠標停留在圖片上 會顯示文字 用的少 兼容性差「

 

  1. 路徑的介紹

a)       分類:兩類1,絕對路徑   C:\Use\io\lxa.jpg  http://www.baidu.com

1, 2,相對路徑  一個文件相對於另外一個文件的位置 img\iii.jpg

2, ../  表示html的上層路徑

 

  1. 超連接 <href target="_blank"></href> 跳轉到空白的頁面 「_self」在如今的頁面打開
    1. target = 「#」 什麼也不打開
  2. 定位資源  

a)       若是想要定位資源 : 定義一個位置

                     i.            <a name="top">頂部</a>

                   ii.            回到頂部 <a href="#top">回到頂部</a>

 

  1. <pre></pre> 能夠進行換行的 pre 按照裏面的內容進行換行

 

  1. 表格標籤

a)       <table  border="設置線 1 大小" bordercolor="線的顏色" cellspacing="線之間的空隙大小  設置爲0 沒有空隙" width="" height="">

 

                     i.            <tr能夠設置顯示方式 align="center"字體居中 >  <td></td>  <td></td></tr>   align——排列

                   ii.            <tr></tr>

b)       </table>

c)        tr表示一行  td 表示單元格

                     i.            th也能夠表示單元格 th能夠實現 居中 加粗

                   ii.            表格的標題<caption></caption> 設置標題

                  iii.            合併單元格

                  iv.            rowspan ="3" 跨行合併3個單元格

                   v.            colspan

 

  1. 表單標籤****

a)       能夠提交數據到服務器 這個過程能夠使用表單標籤

b)       **<form  action="提交到哪裏 寫出路徑 01-hello.html 提交到這個頁面裏"  method="get或 post」/form> : 定義一個表單的範圍

                     i.            輸入項:能夠輸入內容

  1. 大部分輸入項 使用<input type="輸入項的類型"/>
  2. ** 普通輸入項:<input type="text"/>

1, eg:

                                                        i.            <form>

  1. 手機號碼:<input type="text"/>

                                                      ii.            </form>

  1. ** 密碼輸入項:<input type="password"/>
  2. ** 單選輸入項 必需要有value  <input type="radio" name="sex" cheaked="checked 這個屬性能夠默認選中 多選也是同樣"/>女 <input type="radio" name="sex"/>男   須要屬性 name  name屬性必須同樣才能單選
  3. ** 複選輸入項 必需要有value  <input type="checkbox" name="love"/>羽毛球 <input type="checkbox" name="love"/> 網球
  4. ** 文件輸入項 <input type="file"/>  能夠插入本地文件
  5. ** 下拉輸入項(不在input標籤裏) <select name="birth">

                                                                                           i.            <option value="1998" selected="selected 實現默認選中'>1998<option/>

                                                                                         ii.            <option value="1997">1997<option/>

                                                                                        iii.            <option value="1996">1996<option/>

b)       </select>

  1. ** 文本域 <textarea cols="有機行" rows="有幾列"></textarea>
  2. ** 隱藏項 <input type="hidden"/> 具體用途以後講 能夠寫一些屬性傳遞到servlet
  3. ** 重置按鈕 <input type="reset" value="重置按鈕" 回到初始 />
  4. ** 普通按鈕 <input type="button" value="普通按鈕" 
  5. 經過圖片進行上傳 **

1, <input type="image" src="圖片路徑"/>

  1. ** 提交按鈕 <input type="submit"/> 註冊 提交以後網頁 出現?後的值被提交到服務器上

                   ii.            ***** 每一個標籤裏都要有 name 屬性 ****

  1. ** get 和 post 的區別: get請求地址欄會攜帶提交數據 post不會攜帶提交數據
    1. get 請求的安全級別低 get 請求數據有大小的限制 post沒有帶下的限制
    2. 還有一個 e

c)        使用表單寫註冊界面:

                     i.            建立一個html頁面 :

d)       <h2>註冊</h2>

e)       <form action="要提交的頁面">

                     i.            <table width="100%" border="1" >

  1. <TR>
  2. <td>註冊郵箱</td>
  3. <td><input type="text" name="mail"/></td>
  4. </TR>
  5. <tr>你能夠使用<a href="#">手機號註冊</a></tr>
  6. <tr><input type="password" name="pw"/></tr>
  7. <tr>姓名:<input type="text" name="name"/></tr>
  8. <tr><input type="radio' value="sex" checked="cheaked" /></tr>      
  9. <tr><select>

1, <option value="1998">1998</option>

2, <option value="2000' selected="selected" ></option>

3, </select>

  1. </tr>

1, <td><img src="驗證碼 "/><td><input type="text"/></td>

  1. <tr>
  2. <tr><td>&nbsp;</td><td><input type="image" src="地址"/></tr>

                   ii.            </table>

f)        </form>

 

g)       html中其餘經常使用標籤的使用

                     i.            <b>留心昂</b> 加粗

                   ii.            <u>尤文圖斯</u> 下劃線

                  iii.            <s>yiyiyi</s> 刪除線

                  iv.            <i></i> 斜體

h)       <pre>原樣輸出 文本里面有換行 也會還行

 

i)         <sub> 下標

j)         <sup> 上標

k)        ************

l)         <div> 能夠自動換行

m)      <span> 都會在一行顯示

n)       <p> 段落標籤

 

  1. html 頭標籤的使用 :

a)       在head裏的標籤 叫頭標籤

                     i.            title: 表示在標籤顯示的

                   ii.            meta: 能夠設置頁面的相關的內容

                  iii.            <meta name="keywords" contenet="liuxinang,asasooo 在早期的搜索引擎會找keyword關鍵字搜索內容 如今不用了" >

 

  1. 框架標籤 : 用的時候要 刪除 <body> 直接寫在head外面

a)       <frameset> rows 按照行進行劃分  <frameset rows="80,*"> *表示剩下的部分都是

                     i.            eg:   <frameset rows="100,*">

1, <frame name="" src="a.html"/>

2, <frame name="" sec="b.html"/>

  1. </frameset>

b)       有點相似j2se的frame插入panel label 等等。。。 

c)        如今基本沒人用這個 都是用div

                     i.            塊級元素

                   ii.            在瀏覽器中顯示:

                  iii.            塊級元素自佔一行

                  iv.            上面第二個元素並無和第一個元素在同一行顯示,而是自動換行,每一個塊級元素都自佔一行

 

  1. html中的中文亂碼問題:utf-8 和 GB2312 的區別  系統默認必定不會有中文亂碼

 

a)       DAY1總結 :

                     i.            html操做思想 使用標籤把要操做的數據 修改標籤的屬性值 進行修改

                   ii.            經常使用標籤 font屬性 size 1—7 color 英文 或 16進制

1, 標題標籤 h1....h6 愈來愈小 會自動換行

2, 註釋 <!--  -->

3, 列表標籤 <dl><dt上層 ></dt><dd下層></dd></dl>

4, 有序<ol type="1,a,i"><li></li><ol>

5, 無序<ul><li></li></ul>

6, 圖像標籤 <img src="" width height alt="鼠標放上去顯示的文字"/> alt兼容差

7, 路徑 相對路徑  在同一目錄直接寫   下一集目錄 ???\。。。  上一層目錄 ../

8, 超連接標籤 <a href="路徑" target="_self如今頁面打開 _blank新窗口打開 默認_self"/>

9, 表格標籤 *****

10,            <table> <tr><td></td>或<th></th>加粗居中單元格 </tr> </table>

11,            表單標籤 最重要*** 註冊登陸能夠使用表單標籤

12,            <from></from>屬性: 表示表單範圍

                                                        i.            action : 提交到的地址

                                                      ii.            method : 提交方式 post  get.

                                                     iii.            enctype:上傳時用到

  1. multipart/form-data:
  2. 一、當咱們上傳的含有非文本內容,即含有文件(txt、MP3等)的時候,須要將form的enctype設置爲multipart/form-
  3. data。
  4. 將表單中的數據變成二進制數據進行上傳,因此這時候這時若是用request是沒法直接獲取到相應表單的值的

13,            輸入項 :

                                                        i.            普通輸入項 <input type="text"/.

                                                      ii.            密碼 type="password"

                                                     iii.            單選 ;radio

                                                     iv.            複選 : checkbox

                                                      v.            下拉框 <select name=""><option value=""></opton></select>

                                                     vi.            文本域 :<ttxtarea cols="用行和列定義大小" rows="" name=""></textarea>

                                                    vii.            文件 file

                                                  viii.            提交按鈕 ; submit

                                                     ix.            重置 : reset

                                                      x.            使用圖片提交 : <input type="image" src=""/>

                                                     xi.            普通按鈕 button

                                                    xii.            隱藏項 : hidden

b)       div自動換行  span  在同一行顯示

c)        框架標籤 不是重點

 

 

 

 

 

css與js js是重點

    css 層疊樣式表 層疊:強調優先級  樣式表:有不少屬性值

    是頁面的顯示效果很好 分離屬性 使代碼很好維護‘

 css 和 html 的結合方式 有4種:

    1,每一個html上都有style屬性 把css與html結合在一塊兒

      <div style="color:字體顏色   之間用,隔開">帥帥啊啊</div>

    2,使用 <style>標籤 寫在<head>裏

       <head>  <style type="text/css'>

           div{  background-color:red;} 要用大括號 指明對象

           </style></head>

       <body><div>asdhAHD</div> </body>

    3,在style標籤裏 使用語句   這樣能夠直接修改css 實現分離  能夠直接改css文件 實現大面積更改

       @import url(css文件路徑) 後綴名就是 .css 在css文件裏直接寫 代碼 div{background-color:red;}

      在html中進行引用 :寫在head裏面

       <style type="text/css">

           @import ur(XXX.css);

       </style>

    4,*** 使用頭標籤link 來進行實現  也要寫在head裏面

       <link rel="stylesheet(樣式表)" type="text/css" href="css文件路徑"/>

 

    第3中結合方式 在一些瀏覽器下不兼容 不多用 通常用地4種結合方式

 

  css的優先級 :

    單獨在標籤內定義的 優先級最高

    由上到下 後加載的優先級最高

      css的選擇器 :

    基本選擇器:

       標籤選擇器:使用標籤名做爲選擇器的名稱

        

       class選擇器:每一個html標籤都有一個屬性

           <head><style type="text/css'>

              div.haha{  指定元素進行更改}

              .haha {只要class爲haha的 都更改樣式 }

           </style></head>

           <div class="haha">asd</div>

       id選擇器 :

           每一個html都有id屬性

           <head><style type="text/css">

              div#haha{ 這樣設置 }

              #haha { 只要id爲haha的 都更改樣式 }

           </style></head>

           <div id="haha">asda</div>

 

         基本選擇器優先級 :  後加載的優先級高

           style選擇區 》id選擇器 》 class選擇器 》標籤選擇器

 

    css擴展選擇器 :

       關聯選擇器:<div><p>asdasd</p></div>  <p>dasd</p>  有兩個p標籤 指定divp 變化

           <style type="text/css">  div p { 之間用空格隔開 &nbsp; }

       組合選擇器 : <div>213a</div>  <p>SDaa</p> 把div和p設置成同一種樣式

              <style type="text/css" > div,p{用逗號,隔開}

       僞元素選擇器 : css提供了定義好的樣式 能夠直接使用

             好比使用超連接{ :link 未訪問前的樣式原始狀態 :hover 鼠標放上去的狀態 :active點擊 :visite鼠標以後的狀態 }

          <style type="text/css"> a:link{ 更改未訪問前的樣式原始狀態 的樣式}

         記憶的方法: lv ha

          

   css 盒子模型 : 有三個重要概念  { 邊框 內邊距 外邊距 }

    邊框 border 統一設置 { 上 border-top 下 bprder-bottom 左右同理}

       內邊距(文字到邊界的距離) padding:統一設置 四面的距離  padding-left:設置左邊的頁邊距

       外邊距 margin 能夠贊成設置 -left 等等。。。

   css的佈局的漂浮:float(用的少 由於可能不兼容) :有兩個屬性值 left right 相反的 

              left  文本流向對象的右邊  right 文本流向左邊

   

css佈局的定位:

    postion : 屬性值 : static ,absolute , relative

       absolute : 將文件從文件流中拖出,絕對定位 right top bottom

       relative :  不會把對象從文檔流中拖出

eg: div{

       postion : absolute;

 

圖文混排案例(新聞推送樣式  圖片左邊 文字右邊

    把文字圖片放進div區域

<style type="text/css" >

    #imgtext{width 350px,;height:300px;border:2px dashed orange;}

    #text{float:right; color:green;}

<div id="imgtext">

    <div><img src=""/></div>

    <div id="text">大時代</div>

</div>

 

讓字寫在圖片上(圖像簽名)

<style type=="text/css">#text{postion:absolute; 定位字體 進行絕對定位 }

    <div><img id="img" src="" width="250" height="200"/></div>

    <div id="text">hello </div>

 

內容總結 :

    1.css和html的4中結合方式 ***** { 使用style屬性 直接寫 用:;隔開}

       使用<style 標籤

       使用<style 進行 @import url(外部文件 用的少

       使用 <link rel="stylesheet" type="text/css" href="地址 "  使用頭標籤

    2.css優先級  通常後加載的優先級高

    3.css的基本選擇器 ****** 標籤選擇器 class選擇器。加名稱   id選擇器#加名稱

       優先級: style > id > class > 標籤

    4.css的擴展選擇器 

       關聯選擇器  div 李嵌套p div p {}

       組合選擇器 div,p{}

       僞元素選擇器 超連接狀態

           原始 :link

           懸停 : hover

           點擊 : active

           點擊以後 : visited

    5.盒子模型

       邊框 border:2px solid red ;

       內邊距 pading :20px

       外邊距 margin:20px

        上下左右 : top bottom right left

        對數據進行操做 須要把數據放 一個區域裏 (通常用div

    6.佈局的漂浮

       float : left right 這裏的定位是相反的!!

    7.佈局的定位

       postion:absolute ;絕對定位 從文檔流拖出

           relative :不會拖出

       圖文混排—— 設置float

       圖像簽名—— 把文字顯示在圖片上 吧文字的div設置爲 postion:absolute。

 

 

 

javascript

    簡介:基於對象和事件驅動的語言 (應用於客戶端

    ——基於對象:提供了對象 能夠直接使用

    ——事件驅動:html作的網站都是靜態的效果 js作的都是動態的效果

    ——客戶端:指瀏覽器 或者 像 apicloud

特色 :

    交互性 :信息的動態交互

    安全性 :js不能直接訪問本地磁盤的文件

    跨平臺性 :瀏覽器均可以運行

    js只須要解析就能夠運行

js的組成 :三部分

    ECMAScript:ECMA 是歐洲計算機協會 制定語法

    BOM : broswer object model --  瀏覽器對象模型,瀏覽器裏的空間等等

    DOM : document object model -- 文件對象模型,網頁裏的內容能夠對內容進行操做

 

js 和 html的結合方式 (有兩種

    1 使用一個標籤 <script type="text/javascript">

    alert("alert能夠彈出一個框");

    </script>

    2 使用script標籤 引入一個外部的js文件

    ***建立一個js文件 寫js代碼

       <script type="text/javascript" src=" 引入js文件路徑"> 若在此處寫入js代碼 不會執行 </script>

             

  原始類型和聲明變量

    Java的基本數據類型 byte short int boolean long double float

 

    定義變量 都是用關鍵字 var

    Js 的原始類型 5個——string number boolean null undifined

       string:字符串 eg{var str = "abc";

       number:數字類型 var m = 123;

       boolean:true false  var flag=false;

       null: var date = new Date();  表示獲取對象的引用 null表示對象引用爲空 全部對象的應用也是object

       undifined: 定義了一個變量 沒有賦值

    typeof(); 能夠查看當前變量的類型

  js裏面的語句 :

    if(a==5){ alert("5");}

   

    switch(a){

       case 5 : break;

       case 6: break;

       default:....} 跟java同樣、

 

    循環語句 while do while for 都有

   

  js的運算符

    js裏沒有小數 123/100 = 1.23

   

    var str ="1233"

    alert(str+1); ----"12331"  跟java相同

    alert(str-1); ----"1232"   直接進行減法 若str不是數字進行相減會提示NaN 報錯

 

    boolean

       var flag = true:等於1

       若是設置成true值爲1 若是設置false值爲0

 

        var a = "5";

       if(a==5){alert("5")}else{alert("other")} 輸出5

       if(a===5){alert("5")}else{alert("other")} 輸出other

       *** 兩個等號比較值 三個等號比較值和類型

    引入知識: 直接向頁面輸出語句(直接顯示在頁面上

           document.write("直接輸出在頁面上");

           document.write("<br/>");

           document.write("<hr/>"); 輸出變量固定值和html代碼

 

  js的數組 ( 能夠存放不一樣的數據類型

    定義方式 3種 

       第一種 : var arr  = [1,2,3,4,「as」,true];

       第二種 : 使用內置對象Array對象

           var arr1 = new Array(5); 有5個元素

           arr1[0] = "1";

       第三種 : 使用內置對象 Array

           var arr2 = new Array(3,4,"d"); 傳入多個表示直接定義

           有length屬性

 

  js裏的定義函數 有三種方式

    1, 使用到一個關鍵字 function

       function 方法名 (參數列表){

           方法體;

           返回值 無關緊要(跟Java不一樣)

           }

    2.匿名函數

       function (參數列表 ){

           方法體;返回值;}

       var add3 = function(){}

           能夠這樣調用匿名函數

    3.使用js裏面內置的對象 function (用的少)

       new function("參數列表","方法體返回值」);

 

  JS的全局變量和局部變量

    全局變量 : 在scropt標籤裏的定義一個變量 這個變量在頁面js部分能夠使用

    局部變量 : 只能在一部分使用 在方法內部使用

 

  script標籤位置  (能夠放在任何的位置)

    通常放在</body>的後面 必定會執行

   

  js沒有重載*** 但能夠用其餘方式模擬重載

   

 

JavaScript基礎 & DOM

    js的String對象

       建立String對象 var str = "abc";

    方法和屬性

    <script type="text/javascript">

 

    方法:

      與html相關的方法

      與java類似的方法

   

    與html相關的方法

       bold() 加粗  str.bold();

       fontcolor() 字體顏色 str.fontcolor();

       fontsize(1-7) 設置字體大小

      

       link(url) 將字符串顯示爲超連接{ str.link("hellp.htm");

 

       sup sub 上下標

       document.write(s1.sub());

    與java類似的方法

       concat 方法(合併字符串: var str1 = "ac"; var str2 = "dd";

              document.write(str1.concat(str2)); 

       charAt 返回制定位置的字符串 :

           var str = "acbf";

           document.write(str.charAt(0)); 輸出a  若字符的位置不存在 則返回空字符

       indexOf 返回指定字符所在的位置 若沒有則返回-1

       split 切分字符 根據制定字符切分紅數組  { var str = "a-f-g"; var arr = str.split("-"); document.write(arr.length);

       replace 替換字符串 ( 要傳遞第個參數 第一個替換第二個 ) { var str = "acb"; str2.replace("a","g"); //輸出 gcb

       substr() 和 substring() 區別 :

           var str = "abcdefghuiop";

           document.write(str.substr(5,3));    輸出 fgh

           document.write(str.substring(5,3));    輸出de

          substr 從第幾位開始向後截取幾位

          substring  從第幾位開始截取到第幾位 不包含第二位上的字符

 

  js的數組 Array對象

    建立數組 3種

       var arr = [1,2,3];

       var arr = new Array(3);

       var arr = new Array(1,"a",2);

       ——————

       var arr = [];   建立一個空的數組

       var arr = new Array(); 建立一個空的數組

 

       concat方法  鏈接數組 arr1.concat(arr2);

       join() 根據指定字符分割數組 能夠將默認的 , 分割符替換{

           var arr = new Array(3);

           arr[0] = "a";arr[1] = "b";arr[2] = "c";

           document.write(arr.join("-"));

       push() 向數組末尾添加元素 **返回數組新的長度 

            若是傳入數組的話 先將要傳入的數組轉化爲字符串 在將字符串傳入

           var arr = ["a","b","c","tom"];

           document.write(arr.push("lxa"));  //應該輸出長度 爲何是數組???

           //輸出  a,b,c,tom,lxa

       pop()  會返回數組最後的元素 並將數組最後的元素刪除

           var arr = ['b','tom',"ann"];

           document.write(arr.pop());  輸出:ann

           document.write(arr);  輸出:b,tom

       reverse() 元素倒敘排列

           var arr = ["lxa","zjy","hhh"];

           document.write(arr.reverse()); 輸出: hhh,zjy,lxa

       shuffle() 隨機打亂

    js的Date對象 時間對象

    java裏:Date date = new Date();  //格式化 轉化成習慣的時間 —— toLocaleString()

   

 js裏獲取當前的時間

    var date = new Date();  document.write(date); 得出的格式不習慣

    轉化爲習慣的格式:

       toLocaleString() : document.write(date.toLocaleString()); // 輸出 :2018年2月13日 13:13:22

    獲得具體時間的方法

       獲取年的方法 : getFullYear(); 返回四位數字的年份

       獲取月的方法 :  getMonth() : **只能的到0-11 因此要+1

       獲取星期的方法 :getDay() : 星期,返回的是 0-6  **星期日返回的是-0  星期一到星期六返回1-6

       獲取當前的日 : getDate() : 獲得天 1-31

       獲取當前的小時 (如下幾個方法最後都有s) : getHours() :

       獲取當前的分鐘 : getMinutes()

       獲取當前秒:    getSeconds()

       獲取毫秒 :       getTime()  --- 返回1970。1.1 至今的毫秒數

           應用場景 : 能夠用於來處理緩存的效果 不讓有緩存 { http://www.baidu.com?毫秒數  用毫秒數做爲參數

      

  Math對象 (進行數學的運算

    這個對象都是靜態方法 直接使用Math.方法();

    abs()絕對值

    ceil()進行向上舍入

    floor() 向下舍入

    round() 四捨五入  (java裏是rint 方法 )

    random()隨機數 ( 僞隨機數 返回0-1之間的隨機數

    max(a,b) 返回大的 min 返回小的

    pow (a,b) a的b次冪

 

   js的全局函數  不屬於任何一個對象

    直接寫名稱就能夠使用

    eval() 直接寫就行 : 執行js代碼 (能夠使用這個方法直接來執行): eval("laert("111")"); 直接彈出111

    encodeURI()decodeURI()  對字符進行編碼 解碼 中文亂碼須要解碼

       var ste = "中文";

       var encode = encodeURI(str) 變成亂碼;  var decode = decodeURI(encode) 解碼亂碼 ;

    isNaN()  判斷當前的字符是否是數字 

       var str = "aaa" isNaN(str) 返回true

       *** 是數字返回false 不是數字返回true

    parseInt() 類型轉換 字符轉化爲number JS沒有int

    parseFloat() 意思差很少

  js裏沒有float類型 ? 方法啥意思?

 

 js函數的重載 : *** 不存在重載  可是能夠經過其餘方式 模擬重載 在每一個函數裏都有數組arguments

    面試題目 : 不存在重載 但能夠經過 數組arguments模擬重載

    eg :   function add () {  if(arguments.length == 2) { return .... }

 

  js的bom對象 : 瀏覽器對象模型  Browser

       對象 :

           navigator (英文翻譯 領航員 :

              navigator.appName  顯示瀏覽器名稱 ( 沒有加「()」)

           screen  :屏幕的信息  screen.width  screen.height  像素高 寬

           location  : 請求的url地址 

              href屬性 : 獲取到請求的url地址

                      設置url地址 :頁面上安置一個按鈕 按鈕能夠打開新網頁

                     須要一個鼠標點擊時間 onclick="js方法()";

                     <input type="button" value="tiaozhuan"  onclick="href1();"/>

                     <script type="javascript/css" >

                     function href1 (){location.href = "hello.html";}

                     </script>

           history  : 歷史對象 請求的url的歷史記錄

              eg: 建立a.html 超連接到 b.html

                  建立 b.html 超連接到 c.html

                  建立<input type="button" value="next" onclick="back();">

                     <script type="javascript/css" > function back(){history.back(); //回到上一個頁面}

                     function next(){ history.forward(); //到下一個頁面

                  建立 c.html

                 

           window  ***  窗口對象  頂層對象(全部bom都是在window裏進行操做

             方法 :

              alert() 全稱是 window.alert() 彈出一個框 顯示內容 能夠簡寫爲alert

              confirm()  確認框 : <script type="javascript/css" >var flag =  window.confirm("這是確認框"); </script>

                  會返回 肯定 和 取消 兩個值

              prompt() 輸入對話框 : 不多用 有兩個參數 在框裏面顯示的內容 和 輸入框的默認值

              open()  打開一個新的窗口 :

                 open("打開新窗口的url地址","","窗口特徵 高 寬  width=100,height = 200")

              close()  關閉窗口

           作定時器:

              setInterval("js代碼","毫秒數")  在制定週期 調用js代碼 必定要設置id

                  window.setInterval("alert("111")","3000") 每3秒 alert一次111

              setTimeout("js代碼","毫秒數")  在指定的毫秒數 後執行 一會執行一次 必定要設置id

                  window.setTimeout("alert("111")","3000") 3秒後 alert 111

              clearInterval(setInterval 的 id) :清楚 setInterval

              clearTimeout(setTimeout 的 id) : 清除 setTimeout

             

  js的dom  文檔對象模型(都要封裝爲對象

    document object model

       文檔 : 超文本標記文檔 html xml

       對象 : 提供了屬性和方法

       模型 : 使用屬性和方法操做超文本標記文檔

    *** 能夠使用js裏的方法提供的對象 對標記行文檔進行操做

           想要對標記行文檔進行操做 首先須要 對標記型文檔裏面的全部內容封裝成對象

   

    js的dom對象:學dom裏面的屬性方法

       須要把html裏的標籤 屬性 文本 內容都封裝成對象

    要想對標記型文檔進行操做 解析標記型文檔

       分析如何使用dom解析html :

           會在內存中分配一個樹形結構 根據html層級結構  在內存中分配一個樹形結構  把html中的每個部分都封裝爲對象 (只能有一個根節點 在根節點下面多個子節點 若是下面沒有子節點 就叫作葉子節點

      

 

      

DHTML:是不少技術的簡稱

       Html  封裝數據

       Css  使用屬性和屬性值設置樣式

       Dom   操做html文檔 ( 標記型文檔

       Javascript  專門指js語法語句

 

  document對象 整個文檔

    每一個載入瀏覽器的html文件 都將成爲一個document文件

 

    write方法:

       想頁面輸出變量值

       向頁面輸出html代碼

      

    ***** 返回的是數組類型 須要遍歷  就算只有一個元素依然返回數組Object

    getElementById() 方法: 不返回數組 直接返回標籤 準確!***

       經過id獲得元素(標籤

       使用getElementById獲得input標籤

         var input1 = document.getElementById("nameid");

         //獲得input裏面的value值

         alert(input1.name);

         input1.value = "cccc";

         //向input裏設置一個值value

        

    getElementsByName() 方法 通常會返回一個數組Object

       <input type="text" name="n1" value="aaa"/>

       <input type="text" name="n1" value="bbb"/>

       <input type="text" name="n1" value="ccc"/>

       <script type="text/javascript">

           var inputs = document.getElenemtsByName("n1"); // 返回一個數組

       </script type="text/javascript">

 

    getElementsByTagName() 方法  : 經過標籤類型名稱 返回數組object

       var input1 = document.getElementsByTagName("input");

            input1 是一個object數組

   

    *** 只有一個標籤 這個標籤只能使用name獲取 使用getElementsByName返回的是一個數組 可是隻有一個元素 這時不須要遍歷 能夠直接經過數組獲取內容

 

  案例 : window彈窗案例 ( 會有一個問題: 這個過程訪問了本地文件 chrome不能用... 實際開發中不會反問本地文件 不會出現這個問題)

    實現過程 :

       建立一個頁面 有輸入項和按鈕 按鈕上事件:彈出一個新窗口(表格 每個有一個編號和姓名,按下按鈕後再上一個頁面輸入內容)

       須要誇頁面操做 須要方法opener

       opener()方法 : 表示能夠獲得建立這個窗口的上一個窗口

           var pwin = window.opener;  //返回上一個頁面 ***

 

 

 

 

 

 

 在末尾添加節點:

    <ul>

       <li>123</li><li>22</li><li>33</li>

    </ul>

    若要添加節點 1 建立li標籤 2,建立文本 3.把本文加入 li 4,把li加入ul

    具體方法 :

       function add(){

           var ul1 = document.getElementById("");(對它操做先要獲取它

           //接下來建立標籤

           var li1 = document.createElement("直接寫標籤的名稱 li");

           //接下來建立文本

           var text = document.createTextNode("這裏是文本");

           //吧文本添加到li下面

           li1.appendChild(text);   //Node 英文翻譯——節點

       }

    1,獲取ul標籤 getElementById

    2,建立li標籤 createElement

    3,建立文本 createTextNode

    4,把文本添加到li下 appendChild

 

    Element對象:

       要操做element對象 要先獲取到element

           使用document 相應的方法

           獲取屬性的值: 先獲取標籤

              var input1 = document.getElementById("");

              獲取value :

              1,input1.value

              2,input1.getAttribute 也能夠獲取 更好用

              3,input1.setAttribute("要設置的屬性的名稱","要設置的值")

                  attribute 英文翻譯——屬性

              ——移除屬性 removeAttribute("要移除的屬性名稱");**此方法removeAttribute不能移除value

          

       若想要獲取到ul下面全部的子標籤

       <script type="text/javascript">

           //獲取ul標籤

           var ul1 = document.getElementById("");

           //獲取下面的子標籤

           ((( 不要用!!!!  ——  var array = ul1.childNodes; ( 這個方法返回的是 數組 *** 瀏覽器的兼容性差

           var lis = ul1.getElementsByTagName("要查找的標籤");

              *** 這是得到標籤下子標籤的 惟一 有效方法!!!

       </script>

 

    Node對象屬性:

       nodeName 

       nodeType

       nodeValue

         這三個方法 在不一樣環境下的應用:

           標籤節點對應的值:

              nodeType;1 (最重要 要記住***

              nodeName:大寫的標籤名稱 好比SPAN

              nodeValue:null

           屬性節點:

              nodeType:2

              nodeName:屬性的名稱

              nodeValue:屬性值

           文本節點:

              nodeType:3

              nodeName:#text

              nodeValue:文本內容

          使用dom解析html時,須要html裏面的標籤 屬性和文本都封裝成了對象

          

       獲取文本的方法: firstChild  後面沒有()!!!

 

 

  Node對象的屬性:

 

    父節點 子節點 同輩節點:關係顯而易見

   

    父節點的屬性:parentNode 獲得父節點

    子節點:childNodes:獲得全部子節點,兼容性差 ***不要使用

       firstChild 獲取第一個子節點

       lastChild 得到最後一個節點

    其餘屬性:nextSibling:返回指定節點的下一個兄弟節點

         previousSibling : 返回一個制定節點的上一個兄弟節點

           Sibling  翻譯——兄弟姐妹

 操做DOM樹:

    appendChild 方法     append翻譯——追加

       添加子節點到末尾 特色:相似於剪切***

    insertBefore(newNode,oldNode) 在某個節點以前插入新的節點 此方法必須用在父標籤上

       兩個參數:*要插入的節點

             *再睡以前插入

       插入一個節點 節點不存在, 建立 1,標籤 2,文本 3,把文本添加到標籤下面

    沒有insertAfter方法

    *** removeChild 刪除節點,用經過父節點進行刪除,removeChild要在父節點上進行使用

    eg{

       <script type="text/javascript"/>

       function remove(){ /*1,獲取li標籤 2,獲取父節點標籤 3,執行刪除

           var li2 = document.getElementById("");

           var ul2 = li2.parentNode 或 var li2 = document.getElementById();

           ul2.removeChild("li2");

    *** replaceChild(newNode,oldNode)替換方法 也是經過父標籤進行

       不能替換本身 , 要經過父節點

       第一個參數 ——新節點

       第二個參數——舊節點

    eg{

       1,獲取li

       2,建立新標籤

       3,建立文本

       4,把文本添加到li下

       5,進行替換

       <script type="text/javascript"/>

       function replace(){

       var liOld = document.getElementById();

       var liNew = document.createElement("li");

       var text = document.createTextNode("lxa");

       liNew.appendChild(text);

       var parentUl = document.getElementById("ul") 或 liOld.parentNode;

       parentUl.replaceChild(liNew,liOld);

    }  

   

    *** cloneNode(boolean) 複製節點,裏面參數 boolean類型 表示是否複製節點

    eg{

       1,獲取ul

       2,執行復制cloneNode true

       3,把複製的內容放到div裏

           獲取div

           appendChild方法

       var ul = document.getElementById();

       var ulcopy = ul.cloneNode(true);

       var div111 = document.getElementById();

       div111.appendChild(ulcopy);

    }

   

    *** insertBefore : 在某個節點以前插入

        appendChild : 在末尾添加,剪切

        removeChild : 經過父節點刪除

        replaceChild : 替換經過父節點

        cloneNode : 複製節點

 

    innerHTML屬性:

       不是DOM組成部分,大部分瀏覽器都支持

      1,獲取文本內容

      2,向標籤裏面設置內容

        <script type="text/javascript"/>

       var span1 = document.getElementById();

       span1.innerHTML; —— 獲取標籤裏的文本內容

 

       div22 空的div

       div22.innerHTML = "<h>lxalxa</h>"; —— 直接寫代碼

       /* 添加表格

       var tab = "<table><tr><td>asd</td></tr></table>";

       div22.innerHTML = tab ;

    動態顯示時間:設置計時器 用innerHTML寫入時間

       function time(){

       var date = new Date();

       var d = date.toLocalString(); 此處爲字符串類型

       var div1 = document.getElementById();

       div1.innerHTML = d ;

       }

       setInterval("time();",1000)

   

    &&& 總結:

       getAttribute

       setAttribute

 

       獲取子標籤 惟一 方法 getElementByTagName

       nodeType

       nodeName

       nodeValue

       appendChild 能夠添加到末尾 有剪切黏貼的效果

       insertBefore(新節點,舊節點) 執行添加經過父節點進行

       removeChild 經過父節點

       replaceChild(新節點,舊節點)

       cloneNode(true)boolean表示複製子節點

       innerHTML***

           能夠獲取文本內容,能夠向標籤裏設置內容能夠設置html代碼

      

 

  全選練習: 使用複選框上的checked屬性

    建立一個頁面

    複選框和按鈕(按鈕上有事件

       四個複選框表示愛好

       還有 全選 反選 撤銷 按鈕

    <body>

       <input type="checkbox" id="boxid"/>全選/全不選

       <input type="checkbox" name="love"/>籃球

       <input type="checkbox" name="love"/>足球

       <input type="checkbox" name="love"/>羽毛球

       <input type="checkbox" name="love"/>乒乓球

       <input type="buttom" value="全選" onclick="all();"/>

       <input type="buttom" value="全不選" onclick="no();"/>

       <input type="buttom" value="反選" onclick=:other();:/>

    </

    <script type="text/javascript">

    function all(){

    var arr = document.getElementsByName("love");  返回的是數組 Elements 有s!!

    遍歷數組

    for(var i=0 ; i<arr.length;i++){

       var arrNumber = arr[a];

       arrNumber.checked=true ;    經過checkbox裏的 checked屬性進行操做

    }

    function on(){

    var love = document.getElementsByName("love"):

    for(var i =0;i<love.length;i++){

       var love = love[i];

       love.checked = false ;

    }

    }

    function other(){

       var love = document.getElementsByName("love"):

    for(var i =0;i<love.length;i++){

       var love = love[i];

       if(love.checked==true){love.checked=false}一個等號賦值 兩個等號判斷

       相反。。。

    }  

 

  案例:下拉列表左右選擇(添加到。。

    <body>

    <div>

    <select id="select1" multiple="multiple"(** 能夠把內容都顯示出來)style="width:100px;height:100px;">

       <option>aaaa</option>

       <option>abbba</option>

       <option>accca</option>

    </select>

    <input type="buttom" value="添加到右邊" onclick="add();"/>

    <input type="buttom" vale= "所有添加到左邊" onclick="alladd();"/>

    </div>

    <div style="float:left;">

    <select id="select2" multiple="multiple"(** 能夠把內容都顯示出來)style="width:100px;height:100px;">

       <option>dddda</option>

    </select>

    </div>

    </body>

    <script type="text/javascript">   

    function add(){

       var select1 = document.getElementById("select1");

       var select1 = document.getElementById("select2");

       var arr = select1 .getElementsByTagName("option"); 返回數組

    for(var i=0;i<arr.length;i++    ){

       var option1=arr[i];

       if(option1.selected ==true){select2.appendChild(option1); *** i-- ; 這樣能一直使用!!!由於appendChild方法相似於剪貼 因此不須要刪除}

    }

    function addall(){

       var s2 = document.getElementById();

       var s = document.getElementById();

       var ops=s.getElementByTagName();

       for(var h==0;h<ops.length;h++){var op1=ops[h];s2,appendChild(op1);h--;此處同理};

    }

 

  案例: 省市聯動 (選北京 有 海淀昌平。。 選上海有靜安寶山。。

    建立一個二維數組來存放數據,第一個是國家名稱,第二個國家城市 ,

    <body>

    <select id="country">

       <option>中國</option>

       <option>美國</option>

       <option>意大利</option>

    </select>

    <select id="city">

      

    </select>

   

    <script type=」text/javascript」>

       Var arr = new Array(3);   此處爲二維數組

       ar[0]=[「中國」,」上海「,」杭州」];

       ar[1]=[「美國」,」底特律「,」紐約」];

ar[2]= [「意大利」,」米蘭「,」都靈」];

 

    function add( val ){ 1,遍歷數組 2,獲取第一個值對照 3,獲取後面的值4,獲得citySelect 5,加到第二個select,要建立option

       var city1 = document.getElementById(「city」)

       for(var I = 0 ;i<arr.length;i++){  //獲得二維數組裏的每個值

           var arr1 = arr[i];

           var coutry = arr1[0];

           if( val == coutry) {//獲得後面的元素

           // 先將以前存在city裏的option刪除掉 ***

           Var city1 = document.getElemenetById(「city」);

           Var arr2 = city1.getElementByTagName();’

              for(var j=1;j<arr2.length;j++){    //這裏爲何不是 0 ???

              var value = arr2[j];

              city1.removeChild(value);

           }

           For(var I = 1i<arr1.length;i++){

              Var value1=arr1[i];

               Var option = document.createElement(「option」);

Var text = document.createTextNode(value1);

Option.appendChild(text)

City1.appendChild(option)

           }

       }

 

    案例:動態生成表格  ( tab的寫法是重點

       <input type="text" id="h"/>

       <input type="text" id="l"/>

       <input type="buttom" value="生成" onclick="add();"/>

 

       function add(){

       //獲得輸入的數字

         生成表格 進行循環 顯示到頁面上-把表格的代碼設置到頁面上 (使用innerHTML

       var h = document.getElementById()。value;

       var l = document.getElementById().value;

       var tab = "<table>";

       循環: for(var i=1 ; i<=h;i++){

           tab+="<tr>";

           for(var j=1;j<=l;j++){

              tab+="<td></td>";

           }

           tab+="</table>";

           var div11 = document.getElementById();

           *** div11.innerHTML = tab;

           }

    總結: 在末尾添加節點: 建立一個標籤 createElement

              建立文本額 createTextNode

              添加文本之標籤 appendChild——相似剪切黏貼效果

             

       獲取標籤下的自標籤:getElementByTagName

       Node對象: nodeType nodeValue nodeName

       操做DOM樹:

           父節點:parentNode   如下方法都是從父標籤進行操做   

           insertBefore —— 沒有nsertAfter方法

           removeChild  

           replaceChild 

       innerHTML:獲取文本內容

             標籤裏設置內容

       案例:動態時間 setInterval 

             全選連續 checked

             下拉列表左右選擇 multiple:讓下拉框的內容全顯示出來

             *** 省市聯動 二維數組 事件onchange(改變事件 方法 add(this.value//當前的value值)

             動態生成表格 innerHTML屬性 使用一個變量存放HTML代碼

 

  XML

    表單的提交方式 ***

    1.使用submit提交

    <from >

       <input type="submit"/>

    </from>

    2.buttom進行提交

    <from默認提交到當前頁面>

       <input type="buttom" onclick="tijiao();"/>

    </from>

    function tijiao(){

       //獲取form

       document.getElementById();

       //提交form,設置action

       form.action="頁面地址" 提交到的頁面,不寫就是本身的頁面

       form.submit();

    }

    3.超連接進行提交

    <a href="hello.html(提交到的頁面)/usename=123(要提交的值)">點我提交</a>

       如何實現動靜結合???

    4.onclick 鼠標點擊事件

      onchange改變內容(通常和select使用)

      onfocus 獲得焦點

      onblur 失去焦點

 

    <input type="text" name="text1" value="填寫" onfocus="focus1()" onblur="onblur1()";

    function focus1(){

       var input1 = document.getElementById();

       //效果相似於搜索框 一點以前裏面的內容就沒了

       Input1.value = 「空的」;

    }

    function onblur1(){

       var input1 = document.getElementById();

       input1.value = 「據說Creep很好聽」  // 相似於網易雲音樂

    }

 

  XML的簡介:

    什麼是XML ——可擴展標記語言,使用標籤進行操做 通常用於儲存數據  交換數據

    html裏的標籤都是固定的 都有特定的含義

    xml裏的標籤能夠本身定義 能夠寫中文

    xml的主要功能是 存儲數據

    xml是w3c組織發佈的技術

   

  XML的應用: 3個地方

    不一樣的系統之間進行傳輸數據

       qq之間數據的傳輸——發送的內容發送到 服務器 之間的傳輸格式:xml 有利於程序的維護

    用來表示生活中有關係的數據

    常常用在配置文件

  XML的語法:

    xml的文檔聲明 ***

       建立一個後綴.xml的文件

       若是寫xml 必定要有文檔聲明

       文檔聲明必須寫在第一行 <?xml version=」1.0」 encoding=」utf-8」?>

       屬性 version 版本用1.0

           encoding:編碼類型 gbk utf-8

       *** 文檔聲明:<?xml version="1.0"encoding="gbk"?>

    定義元素(標籤 ***

    定義屬性 ***

    特殊字符 ***

    註釋 ***

    CDATA區

    PI指令

   

        xml元素的標籤 (能夠隨便定義標籤

       標籤的定義:有開始必須有結束

       包含標籤主體

       只能有一個跟標籤,其餘的標籤都是下面的自標籤

       <aa>111</aa>

       <aa>

           111

       </aa>

       這兩個是不同的,xml中把空格換行都當成內容來解析

       xml不能以_開頭

       xml的標籤不能包含空格 冒號 而且區分大小寫

    xml屬性的定義:

       xml也是標記文檔 能夠有屬性

       <person id="a"></person>

      

    xml的註釋:<!-- 註釋內容 -->

       註釋不能放在第一行 第一行必須放文檔聲明

    xml的特殊字符:(相似html

       大於號 > 小於號 不能正常顯示 須要進行轉義

       < &lt;

       > &gt;

    xml的CDATA區:

       什麼叫CDATA : 能夠解決多個字符都須要轉義的操做 if(a<b && b<c && d>f)

         把這些內容放到CDATA區裏面 不須要轉義

         寫法: <![CDATA[內容]]>

           把特殊字符 看成文本內容 而不是標籤

    xml的PI指令: 經過PI指令引入css文件

           <?xml-stylesheet type="text/css" href="css的路徑"> 這個沒什麼用 通常xml都用於存儲 對中文的標籤不起做用

    全部xml都必須有關閉標籤

    必須有一個根元素,必須嵌套 (相似於樹結構

    屬性值加引號

    空格回車都會看成內容來解析

    <?xml version="1.0" encoding="utf-8"?> 聲明文件

   

    xml的約束:(主要經過dtd進行約束

       爲何要約束:

         好比如今定義了有個person的xml文件,只想要這個文件裏面保存人的信息,好比name age,若添加了一個 其餘的元素例如dick 能夠正常顯示,由於符合與法規範,可是不該該有這個元素,因此須要約束xml

    xml的約束技術: dtd的約束  schema的約束  —— 兩種約束

       dtd約束; 是爲了進行程序之間的數據交換而創建的標記語法

           dtd的快速入門:

           建立一個文件 後綴名: .dtd

           1,看xml之中有多少個元素,有幾個元素在dtd元素中寫幾個<!ELEMENT>

           2,判斷元素是簡單元素 仍是 複雜元素 ,若沒有子元素就是簡單元素 ,反之爲複雜元素

              若是是 複雜元素 <!ELEMENT 元素名(子元素)>

              簡單元素 <!ELEMENT 元素名>

           3,須要在xml文件中引入dtd文件

              <!DOCTYPE 根元素名稱 SYSTEM"dtd路徑」>

           打開xml文件使用瀏覽器 瀏覽器只負責校驗xml文件 不負責校驗約束文件

           若想校驗xml的約束 須要使用工具(myeclipse工具)

       dtd的引入方法:

           1,引入外部dtd文件

           2,使用內部dtd文件

              <!DOCTYPE 根元素名稱 [<!ELEMENT><><>]>

           3,使用外部的dtd文件

 

       dtd的約束:<!ELEMENT name(#PCDATA)> 表示必須是字符串類型

       使用dtd定義元素

           語法:EMPTY:元素爲空(沒有內容

           ANY:任意

       複雜元素:

           <!ELEMENT 元素名 (子元素,子元素。。。)》

              子元素只能出現一次

           表示子元素出現次數:

              +:表示出現一次或者屢次

              ?:表示0次或者1次

              *:表示0次或者屢次

 

    總結:

       表單提交方式 用buttom 獲得form 定義方法 form.action = "提交地址" form.submint()

                用href提交 <a href="網址?提交內容">

       onclick 鼠標點擊事件 onchange改變內容 onfocus獲得焦點 onblur失去焦點

       xml簡介:可擴展標記性語言

           應用在 數據傳輸 表示生活中有關係的數據 配置文件

           文件聲明必須寫在第一行 <?xml version="1.0" encoding=""?>

           xml區分大小寫 空格換行將被解析 註釋不能放在第一行 不能嵌套

           特殊字符轉義

           CDATA和PI

           DTD能夠進行約束

              建立dtd文件.dtd文件

              引入dtd文件:<!DOCTYPE 根元素名 SYSTEM "dtd文件路徑">

           dtd文件不會被自動校驗 能夠使用myeclipse進行校驗

           dtd的引入方式:

              外部引入 <!DCTYPE 根源宿命 SYSTEM "dtd路徑">

              內部 <!DOCTYPE 根元素名 [<!ELEMENT ...>]>

              使用外部文件 <!DCTYPE 根元素 PUBLIC "DTD名稱" "DTD文件的url">

           dtd定義元素: (#PCDATA)表示字符串類型 EMPTY表示空

 

 

   使用dtd定義屬性:

    語法: <!ATTLIST 元素名稱 dtd的定義之間必定要有空格

       屬性名 屬性類型 屬性約束

        , 逗號表示順序

       <!ELEMENT age(#PCDATA)>想在這個屬性裏面定義類型

       <!ATTLIST age

           ID1(屬性名稱) CDATA>

       屬性約束 :#REQUIRED 表示必須出現

              #IMPLIED 表示屬性無關緊要

              #FIXED "這裏是固定的屬性值" 表示一個固定值

              "這裏是值"

              <age ID="">若沒有寫id 就會默認爲上面的值

       屬性類型: CDATA 表示爲普通文本類型 —— 字符串

              枚舉 : (aa|bb|cc) 表示只能在必定的範圍內出現值 ,但只能出現其中一個

              相似紅綠燈效果

              #REQUIRED 表示必須出現

              ID:值只能是字母 下劃線 開頭

 

    定義引用實體: 在DTD中定義 在xml中使用

       語法: <!ENTITY 實體名稱 「實體內容」>

           引用方式: (在xml中使用) &實體名稱

              <!ENTITY 實體名稱 "內容">  在xml裏引用 &實體名稱; ( 這裏區分大小寫

                  引入後在xml裏直接顯示 內容

           ** 注意 : 定義實體須要寫在內部 dtd中,若是寫在外部dtd中 有可能用不了

   xml解析的簡介(用java ********

    * xml的標記型文檔

    js使用dom解析,根據html的層級結構 在內存中分配一個樹形結構,把html的標籤 屬性 都封裝對象

       有 document element 屬性對象 文本對象 node節點對象

**** xml的解析技術

       dom , sax  兩種解析技術

       dom: 根據xml的層級結構 在內存中分配樹形結構 ,dom解析文件若是文件過大,形成內存溢出,優勢: 方便進行增刪改

       sax: 採用事件驅動邊讀邊解析 讀到一個 返回一個

       從上到下 一行一行解析 解析到某一個對象 把對象返回

           使用sax不會形成stackoverflow 實現查詢

           使用sax 不能實現增刪改 操做

  想要解析xml 須要解析器

    針對dom sax 的解析器 經過api的方式提供

    sun 提供瞭解析器 —— jaxp (權威

    dom4j提供了 —— dom4j (實際用的最多

    jdom提供——jdom

   

  jaxp的api查看:

    是javase的一部分(都在 javax.xml.parsers 裏

       有四個類:分別是針對dom和sax解析使用的類

       dom : documentBuilder ;解析器類

             這個類是一個抽象類 不能new

              方法:

                  item(下標) 根據下表獲得具體值

                  getParentNode()獲得父節點

                  getElementsByTagName() 獲得標籤

                  createElement() 建立標籤

                  appendChild() 添加自標籤

                  createTextNode 建立文本

                  removeChild()從父節點刪除

             DocumentBuilderFactory ;解析器工廠

       sax ; SAXParser;解析器類

 

       使用jaxp實現查詢的操做

    建立一個xml文件

       <person>

           <p1>

              <name>lxa</name>

           </p1>

           <p1>

              <name>lll</name>

           </p1>

       </person>

    sax :

       SAXPerser

 

用jaxp 的dom 來解析xml:

    這時候能夠建立一個java的class

       public class jaxpTest{

           public static void main(String arg[]){

           1建立解析器工廠

           2根據解析器工廠建立解析器

           3解析xml 返回document

          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  instance——實例

           DocumentBuilder builder = dbf.newDocumentBuilder();

           Document(須要導入w3c document類) doc = builder.parse("src/person.xml");  (返回一個document

         Parse ----- 解析

           //隨後須要獲得因此的name元素

           NodeList list = doc.getElementsByTagName();

           for(int i = 0 ;i<list.getLenegth();i++ {

              Node name1 = list.item(i);

 Item()返回節點

              //獲得name元素裏的值

              String s = name1.getTextContent(); 獲得標籤裏的內容

              System.out.print(s);

           }

   使用jaxp查詢某一個節點

    查詢xml中的第一個name元素的值

      

   使用jaxp添加節點

    想在第一個p1的下面 添加一個sex標籤

    4,獲得p1

    5,建立sex標籤

    6,建立文本createTextNode

    7,把文本建立到sex   appendChild

    8,放入sex

       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

       DocumentBuilder builder = dbf.newDocumentBuilder();

       Document doc = builder.parse(地址);  *** 導入w3c的document包

       獲得全部的p1

       NodeList nl = document.getElementsByTagName("p1");

       Node p1 = list.item(0)  表示第一個p1

       Element sex = document.createElement("sex");

       Text t = document.createTextNode("man")

       sex.appendChild(t);

       p1.appendChild(sex);

    *** 最後必定要有 回寫 操做

    ***     Transformer 抽象類

       TransformerFactory  tf = TransformerFactory.newInstance();

       Transformer t = tf.newTransformer();

       t.transform(new DOMSource(document),new StreamResult(xml地址))

        完成添加

          

  jaxp修改節點

    修改第一個p下面的sex內容是男

    java文件:

    public static void modifySex() throws Exception {   modify——修改

       1,建立解析器工廠 解析器    

       2,解析xml 返回document

       3,獲得sex item方法

       4,修改sex裏面的值

       5,setTextContent 方法

       6,回寫xml文件

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    DocumentBuilder db = dbf.newDocumentBuilder();

    Document doc = db.parse("文件路徑") ;   parse —— 從文本分析

    Node sex = doc.getElementsByName().item(第幾個);

    sex.setTextContent("修改該內容");

    TransformerFactory tf = TransformerFactory.newInstance();

    Transformer t = tf.newTransformer();

    t.transform(new DOMSource(doc),new StreamResult("修改xml的地址"));

   

  jaxp刪除節點  sex節點

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    DocumentBuilder db = dbf.newDocumentBuilder();

    Document doc = db.parse("xml地址");

    Node sex1 = doc.getElementsByTagName("sex").item(0);

    Node parent = sex1.getParentNode();

    parent.removeChilder(sex1);

    TransformerFactory tf = TransformerFactory.newInstance();

    Transformer t = tf.newTransformer();

    t.transform(new DOMSource(doc

),new StreamResult("src//person.xml"));

   

  jaxp遍歷節點

    打印出全部節點

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    DocumentBuilder db = dbf.newDocumentBuilder();

    Document doc = db.parse("src//person.xml");

    //編寫一個方法進行遍歷

    list(doc);

      

    public static void list(Node doc){

       if(doc.getNodeType() == Node.ELEMENT_NODE){  判斷是否是element類型

           NodeList li = doc.getChildNodes();

           for(int i = 0 ;i<list.getLength();i++){

              Node node1 = list.item(i);

              //繼續獲得node1的子節點

              list(node1);  使用遞歸方法。本身調用本身。

           //xml解析會把全部東西都解析出來

           }  

       }

 

    總結:

       jaxp是重點

       表單提交方式 buttom提交  超連接提交  事件

       xml的文檔聲明 <?xml version="1.0" encoding="utf-8"?>  必須放在第一行

       CDATA與PI

       dtd約束 schema約束

           #PCDATA 字符串

           #REQUIRED 必須出現

          

       xml解析  dom容易內存溢出 能夠增刪改

           sax不能操做

           獲取所有元素getElementsByTagName返回的是數組

           setTextContent 修改標籤裏的內容

           getParentNode   removeChild

           遞歸遍歷方法

   

 

  Schema的介紹

    xml的schema約束

    xml有 dtd schema 兩種約束 : 一個xml中只能有一個dtd 有多個schema

    dtd語法:<!ELEMENT 元素名稱 約束 >

    schema語法 :符合xml的語法規範

       xml的語句

    一個xml能夠有多個schema 用名稱空間來進行區分 ( 相似於包名稱

    dtd裏面有PCDATA 可是在xml裏面能夠有更多的數據類型

       在schema裏面能夠直接定義一個整數類型

    schema語法更加複雜 目前不能替代dtd

 

    schema的快速入門:

       建立schema文件 —— 寫入語句

       看xml中裏面有多少元素

       也要遵循xml規範 <?version=1.0 encoding="utf-8"?>

       schema文件是一個約束文件 —— xml是被約束文件(schema本生就是xml文件’

       ** 在schema文件裏面使用提供屬性的標籤

           既然xml schema 都是xml文件 那如何得知誰是約束文檔?

 

           <schema xmlns="" targetNamespace="" elementFormDefault="">

       xmlns在一個schema文件裏面 叫作xmlns屬性 表示這是一個約束文件

       targetNamespace:直接經過這個地址引入約束文件

      

       首先看xml中有多少元素:

         <element name="">

       看簡單元素和複雜元素:

         若是是複雜元素:<complexType>  <sequence> 子元素 </sequence(排列順序的意思)>  </complexType>

         簡單元素 寫複雜元素

 

         在被約束的文件裏面 引入被約束文件

           <person(標籤名) xmlns:xsi="http://www.3c.org/2001/XMLSchema-instance"

           xmlns="http://http://www.itcast.cn/12333 (這裏是 schema文件的路徑"

           xsi:schemaLoction="約束文檔的地址路徑

    ** schema文件:

       xmlns="http://www.w3.org/2001/XMLSchema" 表示是約束文件

       targetNameSpace : 引入約束文件 使用  地址:url地址

       elementFormDefault="qualified"

      

    **  在xml裏面導入schema文件:

       在根節點裏面 xmls:xsi="http://www.w3.org/2001/XMLSchema-instance" 這些在被約束的根節點裏

              xmlns=""

              schemaLoction=""  這裏寫的是schema的路徑地址

   

    schema 規範:

       <?xml version="1.0" encoding="utf-8"?>

          <schema>  .... </schema>

       判斷是簡單元素仍是複雜元素

           簡單元素:

           <element name="xml裏的標籤名" type="數據類型">

           複雜元素:

           <all> 表示只能出現一次

           <choice> 表示只能 出現其中的任意一個 不能全都出現

           <maxOccurs="unbounded(表示出現次數"  這個屬性要寫在element中 表示這個元素標籤能夠屢次出險

           <any></any> : 表示能夠出現任意元素 

           <attribute name="id1" type="int" use="required"></attribute> 這表示在 約束文件的聲明標籤裏 強制要求一個屬性值 id1 類型int

              要卸載複雜元素裏面  卸載</complexType> 以前

                     

                  required——必須的

           Schema的名稱空間 ( :xsi  用於區分 schema文件

            

       若想要引入多個schema文件 須要給每一個起一個別名

 

  sax的解析原理:    parser——剖析器

    解析xml 有兩種技術 dom  sax

     dom:根據xml的層級結構 分配一個屬性結構 吧xml中的標籤屬性 文本都封裝成對象

     sax:是事件驅動的 邊讀邊解析

       在java.xml.parsers 包中

       SAXParsers 因爲是抽象類  不能使用new

   

    sax解析的過程 :

       xml文件

      

///¥¥¥ ArrayList 適於讀取 LinkedList適於添加

 

使用jaxp的sax方式解析xml

    這是xml文件:

    <?version=」1.0」 encoding=」utf-8」?>

      //聲明文件

    <person>

       <p1>  

           <name>lxa</name>

           <age>20</age>

       </p1>

       <p1>

           <name>zjy</name>

           <age>19</age>

       </p1>

    </person>

建立一個java :

    Public class Sax (Sax 解析模式)

       Public static void main(String arg[]   ){

           1,建立解析器工廠

           2,建立解析器

           3,執行parse方法

           4,建立一個class  要繼承 DefaultHandler

           5,重寫裏面的三個方法

          

       SAXParserFactory saxpf = SAXParserFactory.newInstance();

       SAXParser saxp = saxpf.newSAXParser();

       saxParser.parse(「xml地址」,此處是事件處理器);

       //parse方法 :

           第一個參數xml路徑 第二個參數 事件處理器

           重寫新的事件處理器 的三個方法。。

   

class MYDefault extends DefaultHandler {  //自定義事件處理器 。

    // 右鍵 source  -》 override 找到須要用的方法

        startElement

       characters

       endElement  這三個方法。。

       實例:

          獲取全部的name元素的值 經過一個boolean進行篩選

       // 接上內容

       Class myDefault2 extends DefaultHandler{

           重寫方法 :

           startElement  這個方法 返回 qName

              用qName 判斷

              If(「name」.equals(qName)){

                  //寫入內容 }

               

***  Dom4j 來解析 xml

    Dom4j是一個組織 針對xml的解析 提供了dom4j

    Dom4j 不是javase的一部分 想要使用須要 :

       導入don4j提供的jar包

1, 建立一個文件夾lib

2, 複製jar包到libxia         

3, 右鍵點擊 jar  build path  --add to buildpath

4, 看到jar包  變成一個奶瓶的樣子 說明導入成功

      獲得document

       SAXReader s = new SAXReader();

       Document doc = reader.read(url);

         Document的父接口是Node

           若是在document裏面找不到想要的方法 到Node裏去找

           Document裏面的方法getRootElement 獲取根節點 返回Element

           Element 也是一個接口 父接口是 Node

              getParent  獲取父節點

 

    使用dom4j來查詢xml

           查詢全部name元素的值:

1, 建立解析器

2, 獲得document

3, 獲得根節點 getRootElement

*** element elements 獲取的都是第一層的子標籤 !!!!

4, 獲得全部p1   element(qName)得到標籤下面的第一個子標籤 只返回一個Element elements(qName) 得到標籤下面的全部是qName的子標籤 返回list   elements() 獲取標籤下面的一層子標籤

5, 獲得name  並獲得裏面的值

下面是一個java文件

    //查詢xml之中全部name元素的值

       Public static void seletName(){

           //建立解析器 SAXReader sax = new SAXReader();

              Document doc = sax.read(「xml路徑」);   這裏是don4j的document

              Element root = doc.getRootElement();

              //獲得p1

              List<Element> list = Root.elements(「p1」);

              //遍歷list ….

              獲得p1下面name元素‘  

              Element e = Element.element(「name」);

              String s = e.getText();

             

       Public static void seletSin(){

       建立解析器  SAXReader s = new SAXReader();

           Document doc = s.read(「xml路徑」);

           Element root = Doc.getRootElement();

           Element p1 = root.element(「p1」)’

           Element name = p1.element(「name」);

           獲得name的值

           String s = name.getText();

          

       獲取第二個selectSecond(){

           SAXReader s = new SAXReader();

           Document doc = s.read();

           Element root = doc.getRootElement();

           List list = root.elements();

           Element e = List.get(1 );

           Element name = e.element(「name」);

           String s = name.getText();

          

使用dom4j 實現 添加操做 *** 必定要會寫

    XMLWriter 直接new 傳遞兩個參數 FileOutputStream 2,格式化類的值 OutputFormat

       在p1末尾添加sex標籤

       Public static void addSex(){

       SAXReader s = new SAXReader();

       Document doc = s.read();

       Element root = doc.getRootElement();

       Element p1 = root.element(「p1」);

       //用jaxp添加的時候要先建立  如今能夠直接進行添加

       Element sex1 = P1.addElement(「sex」);

       //在sex 下面添加文本 

       Sex1.setText(「man」);

       //回寫xml 須要用到XMLWriter 能夠new

       定義:XMLWriter w = new XMLWriter(OutputStream,OutputFormat);

       OutputFormat f = OutputFormat.createPrettyprint();

       XMLWriter w = new XMLWriter(new FileOutputStream(),f);

       w.write(doc);

       w.close();

 

      

  在特定位置 添加元素 *** 使用add(int index,e element) 進行添加

           第一個參數是 位置 從0開始

           第二個參數是 要添加的元素

    在第一個p1下面的age標籤以前 <school>yuxin</school>

       Public static void add(){

           SAXReader s = new SAXReader();

           Document doc = s.read(「xml地址」);

           Element e = Doc.getRootElement();

           Element p1 = e.element(「p1」);

           List<Element> list = p1.elements();

           //這裏須要建立一個元素

           Element school = DocumentHelper.createElement(「school」);

           School.setText(「yuxin」);

           List.add(1,school);

           //回寫 XMLWriter 是dom4j 裏的

           OutputFormat f = OutputFormat.createPrettyPrint();

           XMLWriter w = new XMLWriter(new FileOutputStream(「xml地址」),f);

           w.write(doc); 

           w.close();

           }

   

    Dom4j裏面封裝方法的操做

能夠提升代碼的可維護性 提升效率

//如下是讀取document

       Public static Document getDocument(String path){

           SAXReader s  = new SAXReader():

           Try{

              Document doc = S.read(path);

              Return doc ;

           }catch(){}

           Return null ;

       }

       //如下是回寫

       Public static void xmlWriters(String path,Document doc ){

           OutputFormat f = OutputFormat.createPrettyPrint();

           XMLWriter xml = new XMLWriter(new FileOutputStream(path),f);

           Xml.writer(doc);

           Xml.close();

       }

·使用dom4j 實現修改的操做

    Public static void modiftAge(){

       SAXReader saxreader = new SAXReader();

       Document doc = saxreader.read(「xml地址」);

       Element root = doc.getRootElement();

       Element p1 = root.element(‘’p1’);

       Element age = p1.element(「age」);

       Age.setText(「21」);

       OutputFormat f = OutputFormat.createPrettyPrint();

       XMLWriter xmlwriter = new XMLWriter(new FileOutputStream(「xml地址」,f);

       Xmlwriter.write(doc);

       Xmlwriter.close();

       }

***** ctrl shift + o 快速導入包

  使用dom4j 來實現刪除節點的操做  必須經過父節點進行刪除

    例如刪除第一個school元素

        Public static void deletElement(){

           SAXReader saxreader = new SAXReader();

           Document doc = saxreader.read(「」);

           Element root = doc.getRootElement();

           Element p1 = root.element(「p1」);

           Element sch  = p1.element(「school」);

           // 用remove方法

           P1.remove(sch);

           OutputFormat f = OutputFormat.createPrettyPrint();

           XMLWriter xmlw = new XMLWriter(new FileOutputStream(),f);

           Xmlw.write();

           Xmlw.close();

           }

  使用dom4j 來得到屬性的要求
    例如要獲取p1標籤裏面的id的值

       Public static void getId(){

           SAXReader saxreader = new SAXReader();

           Document doc = saxreader.read();

           Element root = doc.getRootElement();

           Element p1 = root.element(「p1」);

           // 用attributeValue 方法:

           String s = P1.attributeValue(「id」);

           System.out.println(s);

           }

 

  又是須要一層一層解析 層數過多消耗大

       提供了dom4j 支持xpath的操做

           能夠直接獲取到某個元素

           第一種形式 :

           /AAA/DDD/BBB 表示一層一層 AAA下面 DDD下面的BBB

           第二種形式

           //BBB 表示和這個名稱相同 表示只要是名稱是BBB 都獲得

           第三種形式:

           /*  表示全部元素

           實例:第四種形式

              /AAA/DDD[1]  第一個DDD元素

              /FFF[last()]   表示最後一個FFF元素

           第五種形式:

           //@id   表示標籤上有id屬性都獲得

           //BBB@id   表示BBB上有id屬性  都獲得

           第六種形式:

           //AAA[@id=’a’]   表示有屬性id且值爲a的元素

           //BBB[@name=’lxa’]   表示有屬性name 且值爲lxa的元素

       *** 如下摘自w3c

 

 

   使用dom4j支持xpath的具體操做

      默認的狀況下 dom4j不支持xpath

1, 引入支持xpath的jar包

2, 使用jaxen-1.1-beta-6.jar (複製到lib目錄 右鍵buildpath

3, 在dom4j裏面提供了方法 用來支持xpath

***** 重要方法:引號裏的內容都是xpath語法!!

我的認爲比elements element 好用一些

                                                                   i.            selectNodes(「xpath表達式」)   獲取多個節點

                                                                  ii.            selectSingleNode(「xpath表達式」)   獲取一個節點

練習 : 使用xpath來進行查詢xml裏name元素的值  

    全部name元素 的xpath表示 //name

    須要使用selectNodes(「//name」)  括號裏直接寫xpath表達式

       Public static void selectName(){

           SAXReader saxreader = new SAXReader();

           Document doc  =  Saxreader.read(「xml路徑」);

           //List 是 util 包   Node是dom4j包

           List<Node> list = Doc.selectNodes(「//name」);

           //遍歷list 

           For(Node node : list ){

              //node是每個name元素

              String s = node.getText();

              }

           //用以上方法寫 會省去不少步驟

           }

練習 : 獲取第一個p1下面name的值

    使用了selectSingleNode()方法

       Public static void getp1(){

           SAXReader sax = new SAXReader();

           Document doc = sax.read();

           Node name = doc.selectSingleNode(「//p1[@id=’aaa’]/name」);

***  [@id=’a’]表示屬性id爲a的進行選擇

           //獲得name裏面的值

           String s = name.getText();

           System.out.println(s);

           }

   實現簡單的學生管理系統 ( 用xml看成數據庫

       建立一個xml文件 寫入學生信息  在myeclipse

 

總結:

    使用xml看成數據 寫學生信息

    增長操做

       建立解析器

       獲得doc

       獲取根節點 建立標籤

       添加自標籤

       回寫***

    刪除操做

       建立解析器

       。。。同上

       使用xpath  selectNodes 選出id一致的標籤

       用getparent remove方法進行刪除

       回寫

    查詢操做

       基本步驟同上

       Xpath 「.//*」 查詢自標籤 gettext進行打印或者賦值

       回寫

注意回寫操做:XMLWriter(new FileOutputStream(),OutputFormat //這個是抽象類 不能new);

 

myEclipse 的安裝與使用:

    eclipse 是免費的開發工具

    myeclipse是收費的插件 ( = = 。

      工做空間不能有中文 和 空格

    建立類的首字母要大寫!!

    Debug的調試模式

       斷點調試模式 能夠看程序裏面數據的變化

           使用debug的第一步須要設置斷點

           F6 能夠使程序繼續運行

           F8 表示調試結束

直接向下運行 若是下面有斷點 則在斷點出暫停 ,沒有斷點就直接繼續運行

           Debug也能夠查看源代碼  F7能夠進入源代碼

  Myeclipse的快捷鍵:

    經常使用快捷鍵:

       Ctrl shift o : 快速導入包

       Ctrl shift / : 多行註釋

       Ctrl shift \ : 取消多行註釋

       右鍵source – format 格式化 有縮進效果

              /* syso alt+/ 能夠快速補全 system.out.println();

  Junit的使用

    單元測試:測試對象是一個類中的方法

       juint 不是javase的一部分被 須要導入jar(可是myeclipse裏自帶了juint

       首先juint版本

           @Test : 在方法上面寫

單元測試 的方法 : 方法命名規則 public void 方法名(){}

           使用註解方法:運行點擊run as – joint test

           當出現了 綠色 表示測試經過

           @Ignore : 忽略下面的方法不去測試

           @Before:

           @After :

       斷言:(用的不多

           Assert.assertEquals(指望的值 , 方法運行實際的值);

 

  JDK5.0 新特性:

       泛型 枚舉 靜態導入 自動拆裝箱 加強for 可變參數 反射

    泛型:通常是用在集合上

       好比如今把一個字符串類型的值放入集合,取值時不用進行類型轉換

           解決了類型轉換的問題

再集合上如何使用泛型:

           常見集合:list set map  ctrl shift o 快速導入包

 

 

  幾種常見的遍歷方式:

       For(int I ; I < ? ;i++){}

       For(String s :list){}

       Iterator I = list.iterator();

    泛型使用在set集合上:set是無序的 且不能重複

       Set<String>  t = new HashSet<String>();

    遍歷map:

       Set<String> s = map.keySet();

       For(String key :s){

           String s1 = map.get(key);

 

Java中map的entrySet()方法返回的是什麼內容啊?

簡單的理解,就是Entry.set是得到一個set集合,而且泛型是Map.Entry的對象結果集,這樣你就能夠經過Set集合來進行遍歷,是一種Map功能的加強。使用這種方式你能夠在不知道key的狀況下遍歷Map對象。

 

  泛型裏面的對象 必須是包裝類

       不能寫 int 要寫 Integer

       short Short

       byte Byte

       char Character…

泛型使用在方法上的:

    定義一個數組 實現制定位置上數組的交換

    實例:

    Public static void main(String arg[]){

    Int[] arr = {10,11,12,13,14};

    Swap1(arr,1,3);

    }

    Private static void swap1(int[] arr,int a,int b){

       //這裏須要定義一箇中間變量。。。

    若方法和邏輯相同 只是數據類型不一樣 能夠使用泛型方法

      使用泛型方法 須要定義一個類型 使用大寫字母表示 R : 這個T表示任意類型

       寫在返回值以前void以前

       表示定義了一個類型 這個類型是T

       在下面就能夠使用這個類型了T

           Public static <T> void swap1(T[] arr,int a ,int b){

    T temp = arr[a];

    Arr[a] = arr[b];

    Arr[b] = temp ;

    /*temp 意爲 臨時文件*/

}  *** 這裏面的T表示任意類型 ,

    並且泛型方法裏面數據類型也必定要用包裝類型

 

枚舉簡介:

    什麼是?

       須要在必定範圍內取值 這個值只能是這個範圍中的任意一個

          例如:交通訊號燈

    Public static final col Red = new Col();

    Public static final col Greem = new Col();

    Public static final col Yellow = new Col();

    //枚舉 :

    Enum Col2{

       Red,Green,Yellow;

    }

       ****  枚舉的構造方法也是私有的

           若是構造方法裏面有參數 則須要在每一個實例裏面寫參數

    特殊枚舉的操做 :

       在枚舉的類裏面 有抽象的方法

       當咱們在枚舉裏面寫下 抽象方法 須要在每一個實例上都實現抽象方法

枚舉api的操做:

    Name()返回枚舉名稱

    Ordinal() 返回枚舉的下標

    valueOf(Class<T> enumType ,String s ) 返回枚舉的對象

    valueOf(String s ) 返回枚舉的對象

values()得到枚舉對象的數組 返回Object數組

    eg:

Enum Col2{

     Red,Green,Yellow;

  }

    Public void test(){

       Col2 col = Col2.Red;

        String name = col.name() 返回String 名稱

       Int index = col.oradinal(); 返回下標

       //知道枚舉對象的名稱 獲得枚舉對象 下標

       ValueOf方法

       //根據下標獲得對象

       Col2[] list = Col2.values();

       Col2 col = list[下標];

      

靜態導入:(容易出錯

    能夠在代碼裏直接使用靜態方法

 

自動拆裝箱:

    裝箱:  把基本的數據類型 轉化成包裝類

    拆箱:把包裝類轉化成數據類型

 

加強for循環:

    實現Iterable接口能夠使用加強for循環

       只有list set 能夠使用加強for循環

       Map不能使用加強for ( 由於沒有Iterable接口)

    加強for循環是爲了替代迭代器(加強for的底層其實就是迭代器

       語法: for(遍歷的類 名稱:要進行遍歷的集合){}

內容補充

    泛型的擦除:

       首先泛型只是出如今源代碼階段

       練習:實現一個泛型方法 接受任意類型的數組 顛倒數組全部元素

       Public static void main(String arg[]){

       Integer[] arr = {2,3,1,4};

       Reverses(arr);

       }

       Public static <T> void reverses(<T>[] arr){

       For(int i=0 ;i<arr.length/2;i++){

       //進行交換

       }

      

可變參數:

    可變參數 能夠應用在:

       實現兩個數的相加

       實現三個數的相加

       四個數的相加

    定義一個方法實現兩個數的相加

       Public void add(int a,int b){

           Int sum = a+b;

           System.out.println(sum);

       }

    實現三個數相加

       Public void add2(int a ,int b,int c){

           Int sum1 = a+b+c;

           System.out.println(sum1);

       }

    以上方法的邏輯基本相同

    太麻煩 能夠使用可變參數來實現

       Public void add(int…nums){

           //nums表示能夠理解爲一個數組 用來儲存傳遞過來的參數

           *** 可變參數必須寫在參數列表裏 不能單獨定義

       }

       Public void add1(int a ,int…nums) 也能夠這樣寫

           *** 可變參數必須放在參數列表最後

    DEBUG調試模式:

       F6 單步執行

       F8 結束斷點 後面有斷點到下一個斷點

    *** 泛型方法:

       ** 枚舉要會用

    *** 自動拆裝箱

       拆箱: 數據類型——包裝類型

       裝箱: 包裝類型——數據類型

    加強for循環:

       底層的實現是迭代器

    可變參數 :

       寫法:int…nums

           可變參數 的應用場景:邏輯相同

           參數列表裏定義可變參數 且只能有一個可變參數

  *** 反射:

    應用在一些通用性高的代碼中:

       以後的框架:大部分由反射實現

    框架的底層難以理解

    框架都是基於配置文件來進行開發

       在配置文件中配置了類,能夠經過反射獲得類中的全部方法

    Eg:

       Public class Person{

           Private String name ;

           Private String id ;

           Public Person(){

              //沒有參數的構造方法

           }

           Public Person(int a){

           }

       能夠經過反射來獲得全部方法參數…

           當寫下一個java文件後 先保存 在編譯

           .java->.class->把class文件加載到內存 (使用了類加載器)

    若是獲得了class類,能夠獲得這個類中全部的內容

使用反射 :

    首先獲得class類

l  有三種方式:

n  1類明.class

n  2對象.getClass()

n  3使用Class.forName(「路徑」)

 

使用反射操做類裏面的屬性:

    Class clazz1 = Person.class;

    Class clazz2 = new Person().getClass();

    Class clazz3 = Class.forName(「路徑」);

     對於一個類進行實例化 能夠new 不使用new 怎麼獲取??

       獲得class

       Class c  = Class.forName(「路徑」);

       Person p = c.newInstance();

       //這樣就得到了person的實例。

    若操做有參數的構造方法:

       Class c = Class.forName();

       Constructor cs = c.getConstructor(String.class);  //這裏面的String.class表示String的參數

       //經過有參數的構造方法來建立了person的實例

       Person p = (Person)cs.newInstance(「這裏是參數」);

      

使用反射來操做屬性:

   

獲得class類 :

    類名.class

    對象.getClass

    使用Class.forName 方法

操做無參數構造方法:

    當對類進行實例化時,Person p = (Person)class.newInstance();

    有參數的構造方法:

       Class c = Class.forName();

       Constructor cs = c.getConstructor(String.class//這個是參數的類型.class);

       Person p = (Person)cs.newInstance(「傳入String類」);

操做普通方法:

    獲得Class類「

    Class c = Class.forName();

    Person p = (Person)c.newInstance();

    Method m = c.getDeclaredMethod(「這裏是方法名」,String.class(這是方法參數的類型);

    m.invoke(p,」這裏是設置的值」);  //執行方法>

    *** m.setAccessible(true) 表示能夠使用私有方法

   

總結:

    泛型 集合使用泛型 泛型方法泛型類

    自動拆裝箱 向下兼容

    要理解反射的原理

 

軟件體系結構

    常見的軟件結構 BS CS

       CS: 客戶端 服務器  安全性高  例如:qq

       BS:瀏覽器 服務器  不須要安裝客戶端,不用升級

WEB服務器:

    Tomcat不支持JAVAEE

    能夠經過tomcat目錄下的:startup shutdown 來進行開啓關閉tomcat

*** 若是startup 一點就消失 說明JAVA_HOME 不存在

 

 

WEB 應用:

    在webapps下建立一個目錄 ( 不能包含中文 空格)

       這個目錄是項目目錄

       在項目下建立一個html文件

       建立一個html文件

       在項目目錄下建立以下內容:

           WEB-INF目錄:安全目錄

              在裏面建立一個xml文件叫作:web.xml(這個文件是用來初始化配置信息

 

http      協議:

      協議的甲乙方就是 客戶端 服務器

            能夠理解爲雙方通訊的格式!

            請求協議

            響應協議

     

請求頭:

    Referer: 在百度裏點擊連接 則請求頭就是百度(地址欄裏發生的地址轉跳 不算

    Referer的做用: 統計訪問來源, 統計訪問量

              Referer能夠防盜鏈

響應協議:

    響應首行:

    響應頭信息:

** 響應碼:

    200 成功

    404 請求的資源沒有找到

    405 不支持訪問方式

403 Forbidden                 //服務器收到請求,可是拒絕提供服務

    500 請求資源找到了 但服務器內部出現了錯誤

    302 *重定向* 表示服務器要求再發送一個請求 服務器的會發送一個響應頭 Location 制定新的請求url地址

 

 

    304 :能夠節省傳輸成本 直接用緩存 是比較Last-Modified 和 If-Modified-Since 的時間與真是文件真是的時間同樣是 服務器會返回304 而卻不會影響正文

 

    4開頭的都是客戶端的錯誤

響應頭: Last-Modified :最後修改時間

        If-Modified-Since:吧上一次請求的index.html的最後修改時間還給服務器

        Refresh: 自動刷新

           Eg:Refresh:3;url=http://lxa.com (3秒後 轉跳到lxa 這個頁面

           <head><meta http-equiv="refresh" content="5" /></head>

      

使用java繪製圖片:

    相關的類:Image ImageIO BufferedImage Icon ImageIcon

        驗證碼的做用 : 防止惡意註冊    

 

軟件體系結構:BS   CS 瀏覽器服務器  客戶端服務器

    Tomcat是web服務器 jsp容器servlet容器

       默認端口號:8080  網頁的默認是:80

Web應用:

    目錄結構:

 

狀態碼: 200 404 304 302 500  Referer請求頭 有來源網址信息 盜鏈 統計訪問次數等做用

       Refresh 自動刷新  Eg:Refresh:3;url=http://lxa.com (3秒後 轉跳到lxa 這個頁面

 //** 反射存在的意義就是在執行一段程序時若是須要執行其餘類或代碼 反射能夠直接調用實例化須要用的代碼 不用中止如今正在運行的代碼再來使用須要用的代碼**//

****

同步異步一般用來形容一次方法調用。

同步方法調用一旦開始,調用者必須等到方法調用返回後,才能繼續後續的行爲。

異步方法調用更像一個消息傳遞,一旦開始,方法調用就會當即返回,調用者就能夠繼續後續的操做。而,異步方法一般會在另一個線程中,「真實」地執行着。整個過程,不會阻礙調用者的工做。

 

Servlet:

    是javaweb三大組建之一 是服務器小程序 由Applet衍生出來

    每一個servlet都是惟一的 他們的功能都是不一樣的

    多線程併發訪問

 

 

    Servlet須要:

       接受請求數據

       處理請求

       完成響應

    實現servlet的方式:

       實現servlet的三種方式:

           實現javax.servlet.Servlet接口

           繼承javax.servlet.GenericServlet

           繼承javax.servlet.http.HttpServlet

       ** 咱們一般會使用繼承HttpServlet   比較方便

           這幾個方法httpServlet是GenericServlet的子類 GenericSerlvet是調用了Serlvet的接口

Servlet接口定義了5種方法:

  • init()  只在第一次初始化調用生成實例化一次
  • service()   每次訪問調用一次 傳遞request response
  • destroy()  servlet銷燬時調用
  • getServletConfig()
  • getServletInfo()

init()  只會在第一次啓動進行實例化servlet時調用

在Servlet實例化後,Servlet容器會調用init()方法來初始化該對象,主要是爲了讓Servlet對象在處理客戶請求前能夠完成一些初始化工做,例如:創建數據庫的鏈接,獲取配置信息等。對於每個Servlet實例,init()方法只能被調用一次。init()方法有一個類型爲ServletConfig的參數,Servlet容器經過這個參數向Servlet傳遞配置信息。Servlet使用ServletConfig對象從Web應用程序的配置信息中獲取以名-值對形式提供的初始化參數。另外,在Servlet中,還能夠經過ServletConfig對象獲取描述Servlet運行環境的ServletContext對象,使用該對象,Servlet能夠和它的Servlet容器進行通訊。

      在GenericServlet抽象類中的Init方法還有一個沒有參數的方法 用於進行改寫等等 緣由是 有ServletConfig參數的方法在使用時候容易忘記 this.ServletConfig = ServletConfig    這裏的Servlet是傳入的參數

service()

容器調用service()方法來處理客戶端的請求。要注意的是,在service()方法被容器調用以前,必須確保init()方法正確完成。容器會構造一個表示客戶端請求信息的請求對象(類型爲ServletRequest)和一個用於對客戶端進行響應的響應對象(類型爲ServletResponse)做爲參數傳遞給service()。在service()方法中,Servlet對象經過ServletRequest對象獲得客戶端的相關信息和請求信息,在對請求進行處理後,調用ServletResponse對象的方法設置響應信息。

destroy()

當容器檢測到一個Servlet對象應該從服務中被移除的時候,容器會調用該對象的destroy()方法,以便讓Servlet對象能夠釋放它所使用的資源,保存數據到持久存儲設備中,例如將內存中的數據保存到數據庫中,關閉數據庫的鏈接等。當須要釋放內存或者容器關閉時,容器就會調用Servlet對象的destroy()方法,在Servlet容器調用destroy()方法前,若是還有其餘的線程正在service()方法中執行容器會等待這些線程執行完畢或者等待服務器設定的超時值到達。一旦Servlet對象的destroy()方法被調用,容器不回再把請求發送給該對象。若是須要改Servlet再次爲客戶端服務,容器將會從新產生一個Servlet對象來處理客戶端的請求。在destroy()方法調用以後,容器會釋放這個Servlet對象,在隨後的時間內,該對象會被java的垃圾收集器所回收。

getServletConfig()

該方法返回容器調用init()方法時傳遞給Servlet對象的ServletConfig對象,ServletConfig對象包含了Servlet的初始化參數。

getServletInfo()

返回一個String類型的字符串,其中包括了關於Servlet的信息,例如,做者、版本和版權。該方法返回的應該是純文本字符串,而不是任何類型的標記。

 

如何使用瀏覽器訪問servlet:

1, 給servlet指定一個servlet路徑

2, 瀏覽器訪問servlet路徑

a)       給servlet配置路徑:

須要在web.xml中對servlet進行配置

    <load-on-startup>0  意味着在tomcat啓動時 就對servlet進行實例化  這樣能夠避免在第一次訪問servlet時進行實例化Servlet會形成反應緩慢。

 

 

Mapping英文翻譯——映射

 

ServletConfig能夠獲取配置信息

    一個ServletConfig對象 對應一段web.xml

    ServletConfig對象的功能:

       String getServletName() 獲取servlet-name標籤的內容

       ServletContext getServletContext()  獲取servlet上下對象

/**父類的private 子類可否繼承?

正確的回答是:
若是一個子類繼承了父類,那麼這個子類擁有父類全部的成員屬性和方法,即便是父類裏有private屬性的變量,子類也是繼承的,只不過不能使用,也就是說,它繼承了,可是沒有使用權,彷佛又點矛盾,用咱們通俗的說法就是 只能看,不能用
 

抽象類和接口的區別:抽象類由abstract關鍵字來修飾,接口由interface關鍵字來修飾。抽象類中除了有抽象方法外,也能夠有數據成員和非抽象方法;而接口中全部的方法必須都是抽象的,接口中也能夠定義數據成員,但必須是常量。

    定義常量:方法一採用接口(Interface)的中變量默認爲static final的特性。

方法二採用了Java 5.0中引入的Enum類型。

方法三採用了在普通類中使用static final修飾變量的方法。

 

GenericServlet 是一個抽象類       generic英文翻譯——類的

      GenericServlet

實現了Servlet接口,並幫咱們作了一些經常使用操做

1.init方法 妥善的保存config對象並實現getServletInfo,getServletConfig,
2.增長一個空參init方法,供開發人員初始化,爲了防止開發人員重寫 原生init方法
3.service方法空實現 => 聲明成抽象(強制開發人員實現該方法)
4.destory方法空實現 
5.實現了servletConfig接口. 接口中的方法直接調用config實現類實現.

HttpServlet

    HttpServlet的原理:

       繼承於GenderServlet

           方法:

              Void service(ServletRequset,ServletResponse) 生命週期方法

                  強轉兩個參數爲http協議相關的類型

              Void service(HttpServletRequest,HttpServletResponse)

                  參數已是http協議相關的 使用起來更加方便

              Void doGet(){}

              Void doPost(){}

      工做原理:

       Tomcat會調用Servlet生命週期方法 對參數進行轉化 而後調用另一個service方法 獲取請求方法 根據請求方式來調用doGet 或 doPost 

       DoGet doPost 由咱們本身進行覆蓋

       若是沒有覆蓋doGet doPost 就會出現405

 

Servlet與線程安全 ( 優勢就是速度快

        不要再servlet中建立成員。建立局部變量便可

        能夠建立無狀態成員。

        能夠建立只讀對象成員。

讓servlet在啓動服務器Tomcat時 就啓動servlet

        在<servlet>標籤之下加入<load-on-startup>0</load-on-startup>

 

在web.xml中加入圖中段落

servlet 有參數的init方法和無參數的init方法

 

在servlet生命週期中,首先是構造firstservelt類,2調用有參數的init方法

可是在學習的時候,咱們發現存在inti有參數和init無參數的兩種方法

有參數是給服務器初始化servlet時調用的

public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

無參數給開發者使用的

public void init() throws ServletException {
        // NOOP by default
    }

 

若是咱們重寫有參數的,若是忘記完成this.config = config;即super.config = config這行代碼,就有可能出現空指針異常

 

<url-pattern>用來指定servlet的訪問路徑 就是url 必須是’/’開頭

 

Web.xml文件的繼承(瞭解

  每一個javaweb應用都有一個web.xml 文件

  若是訪問路徑不存在時 會執行DefaultServlet 返回404 沒有找到頁面

  若是須要訪問jsp擴展名的文件 須要經過JSPservlet進行訪問

  *** session 的過時時間是30mins

Servlet必需要有無參數構造類

 

ServletContext(重要) 使用它來進行數據的傳遞

  一個項目只有一個servletcontext對象

    服務器會爲每一個應用建立一個servletContext對象

       在建立服務器啓動完成

       在銷燬服務器是關閉

獲取ServletContext :

 

域對象功能:用於在servlet之間傳遞數據

    Javaweb四大域對象:

       PageContext

       ServletRequest

       HttpSession

       ServletContext

    全部域對象都有存取數據的功能 由於域對象內部有一個map 用來存儲數據 下面是servletcontext對象用來操做數據的方法。

    Void setAttribute(String name,Object value) 用來存儲一個對象 也能夠稱之爲儲存一個域屬性 例如:

       servletContext.setAttribute(「name」,」lxa」);  在域屬性,域屬性名稱爲xxx 屬性爲xxx。請注意,若是屢次調用方法 而且使用相同的name 那麼回覆蓋上一次的值 這一特性與map相同

    Object getAttribute(String attributeName) : 用來獲取servletContext中的屬性 當前在獲取以前須要先去儲存才行,例如: String value = (String ) servletContext.getAttribute(「name of attribute」)  /**因爲返回的是object 因此要進行強行轉化!!

    Void removeAttribute(String name) 用來移除servletContext中的域屬性 若是參數name指向的域屬性不存在 那麼方法什麼都不作

    Enumeration getAttributeNames() 獲取全部屬性的名稱

/*

hashCode方法實際上返回的就是對象的存儲地址。 
能夠先記下結論: 
1
、若是兩個對象相同,那麼它們的hashCode值必定要相同; 
2
、若是兩個對象的hashCode相同,它們並不必定相同 
3.
兩個對象不相同,他們的hashCode值不必定不相同。 
4.
兩個對象的hashCode值不相同,他們必定是兩個不一樣的對象

*/

 

演示向servletContext中保存數據:

     

 

演示從servletContext中獲取數據:

 

    以上兩個方法是在不一樣的兩個類的doGet方法裏實現 在訪問對應servlet時 自動調用實現

   

獲取應用初始化參數

    Servlet也能夠獲取初始化參數 可是它只是局部參數 也就是說 一個servlet只能獲取本身的初始化參數

    也能夠配置 *公共的初始化參數* 爲全部的servlet來進行使用 必須須要用servletContext來進行獲取

演示獲取公共的參數  

1, 獲得servletContext

2, 調用getInitParameter(String)獲得初始化參數

 

公共初始化參數 的定義方式:

    在web.xml 文件裏的 根目錄的第一層下

       <param-context>

           <param-name (這個是初始化參數的name) > XXX</param-name>

           <param-value (這個是初始化參數的calue)>YYYY</param-value>

       </param-context>

    定義完成後須要從新載入tomcat

 

獲取相關的資源

    使用servletContext獲取資源真實路徑

       能夠使用servletContext對象來獲取web應用目錄下的資源 例如在Hello應用的根目錄下建立 a.txt 文件 如今想在servlet中獲取這個資源 就能夠使用ServletContext來進行獲取

    獲取a.txt的真實路徑: String realpath = servletContext.getRealPath(「這裏是文件的名稱」)

       返回的值 是文件的絕對路徑

    獲取b.txt的真實路徑 String realpath = servletContext.getRealPath(「WEB-INF/b.txt」) 說明b.txt 在web-inf 的文件目錄下

   

獲取資源流

    InPutStream in = this.getServletContext().getResourceStream(「須要讀取的文件路徑」)

    獲取文件的資源

 

練習 : 訪問量的統計

    一個項目中全部的資源訪問 都要對訪問量進行累加

    建立一個int類型的變量  用來保存訪問量 而後保存到servletContext的域中 這樣能夠保存全部的servlet均可以訪問到。

    **  最初servletContext中沒有保存訪問量相關的屬性

    ** 當網站的第一次被訪問時  建立一個變量設置值爲1 而後保存到servletContext之中

    當之後的訪問 就能夠從servletContext中訪問這個變量 而後+1

獲取servletContext對象 查看count的屬性 進行操做

PrintWriter out = response.getWriter(); 想瀏覽器輸出的方式

 

 

獲取類路徑下的資源:獲取類路徑資源 對於javaweb項目而言 就是 WEB-INF/classes目錄下的文件

  Class

  ClassLoader

 

獲得ClassLoader

調用其getResourceAsStream() 獲得一個InputStream

ClassLoader cl = this.getClass().getClassLoader();(從本class中調用classloader 借刀殺人 - - )

InputStrean in = cl.getResourceAsStream(「classes目錄下的文件名」)

  *** String s = IOUtils.toString(in);  //讀取輸入流內容 轉化成String返回

反射獲取class對象的三種方式:

Person person = new Person();

//一、經過Object類的getClass()方法:(須要先實例化一個對象)

Class clazz1 = person.getClass();

//二、經過對象實例方法獲取對象:(須要先實例化一個對象)

Class clazz2 = person.class;

//三、類的全路徑:(不準呀實例對象)

Class clazz3 = Class.forName("com.cn.Person");

 

對於有空的構造函數的類能夠直接用字節碼文件獲取實例:

  Object objt = clazz.newInstance();  //會調用空參構造器(若是沒有則會報錯);

對於沒有空的構造函數的類則須要先獲取到他的構造對象,在經過該構造方法類獲取實例

  一、獲取構造函數

    Constroctor const = clazz3.getConstructor(String.class,int.class);

  二、經過構造器對象的newInsttance方法進行對象的初始化

    Object obj = const.newInstance("tom",30);

 

關於getClass方法:

Java的每一個類都帶有一個運行時類對象,該Class對象中保存了建立對象所需的全部信息。
能夠用.class返回此 Object 的運行時類Class對象,也能夠用getClass()得到。
得到此對象後能夠利用此Class對象的一些反射特性進行操做,
例如:
this.getClass().newInstance(); //用
缺省構造函數建立一個該類的對象
this.getClass().getInterfaces(); //得到此類實現的接口信息
this.getClass().getMethods();//得到此類實現的全部公有方法

Class.forName(" ... JDBC driver class name...."); //
Class的靜態方法forName, 向DiverManager註冊這個JDBC driver類

 

內容:

Response

Request

編碼

路徑

 

 

服務器建立request對象 把請求數據封裝到request中

建立response對象 調用servlet的service()方法傳遞參數

在serlvet.service() 方法中使用request獲取請求的數據 使用response成完請求的響應

 

服務器請求的流程:

    服務器每次收到請求時 都會爲這個請求開啓一個新的線程

    服務器會把客戶端的請求數據封裝到request對象中 request就是這個請求的數據的載體

    服務器還會建立response對象 這個對象與客戶端鏈接在一塊兒 它能夠用來向客戶端發送響應

       Response request 在請求結束的時候都會自動銷燬

       服務器能夠同時接受多個請求

       Response request 都是由服務器進行建立的

http的響應結構 response :

    狀態碼 200成功 404客戶端錯誤 403訪問被拒絕 500服務器錯誤 302重定向 304未修改能夠使用以前的緩存

    響應頭

    響應體

    <html>

    ….

    </html>

 

Response 其類型爲HttpServletResponse

    ServletResponse 與協議無關的類型

    HttpServletResponse 與http協議相關的類型

       sendError (int sc) 發送錯誤的狀態碼

       sendError (int sc ,String msg) 發送錯誤的狀態碼 並返回文本

       sendStatus (int sc) 發送成功的狀態碼

    *** 注意都是send不是set

status 英文翻譯 --- 狀態

 

response的響應頭相關的方法:

    響應頭: Content-Type, Refresh, Location 等等…

    setHeader(String name,String value)適用於單值響應頭

    addHeader(String name,String value) 適用於多值響應頭

       response.addHeader(「aa」,」A」);

       response.addHeader(「aa」,」B」);    //分開進行設置

    setIntHeader(String name,int  value) 適用於單值響應頭設置int類型值

    addIntHeader(String name,int  value) 適用於多值響應頭設置int類型值

    setDateHeader(String name,long value) 適用於單值響應頭設置 毫秒 類型值

       這裏的value的類型是long 是由於瀏覽器沒法處理date()類型的參數數據

       這裏的 參數 1000 = 1 秒

       能夠設置 response.setDateHeader(「expires」,1000*60*60*24) 進行設置過時時間 這裏是1天過時

 

使用response完成重定向

    使用到 response.setHeader(「Location」,」/Hello/Next」這是重定向的地址頁面

    response.sendStatus(302);   發送重定向狀態碼

 

設置定時刷新

    設置一個Refresh 表示定時刷新

    response.setHeader(「Refresh」,」5; /Hello/B 這裏是轉跳到的頁面地址」);

    response.setHeader(「Refresh」,」5;http://www.baidu.com」);

 

禁止瀏覽器進行緩存

    Cache-Control ,pragma ,expires

    eg:

    response.setHeader(「Cache-Control」,」no-cache」);

    response.setHeader(「pragma」,」no-cache」);

    response.setDateHeader(「expires」,」0」);

    <meta> 標籤能夠充當響應頭

response 有兩個流

    getOutputStream

    getWriter

** 這兩個流不能一塊兒使用 會拋出異常

    PrintWriter writer = response.getWriter();

    ServletOutputStream sos = response.getOutputStream();

response的快捷重定向方法:

    sendRedirect(String local)方法

    //快捷重定向的方法

    response.sendRedirect(「http://www.baidu.com」);

 

request

    request格式:

       請求行

       請求頭

       空行

       請求體

    獲取經常使用地址:

       獲取客戶端IP   案例: 能夠封IP

       request.getRemoteAddr()  

       獲取請求方式:

       request.getMethod()   多是post , get

    獲取請求頭

       getHeader(String name ) 返回String 適用於單值

       getIntHeader(String name) 適用於int返回值的單值請求頭

       getDateHeader(String name) 適用於好省得返回值的請求頭

    案例:

       經過User-Agent 識別用戶的瀏覽器類型

       request.getHeader(「User-Agent」)  返回String值 裏面是瀏覽器信息等等

 

獲取請求url:

    http://localhost:8080/day01/Servlet?usename-xxx&password=yyy

       String getScheme 獲取協議:http

       String getServerName 獲取服務器: localhost

       String getServerPort  獲取端口號: 8080

       String getContextPath  獲取項目名  /day01  

       String getServletPath  獲取Servlet路徑 /XXX/Servlet

        String getQueryString  獲取參數部分 就是問號後面的內容  usename=xxx&password=yyy

       String getRequestURL  獲取請求URL  等於不包含參數的整個請求路徑:

  http://localhost:8080/day01/Servlet

 

Referer : 能夠告訴 請求來自的地址

    能夠統計來訪的頁面

    能夠防盜鏈

   

 

請求參數:

    由客戶端發送給服務器

        請求參數可能在請求提 可能在url中(get  post 兩種不一樣方法)

 

Servlet  eroorHTTP method GET is not supported by this URL

錯誤提示:

 type: Status report

message: HTTP method GET is not supported by this URL

description: The specified HTTP method is not allowed for the requested resource (HTTP method GET is not supported by this URL).

緣由:

1,繼承自HttpServlet的Servlet沒有重寫對於請求和響應的處理方法:doGet或doPost等方法;默認調用父類的doGet或doPost等方法;

2,父類HttpServlet的doGet或doPost等方法覆蓋了你重寫的doGet或doPost等方法;

無論是1或2,父類HttpServlet的doGet或doPost等方法的默認實現是返回狀態代碼爲405的HTTP錯誤表示對於指定資源的請求方法不被容許。

解決方法:

1,子類重寫doGet或doPost等方法;

 2,在你擴展的Servlert中重寫doGet或doPost等方法來處理請求和響應時 不要調用父類HttpServlet的doGet或doPost等方法,即去掉super.doGet(request, response)和super.doPost(request, response);

  個人解決方法是: 刪去super代碼

 

請求轉發 請求包含

    有些任務一個servlet完成不了 會將請求發送給其餘servlet

       客戶端發送請求 Aservlet解決不了 AServlet 請求轉發BServlet BServlet結束執行 返還AServlet AServlet最終響應回客戶端

 

 

RequestDispatcher rd = request.getRequestDispatcher(「/MyServlet」  這個是要傳遞到servlet的路徑 );

請求轉發: rd.forward(request,response);

有時候一個請求須要多個servlet 須要使用轉發和包含:

   

javaweb之請求轉發和請求包含

·關於請求轉發和請求包含咱們首先得知道不管是請求轉發仍是請求包含,都表示由多個Servlet共同來處理一個請求。

  例如Servlet1來處理請求,而後Servlet1又轉發給Servlet2來繼續處理這個請求。下面用例子測試下:

 -----請求轉發

在AServlet中,把請求轉發到BServlet:

[java] view plain copy

public class AServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        System.out.println("AServlet");  

        RequestDispatcher rd = request.getRequestDispatcher("/BServlet");  

        rd.forward(request, response);  

    }  

}  

 

[java] view plain copy

public class BServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        System.out.println("BServlet");  

    }  

}  


結果:

Aservlet

BServlet

 -----請求包含

在AServlet中,把請求包含到BServlet:

[java] view plain copy

public class AServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        System.out.println("AServlet");  

        RequestDispatcher rd = request.getRequestDispatcher("/BServlet");  

        rd.include(request, response);  

    }  

}  

 

[java] view plain copy

public class BServlet extends HttpServlet {  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        System.out.println("BServlet");  

    }  

}  


結果:

Aservlet

BServlet

請求轉發與請求包含比較

1.若是在AServlet中請求轉發到BServlet,那麼在AServlet中就不容許再輸出響應體,即不能再使用response.getWriter()和response.getOutputStream()向客戶端輸出,這一工做應該由BServlet來完成;若是是使用請求包含,那麼沒有這個限制;

2.請求轉發雖然不能輸出響應體,但仍是能夠設置響應頭的,例如:response.setContentType(」text/html;charset=utf-8」);

3.請求包含大可能是應用在JSP頁面中,完成多頁面的合併;

4.請求請求大可能是應用在Servlet中,轉發目標大可能是JSP頁面

 

轉發 留頭不留體  (請求頭 請求體)

包含 留頭留體

最後來比較一下請求轉發與重定向:

--- 請求轉發是一個請求,而重定向是兩個請求;

--- 請求轉發後瀏覽器地址欄不會有變化,而重定向會有變化,由於重定向是兩個請求;

--- 請求轉發的目標只能是本應用中的資源,重定向的目標能夠是其餘應用;

--- 請求轉發對AServlet和BServlet的請求方法是相同的,即要麼都是GET,要麼都是POST,由於請求轉發是一個請求;

---重定向的第二個請求必定是GET

    重定向因爲是兩次請求 因此會丟失request 不能使用request域進行傳值

request域:

    Servlet中的三大域對象: request  session  application 都下有三個方法:

       void setAttribute(String name ,Object value);

       Object getAttribute(String name);

       void removeAttribute(String name);

    在請求轉發包含時 : 使用setAttribute getAttribute 來進行傳值

 

請求轉發 重定向的區別:

    請求轉發是一個請求一次響應 而重定向是兩次請求

    請求轉發地址欄不會發生變化

    請求轉發只能轉發到本項目其餘Servlet 而重定向不僅能重定向到此項目的地址

    請求轉發是服務器端的行爲 之須要給轉出的servlet路徑 而重定向須要給出requestURI 即包命項目名

    請求轉發的效率高於重定向 由於只有一次請求

       若是須要地址欄的變化 那麼必須使用重定向

須要在下一個servlet中獲取request域中的數據 必需要用請求轉發!重定向的request在第一次請求後就會丟失

 

編碼:

 

必定要 直接 response.setContentType(「text/html;charset=utf-8」)

想要不出現亂碼 :

    在使用getWriter()方法以前 先調用response.setContentType(「text/html;charset=utf-8」);

 

請求編碼:

    客戶端傳遞參數的編碼:

       在頁面上點擊表單或者連接 大部分參數的編碼都是 utf-8 由於大部分的頁面都是 utf-8 的頁面

       在地址欄裏面輸入的參數 大部分都是gbk 可是 基本上沒有人會在地址欄裏面進行傳遞信息

URL編碼:

 

路徑:

    web.xml裏面配置的<url-pattern>路徑 這個叫servlet路徑

        要麼*開頭 要麼/開頭

    轉發和包含的路徑:

       是服務器的路徑 AServlet 到 BServlet 不會到客戶端 

以「/」開頭 意爲: http://localhost:8080/項目名/

request.getRequestDispatcher().forward(「/BServlet」);

    重定向路徑:

       客戶端路徑 : 要加上項目名 若以「/」 意爲http://localhost:8080/…

   

/* 瀏覽器只能看懂html

jsp

    jsp其實就是servlet

Servlet
    缺點:不適合配置html響應體

    優勢: 動態資源 能夠編程

html

    缺點: html是靜態頁面 不能包含動態信息

    有點: 不能爲輸出html標籤而發愁

jsp

    優勢: 在原有的html上添加java腳本 構成jsp頁面

   

jsp servlet的分工:

    jsp:

       做爲請求發起頁面 例如顯示錶單 超連接

       做爲請求結束頁面 例如顯示數據

    Servlet:

       做爲請求中處理數據的環節

 

 

jsp其實就是html放上java代碼

    jsp中有 9 個對象 不用建立直接能夠使用

       request對象

       request對象不用建立直接能夠使用

    3種java腳本

       <% 。。。。 %>  java代碼片斷  用於定義0~N條java代碼

       <%! ….. %>  java聲明  用來建立類的成員變量 和 成員方法

       <%= 。。。%> java表達式    

演示jsp java腳本 servlet jsp分工合做:

 

 

JSP原理:

    jsp其實就是一個Servlet

    當jsp文件第一次訪問時 服務器把jsp轉化成java文件

    而後把java編譯生成.class

    而後調用它的service()方法

    第二次請求同一個jsp時 直接調用service()方法

 

jsp轉化爲java文件:

    會在頭部爲9個基本類型進行賦值

    <% 裏面的java語句會直接進行寫入

    <%= 裏面的語句 調用out.print(以前的內容)

 

 

jsp中的註釋 <%--- ---%> 

    翻譯成.java 後不存在

jsp中的註釋 <!—XXX -->

    會傳到到瀏覽器 在瀏覽器上不會顯示  可是在瀏覽器上顯示源代碼上會顯示

Cookie

是服務器保存到客戶端的東西

Cookie是http協議制定的 先由服務器保存Cookie到瀏覽器 在下次瀏覽器請求服務器時把上一次請求獲得Cookie再歸還給服務器

由服務器建立保存到客戶端瀏覽器的鍵值對 服務器保存Cookie的響應頭 :Set-Cookie :aaa=XXX

當瀏覽器請求服務器時  會把該服務器保存的Cookie隨請求發送給服務器 瀏覽器歸還Cookie的請求頭:Cookie:aaa=AAA;bbb=BBB  (此處只返回一個頭 用;隔開信息)

Http協議定義:

    1個Cookie最大4kb

    1個服務器最多能夠向瀏覽器保存20個Cookie

    1個瀏覽器最多保存300個Cookie

       (大多數Cookie都違反了規定

Cookie不安全

服務器能夠使用Cookie跟蹤客戶端狀態

 ***Cookie是不能跨瀏覽器的

Cookie的詳解:

    Cookie的maxAge : cookie的最大生命 cookie.setMaxAge(6)

       maxAge>0 瀏覽器會把Cookie保存到硬盤上 有效時間 單位 1秒

       maxAge=0 瀏覽器會立刻刪除這個cookie

       maxAge<0 cookie只會在瀏覽器內存中存在 瀏覽器關閉時 cookie 被銷燬

Cookie的path:

    Cookie的path並非設置這個Cookie客戶端的保存路徑

    Cookie的path由服務器建立Cookie時決定

    ** 瀏覽器訪問服務器的路徑 若是包含某個Cookie的路徑 那麼就會歸還這個Cookie

       例如:

           aCookie.path = /day1/; bCookie.path=day1/jsp/;cCookie.path=/day1/jsps/cookies/;

           訪問/day1/index.jsp 時  歸還: aCookie

           訪問/day1/jsps/index.jsp時 歸還:aCookie,bCookie

           訪問/gay1/jsps/cookies/a.jsp 時 歸還:aCookie,bCookie,cCookie

    Cookie的域 domain:

       domain用來指定Cookie的域名

       當多個二級域中共享Cookie時纔會有用

       例如:www.baidu.com zhidao.baidu.com news.baidu.com 之間能夠共享Cookie時能夠使用domain

           設置damain爲:cookie.setDomain(「.baidu.com」);

           設置path爲:cookie.setPath(「/」);

              設置path爲/ 防止path被固定

 

HttpSession (保存在服務器端

    HttpSession由Javaweb提供

    用來會話跟蹤的類

    HttpSession是三大域之一

       三大域:request session application

           它們都有setAttribute getAttribute removeAttribute 三個方法

    會話:會話範圍是某個用戶從首次訪問服務器開始 到該用戶關閉瀏覽器結束

       會話:一個用戶對服務器的屢次連貫性請求 所謂連貫性請求 就是該用戶屢次請求中間沒有關閉的服務器

    獲取session:HttpSession session = request.getSession();

    session保存id :

       通常會保存到cookie中

               若是cookie被禁用 會保存到url :href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=3'

 

HttpSession 原理:

    Session默認生命週期 ( 最大不活動週期 ) 30mins

服務器是如何實現一個session爲一個用戶瀏覽器服務的?

   服務器建立session出來後,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的瀏覽器不關,再去訪問服務器時,都會帶着session的id號去,服務器發現客戶機瀏覽器帶session id過來了,就會使用內存中與之對應的session爲之服務。

 

配置session最大活動時間:

    session用得最多的方法是:getAttribute setAttribute removeAttribute

    Session的其餘方法:
       String getId() : 獲取sessionId

       int getMaxInactiveInterval() : 獲取session能夠得最大不活動時間 默認爲30mins

       void invalidate() : 讓session失效! 調用這個方法會被session失效 session失效後 客戶端再次建立請求 服務器會返回一個新的session ( 這個方法 經常用在推出登錄

       Boolean isNew() : 查看session是不是新的

 

圖形驗證碼:

1, 建立圖片緩衝區 設置寬高

2, 獲得圖片的繪製環境(獲得畫筆Graphics)

3, 保存圖片

 

BufferedImage bi = new BufferedImage(70,35,BufferedImage.TYPE_INT_RGB);

Graphics g = bi.getGraphics();

g.setColor(Color.RED);

g.fillRect(0,0,70,35);

g.setColor(Color.WHITE);

g.drawString(「Hello」,2,2); // 其中2,2表示x,y軸的座標

ImageIO.write(bi,」jpeg」,new FileOutputStream(「要存放的地址」);

 

 

JSP三大指令:

    page ——》最複雜

    include——》靜態包含

    taglib——》導入標籤庫

如下是page指令的屬性: <%@page aaa=」XXX」 (z這樣就設置了一個方法)

pageEncoding:指定當前jsp頁面的編碼

contentType:它表示添加一個響應頭:Content-Type! 等同於response.setContentType(「text/html;charset=utf-8」);

    若是兩個屬性只提供一個 那麼另外一個的默認值爲設置的那一個

    若是兩個都沒有設置 那麼默認爲iso

import 效果跟java import同樣

errorPage : 若是這個頁面出錯 轉跳到指定的頁面 errorPage=」b.jsp」

    這個使用的請求轉發 地址欄不變

isErrorPage 用來標註這個頁面是處理錯誤的頁面

    isErrorPage=」true」  *** 標註以後就能夠在這個jsp裏面使用Exception這個域對象

 

九個內置對象 不用獲取直接能夠使用

    out  jsp輸出流 向客戶端響應

    page  當前jsp對象 Object page = this ;

    config   對應真身ServletConfig

    pageContext  一個頂 9 個

    request   HttpServletRequest

    response  HttpServletResponse

    exception   Throwable

    session   HttpSession

    application   ServletContext

 

pageContext  

    一個頂9個

    servlet中的三大域  JSP有四大域 

    ServletContext:整個應用程序的範圍

    session : 一個會話  一個用戶一個回話 多個用戶不是一個session 

    request :一個請求連

pageContext : 一個JSP頁面 這個域實在當前的jsp頁面 和當前的jsp頁面中使用的標籤之間共享數據

    域對象

    能夠代理其餘 8 個 域 : pageContext.setAttribute(「aa」,」AA」,PageContext.SESSION_SCOPE ) 這樣就能把數據set到想要放進的域裏

    全域查找**** : pageContext.findAttribute(「XXX」)  從小到大查找 request 開始查找 。。。

    能夠獲取其餘8個內置對象

 

什麼是內置對象?

在jsp開發中會頻繁使用到一些對象,如ServletContext HttpSession PageContext等.若是每次咱們在jsp頁面中須要使用這些對象都要本身親自動手建立就會特別的繁瑣.SUN公司所以在設計jsp時,在jsp頁面加載完畢以後自動幫開發者建立好了這些對象,開發者只須要使用相應的對象調用相應的方法便可.這些系統建立好的對象就叫作內置對象.

在servlet程序中,若是開發者但願使用session對象,必須經過request.getSession()來獲得session對象;而在jsp程序中,開發中可直接使用session(系統幫咱們建立好的session對象的名字就叫session)調用相應的方法便可,如:session.getId().

 

能夠直接調用 不用先獲得

 

九大內置對象:

  1. request        HttpServletRequest   
  2. response       HttpServletResponse  
  3. config         ServletConfig  
  4. application    ServletContext  
  5. session        HttpSession  
  6. exception      Throwable  
  7. page           Object(this)    當前頁面對象
  8. out            JspWriter        輸出流
  9. pageContext    PageContext     一個頂8個

JSP中四大域對象

分類:

[plain] view plain copy

  1. ServletContext     context域  
  2. HttpServletRequet  request域  
  3. HttpSession        session域     --前三種在學習Servlet時就能接觸到  
  4. PageContext        page域     --jsp學習的  

域對象的做用:保存數據,獲取數據,共享數據.

保存數據:

[plain] view plain copy

  1. pageContext.setAttribute("內容");//默認保存到page域  
  2. pageContext.setAttribute("內容",域範圍常量);//保存到指定域中  
  3. //四個域常量  
  4. PageContext.PAGE_SCOPE  
  5. PageContext.REQUEST_SCOPE  
  6. PageContext.SESSION_SCOPE  
  7. PageContext.APPLICATION_SCOPE 

獲取數據:

[plain] view plain copy

  1. pageContext.getAttribute("內容");  

pageContext.getAttribute("name",域範圍常量); 

//自動在四個域中搜索數據 pageContext.findAttribute("內容");//在四個域中自動搜索數據,順序:page域->request域->session域->application域(context域)  默認全域查找

   這裏 若是session還存在 就從session 裏面進行查找

域做用範圍:

[plain] view plain copy

  1. page域:    只能在當前jsp頁面使用                (當前頁面)  
  2. request域: 只能在同一個請求中使用               (轉發)  
  3. session域: 只能在同一個會話(session對象)中使用  (私有的)  
  4. context域: 只能在同一個web應用中使用            (全局的)  

Session對象
    (1)什麼是Session對象 (驗證登陸狀態)
    Session對象是一個JSP內置對象,它在第一個JSP頁面被裝載時自動建立,完成會話期管理。從一個客戶打開瀏覽器並鏈接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱爲一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間切換,服務器應當經過某種辦法知道這是一個客戶,就須要Session對象。
    (2)Session對象的ID
    當一個客戶首次訪問服務器上的一個JSP頁面時,JSP引擎產生一個Session對象,同時分配一個String類型的ID號,JSP引擎同時將這換個ID號發送到客戶端,存放在Cookie中(若是cookie被禁用 就存放在URL),這樣Session對象,直到客戶關閉瀏覽器後,服務器端該客戶的Session對象才取消,而且和客戶的會話對應關係消失。當客戶從新打開瀏覽器再鏈接到該服務器時,服務器爲該客戶再建立一個新的Session對象。
    (3)Session對象的經常使用方法
    ● public String getId():獲取Session對象編號。
    ● public void setAttribute(String key,Object obj):將參數Object指定的對象obj添加到Session對象中,併爲添加的對象指定一個索引關鍵字。
    ● public Object getAttribute(String key):獲取Session對象中含有關鍵字的對象。
    ● public Boolean isNew():判斷是不是一個新的客戶。

invalidate()方法 能夠銷燬session ( 多用於註銷)

Application對象
    (1)什麼時Application對象
    服務器啓動後就產生了這個Application對象,當客戶再所訪問的網站的各個頁面之間瀏覽時,這個Application對象都時同一個,直到服務器關閉。可是與Session對象不一樣的時,全部客戶的Application對象都時同一個,即全部客戶共享這個內置的Application對象。
    (2)Application對象的經常使用方法
    ● setAttribute(String key,Object obj):將參數Object指定的對象obj添加到Application對象中,併爲添加的對象指定一個索引關鍵字。
    ● getAttribute(String key):獲取Application對象中含有關鍵字的對象。

application –> ServletContext

相同點:

 

其實servletContextapplication 是同樣的,就至關於一個類建立了兩個不一樣名稱的變量。

servletServletContext就是application對象。

你們只要打開jsp編譯事後生成的Servlet中的 _jspService()方法就能夠看到以下的聲明:

ServletContext application = null;

application = pageContext.getServletContext();

 

不一樣點:

 

  二者的區別就是application用在jsp中,servletContext用在servlet中。

  applicationpage request session 都是JSP中的內置對象,

在後臺用ServletContext存儲的屬性數據能夠用application對象得到。

 

 

並且application的做用域是整個Tomcat啓動的過程。

例如: ServletContext.setAttribute("username",username);

則在JSP網頁中能夠使用  application.getAttribute("username");

來獲得這個用戶名。

 

Out對象
   Out對象時一個輸出流,用來向客戶端輸出數據。Out對象用於各類數據的輸出。其經常使用方法以下。
    ● out.print():輸出各類類型數據。
    ● out.newLine():輸出一個換行符。
    ● out.close():關閉流。

 

 

 

1、靜態包含指令<%@include file=「fileurl」%>

一、兩個jsp頁面的<%@page contentType=「text/html;charset=gbk」%>應該保持一致

二、不能經過fileurl向被包含的jsp頁面傳遞參數,由於此靜態包含是發生在jsp頁面轉換爲servlet的轉換期間,此時的參數是服務器端設置的死的參數,徹底沒有通過客戶端,這種參數是沒有意義的,如<%@include  file=「fileurl?user=admin」%>,並且此時會報錯。

三、包含的jsp頁面與被包含的jsp頁面共用一個request內置對象。

      好比說在客戶端訪問包含頁面時地址欄後面直接加上參數後傳遞,這種形式的傳參是客戶端送來的,兩個頁面都可以訪問此參數。咱們能夠經過這兩個頁面合成的servlet中能夠看到有傳遞的參數成爲servlet的成員變量。

四、包含的jsp頁面與被包含的jsp頁面最好沒有重複的html標籤。不然會發生覆蓋現象。

2、動態包含<jsp :include page=「a.jsp」/>與靜態包含<%@include  file=「fileurl」%>的區別

1.動態包含用的元素是page,並且有兩種形式。靜態包含用的是file,只有一種形式。

2.生成的文件不一樣,靜態的包含是將兩個jsp文件二合一,生成一個以包含頁面命名的servlet和class文件,動態包含的兩個jsp文件各自生成本身的servlet和class文件。

3. 傳參方式一:<jsp:include page=「a.jsp?param=123」/>時被包含的jsp頁面是能夠訪問該參數的。

4. 傳參方式二:

            <jsp:include page=「a.jsp」>

                     <jsp:param name=「」 value=「」>

                    <jsp:param name=「」 value=「」>

           </ jsp:include >

5.在客戶端訪問包含頁面時地址欄後面直接加上參數後傳遞,這種形式的傳參是客戶端送來的,可是這兩個頁面的request對象不是同一個,由於3已經說了包含的頁面能夠向被包含的頁面傳遞參數,因此被包含的request對象含的參數個數應該大於等於包含頁面的參數個數的。因此它們各有各的request對象。並且被包含的jsp頁面能夠訪問傳到包含頁面的參數。

6.動態包含只有在執行到它的時候才加載,因此它才叫動態包含。

 

JSP動做標籤:

    這些jsp的動做標籤 與html提供的標籤有區別

       動做標籤是由 服務器 來解釋執行! 實在服務器端執行的!

       html由瀏覽器來進行執行

    <jsp:forward> : 轉發 與RequestDispather 的forward 同樣 ,只不過這個在jsp中使用

    <jsp:include> : 包含  基本內容同上

 jsp動做標籤csdn詳解:http://www.javashuo.com/article/p-yzoedfbb-cc.html

    使用<jsp:useBean  class=」bean地址」  id=」bean名字」></jsp:useBean><jsp:getProperty name=」bean 的名字」 property=」property的name」> 定義在useBean標籤外 : 無論有沒有實例化bean都執行 要是定義在useBean標籤裏面 只有實例化了纔會執行

 

JavaBean:

    JavaBean的規範:
       必需要有默認構造器

       提供get/set 方法 (若是隻有get方法 那麼是隻讀屬性)

       屬性:有getset方法的成員 還能夠沒有成員 只有get/set方法  屬性名稱由get /set 來決定 !而不是成員的名稱 ( getName(){ return username;)這裏的屬性名稱是name 而不是username

  方法名稱符合規定

    JavaBean的內省 :

       就是經過反射操做javabean’ 但他比使用反射要方便

       BeanInfo info = Introspector.getBeanInfo(「反射路徑」);

       BeanInfo 能夠獲得 PropertyDiscritpor[]

       BeanInfo 是一個 JavaBean的信息類

           能夠獲得屬性描述符對象 info.getPropertyDiscritpor()

           PropertyDiscriptor.getReadMethod / getWriteMethod

       內省類 – Bean信息 – 屬性描述 – 屬性get/set對應的Method – 能夠反射

      

 使用javabean的jar包beanutil能夠省去不少代碼

   

/*java中class.forName()和classLoader均可用來對類進行加載。
class.forName()前者除了將類的.class文件加載到jvm中以外,還會對類進行解釋,執行類中的static塊。
而classLoader只幹一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance纔會去執行static塊。
Class.forName(name, initialize, loader)帶參函數也可控制是否加載static塊。而且只有調用了newInstance()方法採用調用構造函數,建立類的對象*/

    forName方法會將class加載到jvm中 會執行static代碼

JSP中的javabean標籤:

    <jsp:useBean:>

       <jsp:useBean id=」user1」 class=」包名」 scope=」page 指定的域」>

    <jsp:setProperty>

       <jsp:setProperty property=」username ** 這個是屬性名」 name=」user1 **這是bean的名稱」 value=」XXX **這個是username屬性對應的屬性值」>  在user1的bean裏設置username = XXX

    <jsp:getProperty property=」name」 name=」user1」 > 在user1 的bean裏面查找name的屬性值

 

EL表達式:
    是jsp的內置語言

    ${request_xxx }

    當屬性不存在時 返回空字符串 不是null

    el表達式 能夠作全域查找

       ${xx} 查找xx的屬性值

    也能夠指定域來進行查找
       ${pageScope.xx} 在page裏面進行查找

JSP2.0開始不讓使用Java腳本 而是使用el表達式 動態標籤

    el要替代的是<%= … %>

    el只能作輸出標籤

${xxx} 全域查找 順序先pageContext request session application(注意:若是session還存在那麼仍是在session中進行查找)

    EL能夠輸出的東西 都在11個內置對象之中

   

JavaBean導航:、

   

BeanUtils工具包:


   由上述可看出,內省操做很是的繁瑣,因此因此Apache開發了一套簡單、易用的API來操做Bean的屬性——BeanUtils工具包。
  BeanUtils工具包:下載:http://commons.apache.org/beanutils/,注意:應用的時候還須要一個logging包http://commons.apache.org/logging/
  使用BeanUtils工具包完成上面的測試代碼:

[java] view plain copy

  1. package com.peidasoft.instrospector;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import org.apache.commons.beanutils.BeanUtils;  
  5. import org.apache.commons.beanutils.PropertyUtils;  
  6.   
  7. public class BeanInfoTest {  
  8.   
  9.     /** 
  10. 10.      * @param args the command line arguments 
  11. 11.      */  
  12. 12.     public static void main(String[] args) {  
  13. 13.         UserInfo userInfo = new UserInfo();  
  14. 14.         userInfo.setUserName("peida");  
  15. 15.         try {  
  16. 16.             BeanUtils.setProperty(userInfo, "userName", "peida");  
  17. 17.             System.out.println("set userName:" + userInfo.getUserName());  
  18. 18.             System.out.println("get userName:" + BeanUtils.getProperty(userInfo, "userName"));  
  19. 19.             BeanUtils.setProperty(userInfo, "age", 18);  
  20. 20.             System.out.println("set age:" + userInfo.getAge());  
  21. 21.             System.out.println("get age:" + BeanUtils.getProperty(userInfo, "age"));  
  22. 22.             System.out.println("get userName type:" + BeanUtils.getProperty(userInfo, "userName").getClass().getName());  
  23. 23.             System.out.println("get age type:" + BeanUtils.getProperty(userInfo, "age").getClass().getName());  
  24. 24.             PropertyUtils.setProperty(userInfo, "age", 8);  
  25. 25.             System.out.println(PropertyUtils.getProperty(userInfo, "age"));  
  26. 26.             System.out.println(PropertyUtils.getProperty(userInfo, "age").getClass().getName());  
  27. 27.             PropertyUtils.setProperty(userInfo, "age", "8");  // IllegalArgumentException  
  28. 28.         } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {  
  29. 29.             e.printStackTrace();  
  30. 30.         }  
  31. 31.     }  

32. }  

運行結果:

[java] view plain copy

  1. set userName:peida  
  2. get userName:peida  
  3. set age:18  
  4. get age:18  
  5. get userName type:java.lang.String  
  6. get age type:java.lang.String  
  7. 8  
  8. java.lang.Integer  
  9. Exception in thread "main" java.lang.IllegalArgumentException: Cannot invoke com.peidasoft.instrospector.UserInfo.setAge on bean class   
  10. 10.     'class com.peidasoft.instrospector.UserInfo' - argument type mismatch - had objects of type "java.lang.String" but expected signature "int"  
  11. 11.     at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2181)  
  12. 12.     at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2097)  
  13. 13.     at org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1903)  
  14. 14.     at org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:2010)  
  15. 15.     at org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:896)  
  16. 16.     at com.peidasoft.instrospector.BeanInfoTest.main(BeanInfoTest.java:32)  

17. Caused by: java.lang.IllegalArgumentException: argument type mismatch  

  1. 18.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  2. 19.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)  
  3. 20.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  4. 21.     at java.lang.reflect.Method.invoke(Method.java:483)  
  5. 22.     at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2116)  
  6. 23.     ... 5 more  

  說明:

1. 得到屬性的值,例如,BeanUtils.getProperty(userInfo, "userName"),返回字符串。
  2. 設置屬性的值,例如,BeanUtils.setProperty(userInfo, "age", 8),參數是字符串或基本類型自動包裝。設置屬性的值是字符串,得到的值也是字符串,不是基本類型。   

3. BeanUtils的特色:
  1). 對基本數據類型的屬性的操做:在WEB開發、使用中,錄入和顯示時,值會被轉換成字符串,但底層運算用的是基本類型,這些類型轉到動做由BeanUtils自動完成。
  2). 對引用數據類型的屬性的操做:首先在類中必須有對象,不能是null,例如,private Date birthday=new Date();。操做的是對象的屬性而不是整個對象,例如,BeanUtils.setProperty(userInfo, "birthday.time", 111111);

[java] view plain copy

  1. package com.peidasoft.Introspector;  
  2. import java.util.Date;  
  3.   
  4. public class UserInfo {  
  5.   
  6.     private Date birthday = new Date(); // 引用類型的屬性,不能爲null  
  7.       
  8.     public void setBirthday(Date birthday) {  
  9.         this.birthday = birthday;  
  10. 10.     }  
  11. 11.     public Date getBirthday() {  
  12. 12.         return birthday;  
  13. 13.     }        

14. }  

[java] view plain copy

  1. package com.peidasoft.Beanutil;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import org.apache.commons.beanutils.BeanUtils;  
  5. import com.peidasoft.Introspector.UserInfo;  
  6.   
  7. public class BeanUtilTest {  
  8.     public static void main(String[] args) {  
  9.         UserInfo userInfo=new UserInfo();  
  10. 10.          try {  
  11. 11.             BeanUtils.setProperty(userInfo, "birthday.time","111111");  // 操做對象的屬性,而不是整個對象  
  12. 12.             Object obj = BeanUtils.getProperty(userInfo, "birthday.time");    
  13. 13.             System.out.println(obj);            
  14. 14.         }   
  15. 15.          catch (IllegalAccessException e) {  
  16. 16.             e.printStackTrace();  
  17. 17.         }   
  18. 18.          catch (InvocationTargetException e) {  
  19. 19.             e.printStackTrace();  
  20. 20.         }  
  21. 21.         catch (NoSuchMethodException e) {  
  22. 22.             e.printStackTrace();  
  23. 23.         }  
  24. 24.     }  

25. }  

  3. PropertyUtils類和BeanUtils不一樣在於,運行getProperty(取出來是object類型)、setProperty操做時,沒有類型轉換,使用屬性的原有類型或者包裝類。因爲age屬性的數據類型是int,因此方法PropertyUtils.setProperty(userInfo,"age", "8")會爆出數據類型不匹配,沒法將值賦給屬性。

 

 EL 能夠輸出11個內置對象
    其中10個是map=(鍵值對應)  pageContext不是map 就是pageContext

    param:對應參數 是一個map key參數名 value是單個參數值

    paramValues:對應參數 是一個map key參數名 value是多個參數值

    header:對應請求頭 是map key是頭名稱 value單個頭值 適用於單隻請求頭

    headerValues:對應請求頭 是map key是頭名稱 value多個頭值 適用於多隻請求頭  

    initParam: 獲取<context-param> 裏面的參數

   

*cookie:Map<String ,Cookie> 類型 其中key是cookie的name  value是cookie的對象

    ** 這裏的${cookie.username(指定是那個cookie,此處返回cookie對象 ).value(**必須加value纔是返回的參數值}

*pageContext : ${pageContext.request.contextPath} 獲取request裏面的項目名 /day01

***之後的href action都要用${pageContext.request.contextPath}這個el語句 以防項目名的變更

    或使用: <c:url value=」/頁面名」/>

 

el函數庫:

    導入標籤庫: <%@ taglib prefix=」fn」uri=http://java.sun.com/jsp/jstl/function%>

    String toUpperCase(String input) : input轉化爲大寫

    String toLowerCase(String input) :input轉化爲小寫

    int indexOf(String input ,String substring) :返回substring在input裏面的位置 沒有的話返回-1

    boolean contains(String input ,String substring) :input是否包含substring

    boolean containsIgnoreCase(String input ,String substring) :input是否包含substring(忽略大小寫)

    Boolean startsWith(String input ,String substring) :input是不是substring開頭

    Boolean endsWith(String input ,String substring) :input是不是substring結束

    String substring(String input ,int beginIndex ,int endIndex) :input中從beginIndex截取到endIndex(留頭不留尾)

    String substringAfter(String input ,String substring) :獲取input中substring後面的字符

    String substringBefore(String input ,String substring) :獲取input中substring前面的字符

  String escapeXml(String input) :把input中的’<’,’>’,’&’,’ ’ ’,’ ’進行轉譯

    String trim(String input) :去除先後空格

    String replace(String input , String substringBefore , String substringAfter) :在input中用substringAfter替換substringBefore

    String[] split(String input ,String delimiters) :用delimiters分割input 返回字符串數組

    int length(Object obj) :返回長度 對象是Object

    String join(String array[] ,String separator) :用separator鏈接array[]

taglib ———標籤庫

cookie的值是cookie類型 el語法中 ${cookie.XX.value} 才能去除object對象

 

JSTL標籤語言:

    JSTL是EL表達式的擴展

    使用jstl須要導入jar包

     

導入標籤

    jar包

    在jsp頁面中 <%@taglib prefix=」前綴」 uri=」路徑」%>

core核心標籤庫: 習慣用c做爲前綴(要導入http://java.sun.com/jsp/jstl/core這個jar)

    out 和 set

       <c:out value=」@{aaa(表示全域查找aaa)}」

       <c:out value=」@{aaa}」 default=」xxx」/> 全域查找 沒有就輸出xxx

       out的做用是輸出

       value:能夠使字符串敞亮 也能夠是el表達式

       default:若要輸出的內容爲null 會輸出default指定的值

    set 設置屬性值

       var:變量名

       value:變量值 能夠使el表達式

       scope:域 默認爲page 可選值:page request session application

       <c:set var=」a」 value=」hello」/>  默認存在page域

       <c:set var=」x」 value=」xa」 scope=」session」/>

    remove

       在域裏面刪除對象

       var 變量名

       scope 若是不給出scope 刪除全部域的變量

       <c:remove  var=」a」/> 刪除全部域裏name爲a的屬性

    url

       value:指定一個路徑 它會在路徑前面自動添加項目名

       <c:url value=」/index.jsp」/> 輸出:/day1/index.jsp

       子標籤:<c:param> 給url後面添加參數

       <c:url value=」/index.jsp」>

           <c:param name=」username」 value=」lxa」/>

        </c:url>  這樣就能傳入參數 能夠爲參數作url編碼

    <a href=」<c:url value=」/index.jsp」/>」>點擊這裏回到主頁</a>

       兩個標籤不是一種 一個是瀏覽器執行 一個是服務器執行

 

if

    標籤屬性必須是一個boolean值

    <c:if test=」布爾類型」 > 這裏是執行語句… </c:if>

   

    choose

       <c:set var=」score」 value=」@{param.score}」/>

       <c:choose>

           <c:when test=」${score=10}」 > 分數是10 </c:when>

           <c:when test=」${score=20}」 > 分數是20 </c:when>

           <c:otherwise>不及格</c:otherwise>

        </c:choose> 相似於if else

forEach (只能循環域中的對象)

         用來循環遍歷數組集合

       還能夠用計數的方式循環

       var 循環變量

       begin 設置循環變量從幾開始

       end 設置循環變量到哪裏結束

       step 步長 等同於 i+=X 默認值爲1

       <c:forEach var=」i」 begin=」1」 end=」10」 step=」2(步長)」>

           ${i}

       </c:forEach>

       用來輸出數組 集合

       <c:forEach items=」@{strs}」 var=」str」>

       ${str }

       </c:forEach>  strs是數組或者集合
       等同於:

           for(String str:strs){}

    循環狀態

       使用varStatus建立循環變量

       屬性: count 循環元素個數

              index 元素下表

              first 是不是第一個元素

              last  是不是最後一個元素

              current  當前元素

FMT:

    格式化標籤庫

    <fmt:formatDate 用來格式化如期

    <fmt:formatDate value=」指定一個date類型變量」 pattern=」yyyy-mm-dd HH:mm:ss」/>

    格式化數字:

    <fmt:formatNumber value=」」 pattern=」0.00(表示要去小數點後兩位 而且四捨五入 不足的 補 0」/>

    <fmt:formatNumber value=」」 pattern=」#.##(表示取兩位 四捨五入 可是不足的 不補0」/>

 

自定義標籤 :

    要減小使用<%。。。。%> 這樣的代碼

自定義標籤的步驟:

    標籤處理類(標籤也是一個對象 須要有類)

    tld文件 是一個xml

    頁面中使用<%taglib%> 來制定tld的位置

標籤處理類:(建立自定義標籤以後繼承simpleTag類)

    simpleTag接口:

       void doTag 每次執行標籤都會調用這個方法

       JSPTag getParent  返回父標籤(非生命週期方法)

       void setParent(JspTag)  設置父標籤     void setJspBody(JspFragment) 設置標籤體

       void setJspContext(JspContext)  設置jsp上下文對象 它兒子是pageContext

       全部setXXX方法都在doTag以前調用 因此在doTag裏面均可以使用

其中doTag 會在其餘三個方法以後被tomcat調用

    eg:

    public class MyTag implement SimpleTag{

       private PageContext pc;

       private JspFragment jf ;

       public void doTag(){

           PageContext.getOut().print(「Hello!」);

       }

       public

 

    tld文件的配置:

       通常放在WEB-INF之下 保證客戶端訪問不到(web-inf被稱爲安全目錄 在瀏覽器裏不能進行訪問 )

   

 

    頁面中指定tld文件的位置 一個tld文件裏面能夠部署多個標籤

   

SimpleTagSupport 實現了SimpleTag接口 把tomcat傳的值已經配置好了

    直接重寫doTag就能夠 在this.get…. 來調用配置好的參數等等

    simpleTagSupport使得自定義接口更加簡單便捷

繼承simpleTagSupport

有標籤體的內容:

    empty: 表示沒有標籤體

    scriptless :只能是el表達式 也能夠是其餘標籤

   

不執行標籤下內容的標籤(是下面全部的標籤都不會進行執行)

    在標籤處理類中的doTag 中使用SkipPageException來結束!

    tomcat會調用標籤處理類的doTag方法 獲得exception會跳過其餘內容

   

自定義標籤 --- 有屬性的標籤

    <c:if test=」test是boolean類型」>

  *步驟:

    給標籤處理類定義屬性

    給tld文件進行屬性配置

    public class … extends simpleTagSupport {

    private Boolean text ;定義屬性

    public void setTest(boolean test){

       this.getJspBody().invoke(null);  (若是使用的輸出流是null 表示使用的就是當前頁面的out

    }

    爲標籤處理類中添加屬性

       爲標籤處理類添加屬性 屬性至少有一個set方法 這個set方法會在doTag方法以前被tomcat執行 所在的doTag方法就可以使用屬性了

    給tld文件進行屬性配置

    在<tag>標籤下添加字標籤:

       <attribute>

           <name>test</name>   屬性名必須一致

           <required>true</required>  是否必須出現屬性值

           <rtexprvalue>   </rtexprvalue>在使用標籤時能不能使用表達式來動態指定數據 (多是相似el語句之類的定西)

            </attribute>

     

MVC:設計模式(模型視圖控制器)

      應用普遍 全部BS項目都在使用

      相互分離 互不相干 設計模式

 

 

 

JavaWeb三層架構

      web層 :與web相關的內容(Servlet JSP Servlet相關的API)

      業務層 :業務對象 service

      數據層 :操做數據 又叫DAO dataaccessobject

 

 

MySQL:

      use XXX(數據庫名稱 進入數據庫)

  SQL語句:

      ddl 數據庫 表 的結構操做

     dml 對錶的記錄進行更新(增刪改)

      dcl 對用戶的建立 受權

DDL:

      查看全部數據庫 show databases(複數)

      使用數據庫 use XXX

      建立數據庫 create database [if not exists] XXX [charset=utf8] [裏面的內容是可選的]

      刪除數據庫 drop database [if exists] XXX

      修改數據庫編碼 alter database XXX character set utf8 更改成utf8

 數據類型:

       int 整數

      double 浮點數 double(5,2)表示最多五位數 有兩位小數

       decimal 浮點數 不會出現精度缺失 (多用於金錢)

       char 固定長度的字符串類型 char(25) 不足25則會自動補全

       varchar 可變長度的字符串類型 varchar(25) 不足25的不會自動補全

            char 因爲是 固定的 因此使用比varchar方便

       text 字符串類型 容量大

       blob 大字節類型

       data 日期類型 格式爲 YYYY-MM-DD

       time 時間類型 格式爲 hh:mm:ss

       timestamp 時間戳類型

表:

      建立表 (前提是先要進入一個數據庫)

       create table [if not exists] 代表

       查詢表 desc XXX代表

      修改表:

            添加列 :

                  alter table XXX

                  add( name varchar(50) ); 添加一條列

            更改列屬性:

                  alter table XXX

                  modify name varchar(10) ;修改成10長度

      修改表名 :

            alter table XXX rename to NEWXXX

     查詢表記錄

            select * from 

插入信息:

      insert into XXX表名 (name , age , sex//這裏是table裏有的數據名稱) values(‘lxa’,21,’nan’);

      insert into XXX values(‘lxa’,21,’nan;); 也能夠不寫數據名稱 但要一一對應 不建議這樣寫 可讀性下降

  插入時 能夠不指定全部列 其餘爲默認值

修改表:必定不要忘了 中間喲個set

      update XXX set age=age+1 , id=1  where name=’LXA’ or id=111 ; where 關鍵字的使用

      update XXX set age=age+1 where age between 18 and 40 ;

      update XXX set age=age+1 where age>=18 and age<=40 ;

  只要 數值 = null 用來篩選null 要用is null 不要用where XXX=null 用 where XXX is null ;

     

刪除記錄:

      delete from XXX where(按條件刪除) name is null ;

     delete from XXX ; 全刪了 必定要加where 否則全刪了

     

DCL

      通常狀況下 一個項目建立一個用戶 一個項目對應一個用戶(這個用戶只能對這個數據庫有權限 其餘項目不歸他管)

      create user 用戶名@IP地址 identified by ’密碼’;

        用戶只能在指定的IP地址上登陸

      create user 用戶名@’%’ identified by ‘密碼’;

        表示能夠在任意ip下登陸

 給用戶受權:

      grant 權限1,權限2,權限n on 數據庫名稱 to 用戶名@ip地址

      grant all(表示把全部權限都給) on DATABASE.*(表示有全部數據庫權限) to USER ;

       權限: create alter drop insert update delete select

撤銷權限:

      revoke 權限1 權限2 權限n on DATABASE from USERNAME@IP地址 ;

      revoke all on mydatabase from root@loaclhost ;

查看權限:

      show grants for USERNAME@IP地址;

刪除用戶:

      drop user USERNAME@IP地址;

 

基本查詢(列控制):

      select * from 表名 ;

        表示查詢全部。

      select name ,age from table ; 指定查詢

     

      select distinct name from table ; distinct 表示不顯示重複的數據

 

   *** select *,age+10 from table ; 表示在列出全部後 在加上一行age+10後的數據

        任何類型和null相加 都變成null

      select *,age+ifnull(數據的名稱,0/要變成的值) from table;

  select concat(‘我是’,name,’今年’,age,‘歲。’) from table;

       concat用於鏈接字符

  select name as 姓名,job as 工做 from table ;

      給列的名字 起別名(這裏能夠省去as)

       ** select name xingming , age from table ; 這樣執行不會出錯 不是少了 逗號 是理解爲起了別名

 

模糊查詢: (關鍵字 like  _表示一個字符 %表示0~n個字符)

      select * from list where name like ‘Liu_’; 模糊查詢 表示含有Liu 後面是一個字

      select * from list where name like ‘Zheng__’ 兩個下劃線 表示Zheng後面有兩個字符

      select * from list where name like ‘%Ang’ ; 表示匹配0~n個字符

      select * from list where name like ‘Liu%’ 表示匹配0~n個字符

      select * from list where name like ‘%小%’ 表示查詢 有 小 字的元素

排序: (關鍵字 order by) asc升序排列 desc降序排列

      select * from list ORDER BY age ASC; 表示進行升序排列

      select * from list ORDER BY age ASC ,sal DESC , comm ASC ; 表示 在 第一個條件相同時 用逗號後面的第二個條件進行 比較 , 再次相同時 用逗號後面的再次進行比較 以此類推。

      ** net stop mysql ; 中止mysql

聚合函數:(縱向查詢)

      select count(comm//要查詢的列) from list ; 表示comm項裏面不爲null的都進行計數

select sum(comm) from list ; 計算comm的和

select min(comm) from list ;找出comm的最小那個 顯示

select avg(comm)from list ;計數comm的平均值 null當作0。

 

分組查詢:(關鍵組 group by)

      根據group by後面的元素(分組列) 進行分組

  關鍵字: having 後面跟 分組後條件

            分組前的條件用 where

ifnull: ifnull(XX,’none’)  若是XX爲null 在表中顯示爲 none

 

limit關鍵字(只在mysql能夠使用)用於進行分頁查詢

      select *from list limit 0,5; 表示從0行查(相似於下標 都要+1)  查5行

     

  分頁查詢: 大量數據不能一下全顯示  相似百度 會進行分頁查詢

      若; 每頁8行記錄 要查17頁的記錄

            limit (17-1)*8 , 8 ;

     

Mysql編碼:

      show variables like ‘char%’  顯示字符類型

  character_set_client=utf8 這說明不論發送什麼編碼 mysql都當成utf8對待

            若 編碼不一樣意 會報錯

      每次設置編碼以後 再次打開仍是原來的狀態。。

        解決方法** : 在總配置文件裏面解決

                  my.ini default-character-set=gbk  進行設置 (主要解決 client result的編碼問題)

     

Mysql的備份 恢復:(命令)

      mysqldump –u用戶名 –p密碼(已經登錄了就不須要) mydb3>c:a.sql (mydb3數據庫名 c:a.sql 傳出路徑 後綴必須是.sql

*** 恢復數據庫:(前提時已經進行了數據庫的存儲 格式爲.sql)

      想要恢復以前drop的內容

1, 先退出

2, mysql –uroot –p123 mydb<c:/a.sql

3, 這樣就導入了以前存儲的數據庫

source c:/a.sql 這樣使用source語句也能夠恢復 (導入)

約束:
      主鍵(primary key): 非空 惟一 被引用

      主鍵不能爲空

      經過主鍵 引用

      主鍵的值不能重複

 如何在修改表時 設置主鍵 :

      alter table {

add添加

modify修改

change修改

drop刪除

rename to 更名}

alter table XXX add primary key(要設置的元素名);

   刪除主鍵: alter table XXX drop primary key;

主鍵自增加:

      主鍵必須 非空 惟一

      name INT PRIMARY KEY AUTO_INCREMENT 自動增加

 

概念模型:
      對象模型:在java裏是domain

      關係模型: 在數據庫中表!

            概念模型在java中成爲實體類(javaBean)

外鍵約束:(外鍵必須約束主鍵)

      外鍵必須是另外一個表的主鍵

      外鍵能夠重複 外鍵能夠爲空

      一張表中能夠引用多個外鍵

  也能夠在同一張表上進行約束

      --外鍵約束:

alter table 表名

add constraint FK_字段名--"FK"爲外鍵的縮寫

foreign key (字段名) references 關聯的表名(關聯的字段名) --注意'關聯的表名'和'關聯的字段名'

      --刪除建立的約束:

alter table 表名

drop constraint 約束名--約束名爲你前面建立的如:PK_字段這樣的約束名

--注意:若是約束是在建立表的時候建立的,則不能用命令刪除

--只能在'企業管理器'裏面刪除

 

一對一關係:
      能夠經過 兩個表的主鍵  進行外鍵對應 造成1對1 關係

        從表的主鍵 是外鍵

多對多關係:(與要用到 中間表)

      建立 學生表  create table stu ( sid int primary key  , name varchar(10) ) ;

                        create table tea (tid int primary key  ,name varchar(10));

                  建立關聯表(有兩個外鍵):** 全部關係都要在這個表 裏面體現

                       使用關聯表 建立多對多關係

                       create table mid(t+ sid int ,tid int ,

                             constraint fk_stu foreign key(sid) references stu(sid);

                             constraint fk_tea foreign key(tid) references tea(tid););

       

      多表查詢:

            合併結果集: 就是一個表格 ( 要求兩個表 列數 列類型 *徹底相同 )

 

鏈接查詢: 一次查詢多個表

    內鏈接: 會出現許多 沒用的數據 (叫作 笛卡爾積)

       ** 能夠用 where 語句 去除沒有用的信息 (去除 笛卡爾積)*要打表名的前綴

           也能夠 給表起別名

      

 

外連接:

    select * from XXX1 natural join XXX2 ; (天然內鏈接:能夠省去寫條件 直接去除笛卡爾積 可是可讀性下降)

 

 

子查詢:

    例如:在本公司查詢工資最高的員工信息 (在where中 不能有函數語句)

           select*from XXX where sal=( select max(sal) from XXX);

        也能夠 select *from (select from XXX where sal=1000) where name=XXX;

      例如:找出工資高於平局工資的人

                  select*from XXX where sal>(select avg(sal) from XXX(這個表時單行單列));

         若是是多行單列的 被查詢結果 時: 能夠使用ALL   ANY

            單行多列: select * from XXX where (job,sal) in (select job,sal from XXX where name=’lxa’); 經過獲取lxa 的sal job 列表 獲取XXX表格裏面相同的對象

      一張表也能夠自身連接。

     

JDBC:使用java代碼向服務器發送sql語句:

    連接步驟:

1. 導入jar包

2. 加載驅動類: Class.forName(「類名」);

3. 給出url username password

4. 使用diverManager類獲得connection對象

  jdbc四大配置參數:

       driverClassName : com.mysql.jdbc.Driver

       url : jdbc:mysql://localhost:3306/XXX 要使用的數據庫名稱

       username: 用戶名

       password:密碼

driverClassName = com.mysql.jdbc.Driver

url = jdbc:mysql://localhost:3306/數據庫名稱

 加載驅動類 Class.forName(com.mysql.jdbc.Driver);

    Connection conn=DriverManager.getConnection(「jdbc:mysql://localhost:3306/XXX」,username,password);

   ** 對數據進行增刪改

    經過connection 對象建立聲明

       ** statement語句向數據庫發送sql語句

           Statement sta = conn.createStatement();

           建立sql語句:

           String sql = 「insert into XXX values(‘lxa’,21)」;

              *** sql語句不用加;

           ResultSet 結果集

              ResultSet rs = sta.executeQuery(sql);

             ResultSet有一個行光標

              next()方法能夠把行光標向下移動一行

     

           next方法返回一個boolean類型 表示 當前行是否存在

     ResultSet 提供了許多 getXXX方法:

    ******* 使用結束以後 必定要 將ResultSet Statement Connection 關閉

   

DriverManager:

    可能出現的異常:

    ClassNotFoundException:沒有導入jar com.mysql.jdbc.Driver打錯了

Statement 方法:

    executeQuery 查詢  返回 ResultSet結果集

    executeUpdate 更新 返回int類型 說明執行了幾行

    execute 方法能夠執行全部sql語句 返回boolean 不會直接返回結果集(少用)

ResultSet方法:

    next 向下移動一行

    last 移動到最後一行

    getRow 返回int 這是第幾行

    beforeFrist 移動到第一行的上一行

    absolute(int ow) 移動到X行 返回boolean 是否成功

 

 獲取結果集數據:

    獲得元素據:rs.getMetaData() 返回ResultSetMetaData;

    獲取結果集列數: int getColumnCount() rs.getMetaData().getColumnCount();

    獲取指定列的列名:Sting rs.getMetaData().getColumnName(int columnIndex);

 

PreparedStatement

    防止sql攻擊

    提升可讀性 可維護性

    提升效果

 

學習PreparedStatement:(用問好替換)

    給出sql模板

    PreparedStatement pstmt = conn.prepareStatement(sql);

    pstmt.setSting/setInt=XXX;

    調用pstmt的executeQuery executeUpdate 都沒有參數

 

jdbcUtils:

    做用:老是進行獲取鏈接 過於繁瑣

    將參數放入配置文件

    加載配置文件

 

    static{

File f = new File();

       Properties p = new Properties();

       p.load(f);

       Class.forName(p.getProperty(「鍵名」));

}

      只在第一次加載時初始化 防止屢次加載形成的浪費

return àDriverManager.getConnection(jdbc:mysql://localhost:3306/XXX,username,password);

   

DAO模式:(感受就是往麻煩了設計。。)

    將訪問數據庫的代碼封裝起來

    經過配置文件 反射 接口等

 

 

大數據;

    把mp3保存到數據庫

 

批處理:

    用循環向pstmt添加sql語句

    調用pstmt的執行方法向數據庫發送

   

主要語法: addBatch 添加

           executeBatch 執行

       Batch——批處理

 

事務: ACID (eg:轉帳系統 安全)

    原子性:不可再分割 一塊兒生一塊兒死

    一致性:不管成功與否數據庫與業務保持一致

    隔離性:併發操做不會產生影響 保持一致

    持久性:數據到達數據庫以後不能出問題 (若是數據達到數據庫 數據庫崩潰 數據也能恢復)

 

mysql中操做事務:

    關鍵字:start transaction ; 事務開始

           commit ; 事務提交

           rollback ; 回滾 (事務回滾能恢復到事務開始的狀態 可是若是事務commit 就不能回滾 由於事務成功提交了)

 

JDBC中處理事務:

    在JDBC中處理事務 都是經過connection完成的

    connection的三個事務相關方法:

      setAutoCommit(boolean) 設置是否爲自動提交事務 若是爲true(默認爲true)表示自動提交 也就是每執行sql語句都是一個單獨的事務 若是設置爲false 那麼至關於開啓了事務

    Connection.setAutoCommit(false); 表示開啓事務

    commit();表示提交事務

    rollback(); 回滾事務 若是沒有commit 那麼能夠回滾到執行事務以前的狀態

 

同一個事務必需要在同一個connection操做

    在分離式DAO時 必定要要同一個Connection (經過傳遞Connection保持一致)

 

   sql JAR包的東西都要出如今DAO業務中

      把全部對Connection的操做隱藏起來

 

事務的隔離級別:

    事物的併發讀問題:

    髒讀: 讀取到另外一個事務未提交的數據,讀取到了髒數據

    不可重複讀:對同一個數據連續兩次的讀取不一致 由於中間另外一個事務作了修改

    幻讀(虛讀): 對同一個表兩次查詢不同 由於另外一個事務插入了記錄

 四大隔離級別:

    SERIALIZABLE(串行化):怒會出現併發問題 性能最差 可是最安全

 

數據鏈接池:(做用是可重用)

    每每用map來實現值

    初始大小:10個

    最小空閒鏈接數:3個

    增量:一次建立的最小單位(5個)

    最大空閒鏈接數:12個 

    最大鏈接數:20個

    最大等待時間:1000毫秒

  鏈接池:建立鏈接 銷燬鏈接

鏈接池使用四大參數完成配置

    JAR包 : bdpc須要pool

鏈接池 必須實現javax.sql.DataSource接口!

鏈接池 必須實現四大參數

鏈接池 必須返回connection對象 他的close()方法不一樣 調用close不是關閉 而是歸還

 

鏈接池內部使用了四大參數連接對象 即mysql驅動提供的Connection

鏈接池使用mysql的鏈接對象進行裝飾 對close()方法加強

裝飾以後的connection的close()方法 用來把當前的鏈接池歸還

close()方法會將連接歸還給鏈接池

 https://blog.csdn.net/shuaihj/article/details/14223015

 

裝飾者模式:

    對象加強的手段:

       繼承

       裝飾者模式

       動態代理

  使用繼承會使類class增多 這是應該使用裝飾者模式(動態裝配)

    裝飾者模式:

       咖啡 a = new 加糖();

       咖啡 b = new 加糖(a); 對a進行裝飾

    繼承的缺點: 加強的內容不能動

                  被加強的對象不能改變

 

在io流中大量應用裝飾者模式

    四大流:InputStream OutputStream Reader Writer

       FileInputStream 是一個節點流 就是和一個磁盤上的文件資源進行綁定

       BufferedInputStream 是一個裝飾流 建立時必定要有底層對象 無論給的是什麼流 都會添加緩衝區

       new bufferedInputStream(new InputStream(「…」));

       對象流: ObjectInputStream(new InputStream(「…」));

    裝飾: 不知道被加強對象的具體類型時 能夠使用

       class MyConnection implemenyts Connection {

           private Connection conn ;

           public MyConnection(Connection c ){

              //經過構造器傳遞底層對象

              this.c = c ;

           }

           public Statement createStatement(){

              return c.createStatement();

           }

           public void close(){

              //把當前鏈接歸還給池

           }

       }

 

C3P0 鏈接池:

    免費 功能強於dbcp

    C3P0的鏈接池: ComboPolledDataSource

       *** 都要導入jar包

 

C3P0的配置文件:(最好使用C3P0鏈接池)

    文件名稱必須叫 c3p0-config.xml

   

    鏈接時 會自動生成配置文件

   

JNDI : java命名 目錄接口

一、JNDI 提出的目的是爲了解藕,是爲了開發更加easy維護,easy擴展。easy部署的應用。 
二、JNDI 是一個sun提出的一個規範(類似於jdbc),詳細的實現是各個j2ee容器提供商。sun   僅僅是要求,j2ee容器必須有JNDI這種功能。
三、JNDI 在j2ee系統中的角色是「交換機」,是J2EE組件在執行時間接地查找其它組件、資源或服務的通用機制。 
四、JNDI 是經過資源的名字來查找的,資源的名字在整個j2ee應用中(j2ee容器中)是惟一的。 

ThreadLocal

ThreadLocal是解決線程安全問題一個很好的思路,它經過爲每一個線程提供一個獨立的變量副本解決了變量併發訪問的衝突問題。在不少狀況下,ThreadLocal比直接使用synchronized同步機制解決線程安全問題更簡單,更方便,且結果程序擁有更高的併發性。

 

dbUtils: 

   

 

 

dbutils總結

    QueryRunner方法:

       int updata(String sq1,Object[] params)   執行增刪改

       T query(String sql,ResultSetHandler rsh ,Object[]…params)  執行查詢

       int updata(Connection conn , String sql , Object…params)  須要調用者提供connection 說明此方法不在管理connection  能夠支持事務

       T Query(Connection conn ,String sql ,ResultSetHandler rsh,Object…params)

      

    ResultSetHandler 接口:

       BeanHandler  構造器須要一個Class類型參數 用來把結果轉化成指定的類型javaBean對象

       BeanListHandler 多行 : 構造器須要一個Class類型的參數 用來把一行結果轉化成指定的javaBean  多行就轉化成多個javaBean

       MapHandler 單行 : 把一行結果轉化成Map對象

           一行記錄:  一個Map

       MapListHandler 多行 : 多行多個Map List<Map>

       ScalarHandler 單行單列 : 一般與select count(*) from XXX 這個語句結果是單行單列 返回一個Long類型(若是想要轉化成別的類型 先轉化成 Number類型 在轉化成別的數字類型

      

 

BeanListHandler: 用於單行多行記錄

 

MapListHandler: 用於單行多行記錄

 

 

BaseServlet

    咱們但願在一個servlet中能夠有多個請求處理方式

     客戶端請求時 要多發送參數 告訴是用什麼方法

       請求處理方法:除了名稱以外 都和service相同

       請求處理方法 參數 聲明異常 都要與 service相同

   在service裏面獲取參數 來獲得請求的方法

       客戶端必須傳遞 叫作method的參數

        {以後要進行if判斷 並進行調用}     

           ** 認爲能夠不用if判斷 而是經過參數名 反射 方法

        須要獲得當前類的Class對象 : Class c = this.getClass();

Method m = c.getMethod(參數名稱 , HttpSerlvetRequest.class,HttpServletResponse.class);

           m.invoke(這裏寫入參數 );  // 執行方法

       ** 正常調用方法 this.addUser(參數 ) 

           反射調用方法 this.addUSer(this,參數);

     BaseServlet每每都會被繼承

BaseServlet:servlet經常會轉發重定向

    在一個BaseServlet方法 返回 String 例如:「f:/index.jsp」

      經過 冒號 分割字符串 前面f轉發 r重定向 後面是路徑

      

在service中處理事務:

 

 

/** trim()他的所用是去掉字符序列左邊和右邊的空格 **/

  Connection不能出如今service中

 

在jbdcUtilsw中使用threadlocal來進行事務處理(防止多線程報錯)

    beginTransaction : 要在threadLocal中建立connection

       commitTransaction : 要remove Connection

       ThreadLocal想一個存儲單元

 

項目開始第一步:

       導入原型  只有頁面沒有功能的頁面

         導包:mysql驅動 c3p0 dbutils

 

表單有target 超連接也有target  target:內容在那裏顯示

    <base>

 

InvocationTargetException 這個異常  說明反射調用的方法裏面出現了錯誤直接去查控制檯報錯

 

分頁:

什麼是分頁

    能夠減小信息的傳遞 進行有用信息傳遞

頁面數據都是servlet傳遞過來的

  servlet 當前 pageCode pc

       pc 若是頁面沒有傳遞當前頁面

    總頁數 totalPage tp

       tp 總記錄/每頁記錄數

    總記錄數 totalRecord tr

       tr 總記錄數

每頁的記錄數 是業務數據 能夠自行更改

 

數據的傳遞:

    把分頁數據封裝在JavaBean之中 叫作分頁Bean 

       例如:pageBean

 

 

/** limit A,B; 從第a行開始查找 向後查找b個記錄

 

分頁在各層中的處理:

    頁面 : 傳遞當前頁碼 pc

    servlet: 建立pageBean對象 給pageBean賦值 傳遞當前頁面

       servlet須要給dao傳遞pc ps

    service: 中轉站

    dao :使用select count(*) from … 獲取記錄總數

           BeanList select * from XXX limit X,Y; 裝載數據

 

 

分頁工序流程圖:

 

Servlet:

    獲取request的當前頁面 pc

    獲取每頁記錄數 ps

    調用service的方法 將參數傳遞

DAO:

    建立一個pageBean 用queryRunner進行查找

    將數據封裝到PageBean之中

 

顯示分頁頁碼列表:

    能夠顯示10個頁碼

 

須要把條件以String 的形式 保存到pagebean交給servlet

 分頁難

 

JavaWeb監聽器:

    javaweb三大組建:

       servlet

       listener

       filter

 

listener監聽器:

    是一個接口 由咱們來實現

    須要註冊 註冊在按鈕上

    監聽器中的方法 會在特殊事件發生時調用

 

javaWeb中的監聽器:

    事件源 三大域:

    ServletContext:在服務器開啓時出生 關閉時結束 每一個項目只有一個

       生死監聽: ServletContextListener 有兩個方法 一個在出生時調用 一個而在死亡時調用

       屬性監聽: ServletContextAttributeListener 有三個方法: 一個在添加屬性調用 一個在替換屬性時調用 一個在屬性被remove時調用

    HttpSession:會話監聽每一個用戶都有一個 request.getSession時會建立一個session  可是任何一個jsp頁面都會自動建立一個session

       生死監聽:HttpSessionListener: 個方法 在出生時調用 在死亡是調用

       屬性監聽:HttpSessionAttributeListener 3個方法 一個在添加屬性時調用 一個在替換時調用 一個在remove時調用

    ServletRequest: 請求發出時建立 可是請求靜態資源時不會建立

       生死監聽:HttpServletRequest 2個方法 出生時調用 死亡時調用

       屬性監聽:HttpServletRequest 3個方法 添加屬性調用 替換時調用 移除時調用

 

 

 void attributeAdded(ServletContextAttributeEvent e *事件源*) 添加屬性

 void attributeReplaced(ServletContextAttributeEvent e ) 替換屬性

 void attributeRemoved(ServletContextAttributeEvent e ) 移除屬性

HttpSession :

    生命週期監聽: HttpSessionListener

       方法: void sessionCreated(HttpSessionEvent e)

              void sessionDestoryed(HttpSessionEvent e)

    屬性監聽:

       SessionAttributeListener它的三個方法基本同上

ServletRequest

    生命週期 ServletRequestListener 兩個方法同上

       void requestInitialized(ServletRequestEvent e) 建立request時

       void requestDestroyed(ServletRequestEvent e)

    屬性監聽:

       void attributeAdded(ServletRequestAttributeEvent e) …

javaWeb中完成編寫監聽器:

    寫一個監聽類 要求必須實現摸個監聽器接口

    註冊 在web.xml中配置完成註冊

感知監聽(都與HttpSession相關)

    用來添加到javaBean中 不是添加到三大域

    這兩個監聽器都不須要在web.xml 中註冊

 要在JavaBean中添加監聽 須要添加接口 HttpSessionBuindingListener

     

Session在服務器中止時 會自動生成序列化文件保存到硬盤 再次開啓服務器時 會再生Session沒必要擔憂因爲服務器中止 而形成session丟失

 

Session的鈍化 活化:

    當session長時間不使用 會將session存放到硬盤上

    須要session的時候會從硬盤上抓取 稱爲session的鈍化 活化

 

國際化

    根據不一樣的地圖 改變語言

  須要把字符串都寫成變量

 經過配置文件 加載字符串

 

 

 

 

JavaWeb三大組件:servlet listener filter (都須要在web.xml中配置 感知監聽器不用配置 直接放在javabean中)

 

 過濾器:

    會在一組資源的前面執行

      可讓求情達到目標資源 也能夠不讓請求達到資源

     *** 過濾器有攔截請求的能力

     

過濾器如何編寫:

    寫一個類實現Filter接口

    在web。xml中配置

Filter接口:

    void init(FilterConfig) 建立以後 立刻執行 Filter會在服務區啓動時建立

    void destroy() 在銷燬前執行 服務器結束前執行

    void doFilter(ServletRequest,ServletResponse,FilterChain) 每次過濾時都會執行

Filter 是單例的 如同servlet

 

 

 

FilterConfig ServletConfig類似:

    均可以獲取初始化參數 getInitParameter()

    獲取過濾器的名稱:getFilterName

    獲取application: getServletContext()

 

 FilterChain :

    方法 doFilter(ServletRequest ,ServletResponse)放行

       FilterChain.daFilter(…)在doFilter方法中放行 中止攔截

 

 

/*application不是JAVA上的...是JSP中的...

它和page request session application都是JSP中的內置對象...

在後臺用ServletContext存儲的屬性數據能夠用application對象得到..

並且application的做用域是整個Tomcat啓動的過程...

例如: ServletContext.setAttribute("username",username);

則在JSP網頁中能夠使用 application.getAttribute("username");

來獲得這個用戶名....*/

 

多過濾器:

    FilterChain#doFilter()方法:

       執行目標資源 或是執行下一個過濾器 若是沒有下一個過濾器那麼執行的是目標資源 若是有 那麼執行下一個過濾器

 

過濾器的四種攔截方式:

1,           攔截請求

2,           攔截轉發

3,           攔截包含

4,           攔截錯誤

過濾器的四種攔截方法:

    <dispatcher>FORWARD</dispatcher>

    <dispatcher>REQUEST</dispatcher>

    <dispatcher>INCLUDE</dispatcher>

<dispatcher>ERROR</dispatcher>

Filter的執行順序: 根據web.xml 的寫入順序

 

Filter的應用場景:

    執行目標資源以前作預處理工做 例如設置密碼 這種一般都會放行 只是在目標資源執行以前作一些準備工做

    經過條件判斷是否放行 例如校驗用戶是否登陸 或者此IP是否被禁用

    在目標資源執行後 作一些後續的特殊處理工做 例如把目標資源輸出的數據進行處理

 

thread.Join把指定的線程加入到當前線程,能夠將兩個交替執行的線程合併爲順序執行的線程。好比在線程B中調用了線程A的Join()方法,直到線程A執行完畢後,纔會繼續執行線程B(相似於插隊。。)

 

泛型的擦除

Java泛型是JDK 5引入的一個特性,它容許咱們定義類和接口的時候使用參數類型,泛型在集合框架中被普遍使用。類型擦除是泛型中最讓人困惑的部分,本篇文章將闡明什麼是類型擦除,以及如何使用它。

一個常見錯誤

 

package simplejava;
 
import java.util.ArrayList;
 
public class Q29 {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("a");
        al.add("b");
        accept(al);
    }
 
    public static void accept(ArrayList<Object> al) {
        for (Object o : al)
            System.out.println(o);
    }
 
}

 

以上代碼看起來是沒問題的,由於String是Object的子類。然而,這並不會工做,編譯不會經過,並提示以下錯誤:
The method accept(ArrayList<Object>) in the type Q29 is not applicable for the arguments (ArrayList<String>)

List<Object>和List<String>

緣由在於類型擦除。記住:Java的泛型機制是在編譯級別實現的。編譯器生成的字節碼在運行期間並不包含泛型的類型信息。

在編譯以後,List<Object>和List<String>將變成List,Object和String類型信息對於JVM來講是不可見的。在編譯階段,編譯器發現它們不一致,所以給出了一個編譯錯誤。

 

分IP統計網站訪問次數

   

頁面靜態化:不會輕易發生變化)

    首次訪問去數據庫獲取數據 而後保存到html中

    第二次訪問不用再去數據庫獲取 直接能夠顯示

 性能好  

 

 

 

 

 

 

 

 

上傳:

    客戶端表單限制

    上傳對servlet有要求

     表單會發發生變化

       method=」post」 必須

       enctype=」multipart/form-data」叫作多部件 二進制上傳

       表單中使用添加文件單項 <input type=」file」 name=」XXX」/>

  上傳對Servlet的限制:

     request.getParametere() 這個方法做廢(永遠返回null)

      

  多部件表單:

    每隔出多個部件 即一個表單項一個部件

    一個部件中本身包含請求頭請求體 空行

       *普通表單項:

           1個頭 Content-Disposition 表單項名稱

       *文件表單項

           2個頭 Content-Disposition 表單項名稱

              content-Type: 文件類型 。。。

 

   這個小組件 幫助咱們解析上傳數據:

 上傳三步:

    相關類

       工廠:DiskFileItemFactory

       解析器:ServletFileUpload

       表單項:FileItem

    建立工廠:DiskFileItemFactory f = new DiskFileItemFactory();

    建立解析器:ServletFileUpload sfd = new ServletFileUpload(f);

    使用解析器來解析request 獲得FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request); 

   

FileItem:

     Boolean isFormField():是否爲普通表單 返回true爲普通表單 false爲文件表單

    String getFieldName():返回當先表單項的名字

    String getString(String charset):返回表單項的值

    String getName():返回上傳文件的名稱

    long getSize():返回上傳文件的字節數

    InputStream getInputStream():返回上傳文件對應的輸入流

    void write(File destFile):把上傳的文件內容保存到指定的文件中

文件上傳演示:

 

 

      

 

文件必定要上傳到web-inf 目錄下 (此爲安全目錄  )

  

文件打散:不能都放在一個文件夾下

   

上傳文件大小的限制:

    一個表單有多個文件表單

    單個文件大小爲:100kb

      

    上面的方法調用必須在解析開始以前 在sfu.parseRequest()以前

 

 

 

 

 

 

下載:

    下載就是向客戶端相應字節數據

    把文件變成字節數組 使用response.getOutputStream()

  下載要求: 兩個頭 一個流

  Content-Type : 你傳遞給瀏覽器的文件的類型mime類型 例如 :image/pjpeg

  Content-Disposition : 它的默認值爲inline , 表示瀏覽器窗口打開

    流: 要下載的文件數據

attachment——附件

 

示例代碼:

 

 

關於文件名稱亂碼的解決:

response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("GBK"),"ISO8859_1")); 

    能夠上網下載對應的工具類jar包進行文件的字符轉化

 

郵件的概述:

    javaMail是api

郵件相關的協議:

    收郵件

 

郵件服務器的名稱:(smtp 發郵件協議 pop3收郵件協議

    smtp服務器的端口號25 服務器的名稱 smtp.xxx.com

    pop3服務器端口號110 服務器的名稱 pop3.xxx.com

 

JavaMail:

    導入jar

       mail.jar

       activation

    核心類

session 若是你獲得了它 表示已經鏈接上服務器 與Connection類似

MimeMessage 表示一個郵件對象 能夠用他調用setFrom() 設置發件人 收件人

TransPort 只有一個功能 ——發郵件

  獲得Session:

    使用session的靜態方法getInstance(Properties,Authenticator)

      必定須要傳入參數

 

AJAX:阿賈克斯(異步的js xml)

    asynchronous javascript and xml

 同步:發一個請求以後 等到恢復 在發送第二個請求

 異步:發一個請求以後 沒必要等待 直接能夠發送下一個請求

    能夠使用js接受服務器的響應 使用js局部刷新

服務器給了護短響應通常是整個頁面 一個html 在ajax中由於時局部刷新 服務器就不用相應整個頁面 而只是數據 大多數使用json

 

ajax的常見場景:(加強用戶體驗

    百度搜索 擴充常見內容

 ajax優勢:

    異步交互:加強用戶體驗

    性能:由於服務器無需再相應整個頁面 只須要響應部份內容 壓力減輕了

缺點:

    ajax不能應用在全部場景

    ajax無故的增多了服務器的相應次數

ajax發送異步請求:

    第一步

       ajax其實只須要學習一個對象 XMLHttpRequest 掌握了它 就掌握了ajax!

       獲得XMLHttpRequest

         大多數瀏覽 都支持var XMLHttp = new XMLHttpRequest();

       指定ie6.0獲得XMLHttpRequest : var xmlHttp = new ActiveXObject(「Msxml2.XMLHTTP」);

 

    第二部

       xmlHttp.open() 打開服務器的連接 須要三個參數

         請求方式 get , post

         請求的url 指定服務器資源

         請求是否異步 true表示異步請求

       xmlHttp.open(「GET」,」/XXServlet」,true);

    第三部

       xmlHttp.send() 若是參數填null可能會形成瀏覽器沒法發送

        參數: 具體請求體內容

第四部

   獲得異步響應

   在xmlHttp對象的一個事件上註冊監聽器

       onreadystatechange

       xmlHttp一共有5個狀態:

       0 初始化未完成 剛建立未調用open方法

       1 請求開始 調用了open 沒有調用send

       2 調用完了send

       3 服務器開始響應 但不表示響應結束

       4 服務器響應結束!

   只關心最後的4 狀態

      獲得xmlHttp的狀態 : var state = xmlHttp.readyState;返回01234

      獲得服務器的響應狀態碼:

           var status = xmlHttp.status; 返回200 404 500 302 304

       獲得服務器響應內容

           var content  = xmlHttp.responseText;獲得服務器的響應的文本格式的內容

           var content = xmlHttp.respnseXML;獲得服務器的響應的xml響應內容 是Document對象

 

get請求沒有請求體 但必定要傳入null

/*** 我在使用 window.onload 方法老是沒法運行 因此直接

    <body onload=XXX();>這樣進行解決 在javascript裏構造 function XXX(){…} ***/

 

響應內容爲xml:

    var doc = xmlHttp.responseXML; 獲得的是Document對象

 

省事聯動案例:

 

XStream:
    做用:能夠把JavaBean轉化爲xml

XStream的jar:

    核心jar: xstream-1.4.7.jar

    必須依賴jar: xpp3_min-1.1.4c(這是一個速度很快的xml解析器)

  使用步驟:

    XStream xstream = new XStream();

    String xmlStr = xstream.toXML(這裏是javabean);

在大多數時間 都須要轉化別名:

    默認List元素 但願List對應本身想要的名稱

 xstream.alias(「別名」,City.class) 這樣指定別名

   alias——別名的意思

把標籤的 Name轉化爲屬性名

  <ctiy>

    <name>BEIJIN</name>

</city>

  轉化爲:

<city name=」BEJIN」></city>

    xstream.useAttributeFor(XXX.class這是須要轉化到的標籤 ,」name」這是要將子標籤轉化爲屬性的子標籤)

  四步發生異步請求

  去除不想要的javabean屬性

    xstream.omitField(City.class,」這裏是想要才刪除的屬性名臣個「);

總結: (其實我不明白xstream的意義 。。。)

    使用別名: .alias(「別名」,List.class)讓List生成的元素名爲 XX

    讓類的成員變成元素的屬性: .useAttributeFor(XXX.class ,「name」);把XXX類的名爲name的成員轉化爲屬性名 包含在XXX的屬性裏面

    去除無用的集合屬性(去除集合類型的成員):

       去除Collection類型的名稱

       xmlstream.addImplicitCollection(XXX.class,」cities」);

        會使XXX類中名爲cities的Collectin類型的標籤不會生成

    去除一些不想要的累的指定成員 讓其不生成xml元素:

       xstream.omitField(City.class,」EnglishName」);

       再生成的xml中不會出現EnglishName的對應元素

 

JSON

    由js提供的數據交換格式

  json的語法:

    {}是對象

    屬性名必須使用雙引號括起來 單引號不行!!!!!

      屬性值:

       null

       數值  

       字符串

       數組 使用[]括起來

       Boolean true和false

 若想:ab」c  須要轉義 「ab/」c」

    在servlet之間進行數據傳遞 須要使用到轉義 (傳遞字符串

XML的可讀性較好

JSON的解析能力好

JSON更加受歡迎

 

JSON-LIB 工具:必定須要導入jar包

    能夠把JavaBean轉化爲JSON

核心類:

  JSONObject 是一個map類型

JSONObject map = new JSONObject();

    map.put(「name」,「lxa」);

    map.put(這裏也能夠是一個JavaBean)

    String s = map.toString();

    SYSO(s);  會打印出來JSON字符串

  JSONArray  是一個list類型

      

生成ajax的小工具

    function ajax(method ,url , asyn , params)

     若是是POST方法 須要添加setRequestHeader

asyn——異步

 

網上書城項目:

  搭建架構:導入原型

    用戶模塊  分類模塊 購物車模塊 圖書模塊 訂單模塊

  功能分析:

    前臺(用戶模塊 – 註冊,激活,登錄,退出(session銷燬)

    分類

    圖書(查詢全部 分類查詢 精準查詢

    購物車(添加條目 刪除條目 刪除全部條目

    訂單(生成訂單 過往訂單(在過往訂單中按id查詢訂單) 付款 確認收貨 付款功能

** 後臺:

    管理員登錄(通常不須要註冊 都寫在數據庫裏

    查看圖書 按id查詢 上傳新的圖書(要添加圖片 並校驗大小) 刪除 更改

    訂單 查詢訂單 按狀態查詢 發貨

 

框架的搭建:

    導入包 建立package 建立數據表

用戶模塊:

    建立相關模塊

    用戶註冊

    用戶激活

    用戶登錄

    用戶退出

分類模塊

    分類模塊的相關建立

   

   

JQuery

 

元素選擇器 返回一個jquery對象 不是Dom的Element對象 可是jquery對象包含多個dom對象

$(「[name=lxa]」)查找屬性爲name且值爲lxa的元素

$(「:option[name=lxa]」).attr(「id」);獲取這個元素的id的值

 

 

JQuery對於ajax的操做:

$(function(){

    $(「#xxx」id選擇器).blur(function(){

       var value = $(「.xxx」class選擇器).val();選擇值

        $.ajax({表示進行ajax

        url:」/XXServlet」要請求的servlet

       data:{val:value}這時傳遞的對象 在servlet中使用getrParamter獲取

       async:true;表示 是否爲異步請求

       cache:false,表示 是否緩存 通常不緩存

       type:」POST」請求方式(大寫)

       dataType:」json/xml/text」返回值的類型

       success:function(result){表示請求成功以後執行的方法

           alert(「XXX」);

           };

)

)

};)

基礎增強:

   

泛型:

    具備一個或多個類型的變量的類 稱之爲泛型

    class A<T> 在建立泛型時 須要爲其類型變量賦值

    A<String> a = new A<String>();  若是建立類型實例時 不給賦值泛型 那麼會報錯

  泛型方法: 具備一個或多個泛型的方法

   

class A<T>{public T fun(T a)}

    這個方法不是泛型方法 是泛型類裏的一個方法

 

public <T> T fun(T t)  ---》 這個是泛型方法

    泛型方法不必定在泛型類之中

 

泛型在類中 方法中的使用:

    泛型能夠在成員類型上使用

    class A<T>

    泛型能夠在返回值 參數 能夠在方法上使用

    public T a1(T t) 

泛型能夠在局部變量的引用類型上使用

    public void fun(){

    T t = …

泛型的繼承和實現

    class A<T>

    class AA extends A<String>() 如果繼承了泛型類 子類不是泛型類

 

通配符:

    List<? extends Object> list= new ArrayList<String>();

    只能出如今左邊 不能出如今new時

  通配符的含義:?表示一個不肯定的類型

    它的值會在調用時肯定下來

    List<? extends Number>

       傳遞的泛型只能是Number或其子類

 

  通配符的優勢:

    能夠使泛型更加通用 尤爲是調用形參的通配符

       public void fun(List<?> list) 避免了許多問題

       

public void fun(List<? super Integer>)

    能傳遞Integer和Integer的父類型

     

 

 

註解:(替代xml進行數據的儲存)

    給框架看的語言:

   

全部註解都是Annotation的子類!

   

 

 

註解的做用目標以及保存策略

    讓一個註解 做用目標只能在類上 這就叫作目標的限定

在定義註解時 給註解添加註解@Target

@Target(value={ELementType.METHOD,MlementType.TYPE}) 這裏面存放枚舉類型

@interface MYAnno1{}  用Target來限定MYAnnol

 

保留策略:

 源代碼文件 SOURCE 註解只存在在源代碼中 編譯時被忽略

 字節碼文件 CLASS註解在源代碼中存在 而後編譯時會把註解信息放到CLAss文件 可是JVM加載時 會忽略註解!

 JVM碼 RUNTIME 註解在源代碼 字節碼文件中存在 並在JVM加載類是 會把註解加載到JVM內存中

    ¥ 限定註釋的保留策略

    @Retention(RetentionPolicy.RUNTIME)

    @interface XXX{} 在註解的上一行進行定義

 

 

 

 

servlet異步:定義

 

servlet上傳:

   

   如上 獲取表單中name爲resume的對象 Part 類型 part.write(「目標路徑」) 進行寫入

 

 

動態代理 :

    最終目的是學習AOP

OOP是面向對象變成

       AOP 面向切面編程

   

類加載器:ClassLoader

    類加載器的分類:

    引導 負責加載類庫

    擴展 負責加載擴展jar包

    系統 負載加載應用下的class (一般就是本身寫的class)

 存在各層級的委託機制:

    倘若代碼出現 new c();

       系統會請求上一層級的擴展

       擴展會繼續向上請求引導

    隨後引導在類庫尋找對應的類 若是沒有向下傳遞null

    擴展在擴展的jar包 下尋找對應的c 若沒有

    在系統中尋找 尚未的話 報錯

       這樣作的效果就是 安全

  #每個線程都有本身的類加載器

    自定義類加載器:能夠對本身的class進行加密

 

Tomcat 的類加載器:

    提供兩個類加載器

      服務器加載器:  tomcat下的專門加載lib下的類

      應用加載器:  還有一個專門加載 /WEB-INF/classes 應用加載器

   

    引導—擴展—系統—服務器加載器—應用加載器

       服務器 應用加載器 :先本身加載 若找不對對應的class 在尋求其餘加載器

相關文章
相關標籤/搜索