日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb随手笔记

發布時間:2024/3/13 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb随手笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HTML


規范:

①<html> ————html標簽,整個頁面的開始

? ②<head> ————頭標簽(title標題,css樣式,js代碼)

? <title>標題</title> ————標題

? ②</head>

? ③<body> ————內容標簽

? 主體內容

? ③</body>

①</html> ————整個頁面的結束

  • <html lang="zh_CN">:表示頁面顯示中文
  • ②內:<meta charset="UTF-8">:當前頁面的字符編碼格式

標簽特性

  • 標簽大小寫不敏感

  • 標簽擁有兩種屬性

    ①基本屬性:如bgcolor="name":設置頁面顏色

    ②事件屬性:如onclick="alect('內容')":單擊顯示alect警告框函數內的信息

  • 標簽兩種分類

    ①單標簽:如<br/>:換行、<hr/>:水平線

    ②雙標簽:如<button>文本</button>:按鈕、<b>文本</b>:加粗

  • 標簽語法

  • 標簽之間不能交叉嵌套
  • 標簽必須正確關閉
  • 標簽屬性必須有值,值用" "括起來
  • 注釋不能嵌套
  • 常用標簽


    字體標簽


    <font>文本</font>

    • 屬性:

      color:顏色

      face:字體

      size:大小

    • 大小范圍為1~7,超出的話以7顯示

    特殊字符


    • <:&lt;

    • >:&gt;

    • (空格):&nbsp;

    標題


    <h1>文本</h1>

    • 屬性:

      align:標題的對其方式

      • left:左對齊,默認
      • right:右對齊
      • center:居中
    • h1表示標題大小為1(最大),其范圍為1~6,超出的話以文本顯示

    超鏈接


    <a>文本</a>

    • 屬性:

      href:表示鏈接的地址(http://localhost:8080/工程名/可省略)

      target:打開鏈接的方式

      • _self:當前頁面打開,默認
      • _blank:新頁面打開
      • name:根據窗口的名字,用窗口打開

    列表標簽


    <ul>

    ? <li>文本1</li>

    ? <li>文本2</li>

    </ul>

    • 屬性:

      type:修改列表項前面的符號

      • none:無符號
    • ul是無序列表,ol是有序列表,li是列表項

    圖片


    <img/>

    • 屬性:

      src:圖片的路徑

      • 相對路徑:相對路徑是根據當前頁面地址欄中的地址來跳轉的

        .:當前文件所在目錄

        ..:當前文件的上一級目錄

        文件名:當前文件所在目錄下的文件,相當于./

      • 絕對路徑:

        http://ip:port/文件目錄/文件名

      width:圖片的寬度

      height:圖片的高度

      border:圖片的邊框大小

      alt:找不到圖片的文本提示

    表格


    <table>

    ? <tr>

    ? <td>文本</td>

    ? </tr>

    </table>

    • 屬性:

      ①table屬性

      ? align:表格相對于頁面的對其方式

      ? border:表格的邊框

      ? width:表格的寬度

      ? height:表格的高度

      ? cellspacing:單元格與單元格間的間距

      ②td屬性

      ? align:內容相當于單元格的對其方式

      ? clospan:跨列數

      ? rowspan:跨行數

    • th相當于<td align="center"><b>文本</b></td>,即文本加粗且居中

    • tr是行,td是單元格

    窗口


    <iframe></iframe>

    • 屬性:

      src:圖片路徑

      width:窗口寬度

      height:窗口高度

      name:窗口名稱

    表單


    <form>

    ? <input/>

    ? <select>

    ? <option>文本</option>

    ? </select>

    ? <textarea>默認值</textarea>

    </form>

    • 屬性:

      ①form屬性

      ? action:表單數據提交的地址

      ? method:表單數據提交的方式

      • get(默認):

      • 地址格式:action屬性值+?+請求參數
      • 請求參數格式:name=value&…
      • 不安全,有數據長度限制

        表單提交的form連接中,get不能帶參數,只能使用隱藏域

      • post:

      • 地址格式:action屬性值
      • 較安全,無長度限制

      ? enctype:POST請求時,請求體的編碼方式

      • application/x-www-form-urlencoded(默認):
      • 表示用&分隔參數,用=分隔鍵值對,字符要用URL編碼方式進行編碼
      • multipart/form-data
      • 文件上傳必須使用的編碼方式

      ②input屬性

      ? type:類型

      ? value:初始值、修改值、提交數據

      ? name:分類、提交數據

      ? checked="checked":默認值

      • text:文本輸入框,可用value設置初始內容
      • password:密碼輸入框,可用value設置初始內容
      • radio:單選框,可用name將多個單選框分為一類,可用checked選定某一組分類下的單選框為默認值,提交數據時需要額外用value來傳值
      • checkbox:復選框,可用checked選定一個或多個復選框為默認值,被選中的復選框的值為true,提交數據時需要額外用value來傳值
      • reset:重置按鈕,可用value修改按鈕名稱
      • submit:提交按鈕,可用value修改按鈕名稱
      • button:按鈕,可用value修改按鈕名稱
      • file:文件上傳
      • hidden:隱藏域

      ③select屬性

      ? name:用于提交數據

      ? multiple="multiple":可多選

      ④option屬性

      ? selected="selected":設置下拉列表框的某個選項為默認值

      ? value:用于提交數據

      ⑤textarea屬性

      ? rows:多行文本輸入框的行數

      ? cols:多行文本輸入框每行顯示的字符數量

      ? name:用于提交數據

    • form是向服務器提交數據,input type設置各種表單類型,select設置下拉框,textarea設置多行文本輸入框

    • 表單提交時,數據發送給服務器的三個要求:

    • 表單內需要提交的數據,要擁有name屬性
    • 單選框、復選框、下拉框中的option屬性,需要額外添加value屬性
    • 表單要在form內

    其他


    <div>文本</div>:文本獨占一行

    <span>文本</span>:所占長度與文本長度相等

    <p>文本</p>:在上方或下方空出一行,空行則不操作

    <button>文本</button>:設置一個按鈕,在表單提交中在不指明其屬性type的值時,默認為submit

    • onclick="函數":可用此來綁定單擊事件

    CSS


    標簽名選擇器


    選擇器調用的方式:

    1)在標簽內使用style屬性:

    <標簽名 style="樣式1;樣式2...">文本</標簽名>

    • 只對該標簽有用

    2)在<head>中使用style type="text/css":

    <style type="text/css">

    ? 選擇器{

    ? 樣式1;樣式2...

    }</style>

    • 對當前頁面有效

    3)引用.css文件:

    <link type="text/css" rel="stylesheet" href="文件名.css"/>

    • 只對調用了該文件的頁面有效
    • 修改的樣式由文件內容中的選擇器定義樣式決定

    標簽選擇器


    <style type="text/css">

    ? 標簽名{

    }</style>

    • 對當前頁面所有的標簽有效

    id選擇器


    <style type="text/css">

    ? #idxxx{

    }</style>

    • xxx為id編號
    • 調用的標簽通過id="idxxx"即可調用該樣式

    class選擇器


    <style type="text/css">

    ? .classxxx{

    }</style>

    • xxx是class編號
    • 調用的標簽通過class="classxxx"即可調用

    組合選擇器


    <style type="text/css">

    ? 選擇器1,選擇器2,...{

    }</style>

    • 標簽可以通過任意一個選擇器調用該代碼

    常用樣式


    • 各樣式間用,隔開,樣式有多個值的用 (空格)隔開

    color:設置字體顏色

    border:設置邊框像素、顏色、線條(solid)

    border-collapse:collapse:表格邊框合并

    width:設置邊框寬度(px)

    height:設置邊框高度(px)

    background-color:設置背景顏色

    font-size:設置字體大小(px)

    margin-left:auto、margin-right:auto:設置整體頁面居中

    text-align:設置字體位置

    text-decoration:去超鏈接下劃線(none)

    list-style:設置列表符號為空(none)

    display:設置顯示(none)

    left:x軸

    top:y軸

    樣式操作


    addClass():添加樣式

    removeClass():刪除樣式,且會刪除對應的class屬性值

    toggleClass():有就刪除,沒有就添加樣式

    offset():獲取或設置元素坐標

    JavaScript


    1)

    <script type="text/javascript">

    ? 內容;

    </script>

    2)調用文件

    <script type="text/javascript" src="文件名.js"></script>

    • 兩種方法不能在同一個定義中同時調用

    語法


    變量

    1)類型:

    ? ①數值類型:number

    ? ②字符串類型:string

    ? ③對象類型:object

    ? ④布爾類型:boolean

    ? ⑤函數類型:function

    2)值:

    ? ①undefined:未定義,所有未賦初始值的變量,默認都是undefined

    ? ②null:空值

    ? ③NAN:非數字,非數值(有undefined參與運算的值為NAN)

    3)定義變量格式:

    ? ①var 變量名

    ? ②var 變量名=值

    運算符

    1)關系運算:

    ? ①==:比較兩者的字面值

    ? ②===:比較兩者的字面值以及兩者的數據類型

    2)邏輯運算:

    • 0、null、undefined、""(空串)為false,其他都為true
    • &&與||都有短路效果

    ? ①&&且:

  • 當表達式全為真時,返回最后一個表達式的值
  • 當表達式中有一個為假時,后面的表達式不再執行,返回為假的表達式的值
  • ? ②||或:

  • 當表達式全為假時,返回最后一個表達式的值
  • 當表達式中有一個為真時,后面的表達式不再執行,返回為真的表達式的值
  • 數組

    ? ①var 變量名=[]:空數組

    ? ②var 變量名=[值1,值2,...]:定義時賦值

    • 通過數組下標給數組元素賦值時,最大的下標就是數組的長度(下標從0開始),數組的長度與讀取時的最大下標無關,超出時為undefined
    • 未被賦值的數組元素值為undefined
    函數

    • 函數不允許重載
    • 當調用的函數與聲明的函數參數列表不一致時,會調用隱形函數,參數列表為arguments的數組,數組長度與最大賦值下標有關

    1)

    ? ①無參:

    ? function 函數名(){ 函數體 }

    ? ②有參:

    ? function 函數名(num1,num2,...){ 函數體 }

    ? ③有返回值:

    ? function 函數名(){ return 返回值 }

    2)

    ? ①無參:

    ? var 函數名=function(){ 函數體 }

    ? ②有參:

    ? var 函數名=function(num1,num2,...){ 函數體 }

    ? ③有返回值:

    ? var 函數名=function(){ return 返回值 }

    對象

    1)

    ? ①定義:

    ? var 變量名=new Object():空對象(對象實例)

    ? 變量名.屬性名=值:定義屬性

    ? 變量名.函數名=function(){}:定義函數

    ? ②調用:

    ? 變量名.屬性名、變量名.函數名()

    2)

    ? ①定義:

    ? var 變量名={

    ? 屬性名:值,

    ? 函數名:function(){}

    ? }

    ? ②調用:

    ? 變量名.屬性名、變量名.函數名()

    事件

    靜態綁定:在作用的標簽內作為屬性出現

    動態綁定:

    ? ①window.onload=function(){

    ? ②var 對象名=document.getElementById("id屬性值");

    ? ③對象名.事件名=function(){}

    ? }

    ? ①保證代碼在頁面加載完成后才會執行

    ? ②通過id屬性獲取標簽的對象,document為當前這個頁面信息的對象

    ? ③通過標簽的對象名.事件名=function(){}注冊事件

    1)onload:加載完成事件,瀏覽器解析完頁面后就會自動觸發的事件

    2)onclick:單擊事件,常用于按鈕點擊后做出響應

    3)onblur:失去焦點事件,常用于輸入框失去焦點后進行校驗

    4)onchange:內容發生改變事件,常用于下拉列表或輸入框發生改變時

    5)onsubmit:表單提交事件,常用于提交表單前驗證其合法性

    • 當返回return false時,則取消提交
    • return 方法名()
    正則表達式

    正則表達式兩種創建方式:

    ①var 變量名=new RegExp("規則")

    ②var 變量名=/規則/

    /x/:字符串中是否包含字符x

    /[xyz]/:字符串中是否包含字符x或字符y或字符z

    /[a-z]/:字符串中是否包含任意小寫字母

    /[A-Z]/:字符串中是否包含任意大寫字母

    /[0-9]/:字符串中是否包含任意數字

    /\w/:字符串中是否包含任意字母、數字或下劃線

    /x+/:字符串中是否包含至少1個字符x

    /x*/:字符串中是否包含0個或多個字符x

    /x?/:字符串中是否包含0個或1個字符x

    /x{m}/:字符串中是否包含連續m個字符x

    /x{m,n}/:字符串中是否包含至少m個、至多n個的連續的字符x

    /x{m,}/:字符串中是否包含至少m個連續的字符x

    /x$/:字符串是否以字符x結尾

    /^x/:字符串是否以字符x開頭

    DOM


    獲取節點的方式

    document.getElementById("id屬性值"):返回當前頁面中指定id的標簽的對象

    document.getElementsByName("name屬性值"):返回當前頁面中所有指定name的標簽的對象集合,該集合操作方式與數組相似

    document.getElementsByTagName("標簽名"):返回當前頁面中所有指定的標簽的對象集合,該集合操作方式與數組相似

    document.createElement("標簽名"):根據標簽名創建了一個節點,并返回標簽名節點的對象

    document.createTextNode("文本"):根據文本創建并返回一個文本節點對象

    document.body:獲取body節點對象

    • window.onload=function(){}該代碼在頁面加載完成時才執行
    方法

    getElementsByTagName("標簽名"):獲取當前節點的指定標簽的子節點

    appendChild(子節點名):為當前節點添加一個子節點

    attr:獲取對象的屬性值

    1)增刪改

    ①內部增:

    ? x.appendTo(y):將x元素添加成為所有y的子元素中的最后一個元素

    ? x.prependTo(y):將x元素添加稱為所有y的子元素中的第一個元素

    ②外部增:

    ? x.insertAfter(y):將x元素添加到所有y元素的后面

    ? x.insertBefore(y):將x元素添加到所有y元素的前面

    ③替換:

    ? x.replaceWith(y):用y將所有的x替換掉

    ? x.replaceAll(y):用x將所有的y替換掉,兩者都要存在

    ④刪除:

    ? a.remove():刪除a標簽

    ? a.empty():清空a標簽的內容

    屬性

    childNodes:獲取當前節點的所有子節點

    firstChild:獲取當前節點的第一個子節點

    lastChild:獲取當前節點的最后一個子節點

    parentNode:獲取當前節點的父節點

    nextSibling:獲取當前節點的下一個節點

    previousSibling:獲取當前節點的上一個節點

    className:獲取或設置當前節點的標簽的class屬性值

    innerHTML:查看或修改當前節點的標簽的起始標簽和結束標簽間的內容

    innerText:查看或修改當前節點的標簽的起始標簽和結束標簽間的文本內容

    defaultValue:默認的value值

    其他對象

    location:地址欄對象(常用來調用Servlet程序)

    • href:可獲取瀏覽器地址欄中的地址,該屬性可讀可寫

    jQuery


    • 使用前必須導入js文件
    • 或者直接調用官方鏈接:https://code.jquery.com/jquery-1.7.2.js

    $( )


    1)傳入參數為函數時,會在頁面加載完成之后才執行函數

    2)傳入參數為標簽字符串時,會自動創建返回一個該標簽的jQuery對象

    • 每個標簽間要用""隔開表示,并用+連接為一個完整的標簽

    3)傳入參數為選擇器字符串時,查詢并返回選擇器屬性值所對應的標簽的對象或對象集合

    4)傳入為dom對象時,會將dom對象轉換為jQuery對象并返回

    • 若要取出jQuery數組中的dom對象,只需要通過根據對應的下標即可取出

    選擇器


    基本選擇器

    $("#id屬性值"):查詢指定id屬性值的標簽

    $(".class屬性值"):查詢指定class屬性值的標簽

    $("標簽名"):查詢指定標簽名的標簽

    $("*"):查詢所有的標簽

    $("選擇器1,選擇器2"):獲查詢含有選擇器1或選擇器2的標簽

    層級選擇器

    $("x y"):查詢父標簽x內的所有的后代標簽y

    $("x>y"):查詢父標簽x內的所有的子代標簽y

    $("m+n"):查詢m標簽后面的一個n標簽

    $("m~n"):查詢與m標簽同級的所有n標簽

    基本過濾選擇器

    :first:查詢第一個標簽

    :last:查詢最后一個標簽

    :not(標簽名):查詢非該標簽的標簽

    :even:查詢索引為偶數的標簽,索引從0開始

    :odd:查詢索引為奇數的標簽,索引從0開始

    :eq(索引):查詢指定索引的標簽

    :gt(索引):查詢大于該索引的標簽

    :lt(索引):查詢小于該索引的標簽

    :header:查詢標題標簽

    :animated:查詢正在執行動畫的標簽

    內容過濾選擇器

    :contains("文本"):查詢包含指定文本的標簽

    :empty:查詢不包含子元素或文本的空標簽

    :parent:查詢包含子元素或文本的標簽

    :has(標簽x):查詢含有標簽x的標簽

    屬性過濾選擇器

    [屬性名]:查詢包含指定屬性的標簽

    [屬性名=值]:查詢包含指定屬性名和屬性值的標簽

    [屬性名!=值]:查詢不含指定屬性或指定屬性的值不等于特定的值的標簽

    [屬性值^=值]:查詢包含指定屬性的以指定屬性值開頭的標簽

    [屬性值$=值]:查詢包含指定屬性的以指定屬性值結尾的標簽

    [屬性值*=值]:查詢包含指定屬性的包含指定屬性值的標簽

    [...][...]...:同時滿足多個過濾器的標簽

    表單過濾選擇器

    :text:查找所有的文本輸入框

    :password:查找所有的密碼輸入框

    :radio:查找所有的單選框

    :checkbox:查找所有的復選框

    :submit:查找所有的提交按鈕

    :reset:查詢所有的重置按鈕

    :button:查詢所有的按鈕

    :hidden:查找所有的隱藏元素(type為hidden或display為none)

    表單屬性過濾選擇器

    :enabled:查詢可選的元素

    :disabled:查詢不可選的元素

    :checked:查詢選中的元素(單選框、多選框等,不包含下拉框)

    :selected:查詢option中選中的元素

    方法


    • 在function(){}函數中,有一個this對象,該this對象是正在響應的事件的dom對象

    eq(索引):獲取指定索引的元素

    first():獲取第一個元素

    last():獲取最后一個元素

    filter(值):獲取與值匹配的元素

    is(值):只有要一個值與其匹配,返回true

    has(值):獲取含有該值的元素

    not(值):獲取非該值的元素

    children(值):獲取指定值的子元素

    find(值):獲取指定值的后代元素

    next():獲取當前元素的下一個元素

    nextAll():獲取當前元素后的所有元素

    nextUntil(值):獲取從當前位置到指定值間的所有元素

    parent():獲取父元素

    prev():獲取當前元素的上一個元素

    prevAll():獲取當前元素前面所有的元素,按逆序存入數組

    prevUntil(值):獲取當前元素至指定值間的所有元素

    siblings():獲取當前元素前后的所有元素

    add(值):將指定值添加進當前元素中

    trim():去除首尾空格

    confirm():確認提示框函數,參數為提示內容,返回值為boolean類型。

    • 有兩個按鈕,“確定”按鈕返回值為true,“取消”按鈕返回false

    屬性操作


    html():設置和獲取起始標簽和結束標簽中的內容

    text():設置和獲取起始標簽和結束標簽中的文本內容

    val():設置和獲取表單項的value屬性值

    val(["值1","值2",...]):根據標簽的value可批量默認選擇單選框、多選框等

    attr("屬性名","值"):2個參數時,設置指定屬性的值,1個參數時,獲取屬性值

    • 對于checked、readOnly、selected、disabled,推薦使用prop()
    • 能自定義屬性和屬性值

    動畫操作


    • 參數1:動畫執行時長,以毫秒為單位
    • 參數2:擁有回調函數(動畫執行完自動調用的函數)

    1)基本動畫:

    show():將隱藏的元素顯示

    hide():將可見的元素隱藏

    toggle():可見就隱藏,不可見就顯示

    2)淡入淡出動畫:

    fadeln():淡入

    fadeOut():淡出

    fadeToggle():淡入淡出間切換

    fadeTo(t,x):指定時長t內,修改透明度至x,0為透明,1為完全顯示

    事件


    • 在綁定事件的function(){}中,若使用參數event,此刻的event即為事件的對象,可由此獲取到事件的類型type、x坐標pageX、y坐標pageY

    click():單擊事件,可綁定事件,也可觸發事件

    mouseover():鼠標移入對象時觸發事件

    mouseout():鼠標移出對象時觸發事件

    mousemove:鼠標在對象內移動時觸發事件

    bind("事件1 事件2 ...",function(){}):可以給一個元素同時綁定多個事件

    unbind():效果與bind相反,解除事件的綁定,不傳參時解除所有綁定事件

    one():效果與bind類似,但所有事件只會響應一次

    live():效果與bind類似,但用live綁定的一個或多個事件,由同樣選擇器創建的新的元素,也會具有綁定效果

    change():內容發生修改時觸發事件

    blur():失去焦點時觸發事件

    XML


    元素(標簽):

  • 名稱可以包含字母、數字、其他字符,不能以數字、標點符號、xml開始,不能包含空格
  • 也分為單標簽和雙標簽
  • 標簽必須閉合,且大小寫敏感,不能交叉嵌套
  • 必須有根元素(不含父元素的元素)
  • 若有多個轉義字符,可以使用<![CDATA[文本]]>來轉義
  • 解析XML


  • 導入dom4j.jar
  • 創建一個SAXReader對象,調用其read("path")讀取xml文件,返回一個Document類對象
  • 調用Document對象的getRootElement()獲取Document對象的根元素
  • 通過根元素獲取標簽對象
    • element("子類標簽名"):通過標簽名查找指定的標簽,返回一個Element類的標簽對象
    • elements("子類標簽名"):通過標簽名查找指定的標簽,返回一個list<Element>類的標簽集合對象
  • 調用標簽對象的getText()可以獲取標簽標簽對象中的文本內容,返回一個String類型
  • 將獲取到的值封裝進對應的類中
  • elementText("標簽名"):獲取指定標簽名的文本內容,返回一個String類型

    attributeValue("屬性名"):獲取指定屬性名的屬性值,返回一個String類型

    asXML():將標簽對象轉換為標簽字符串

    思路:

    ①加載配置文件,獲取document對象

    ②獲取根元素

    ③獲取根元素下的每個標簽中的子標簽或屬性或文本

    TomCat


    1)啟動:

    ? ①:bin目錄下的startup.bat文件

    ? ②:命令行輸入cd bin文件目錄—>轉盤符—>輸入catalina run

    2)測試:http://localhost:8080、http://127.0.0.1:8080

    3)關閉:

    ? ①:直接關閉窗口

    ? ②:在窗口界面按ctrl+c

    ? ③:bin目錄下的shutdown.bat文件

    4)修改端口號:conf目錄下的server.xml配置文件中的Connector標簽,修改port屬性值(端口號范圍:1~65535),改完需重啟TomCat服務器

    • http協議默認端口號:80

    5)部署Web工程:

    ? ①將工程目錄拷貝進webapps目錄下即可

    • 訪問:http://ip地址:服務器端口號/工程名/訪問的文件名

    ? ②conf/Catalina/localhost目錄下,創建一個xml文件

    • 文件格式:<Context path="xml文件名" docBase="工程目錄" />
    • 訪問:http://ip地址:服務器端口號/xml文件名/訪問的文件名

    6)注意點:

  • http://ip地址:服務器端口號/:沒有工程名,默認訪問ROOT工程
  • http://ip地址:服務器端口號/工程名/:沒有資源名,默認訪問index.html頁面
  • Servlet


    Servlet程序實現


    方式一:

  • 編寫一個類實現Servlet接口,實現所有方法

  • 實現Service方法,用于處理請求,并響應數據

  • 配置web.xml文件

  • <servlet>:配置Servlet程序

    • <servlet-name>:為Servlet程序起別名(常為類名)
    • <servlet-class>:Servlet程序的全類名
    • (可選)<init-param>:初始化參數
      • <param-name>:初始化參數的名字
      • <param-value>:初始化參數的值
  • <servlet-mapping>:配置訪問Servlet程序的地址

    • <servlet-name>:明確配置的地址給指定的哪個Servlet程序使用

    • <url-pattern>:/自定義地址

      /解析時代表:http://ip地址:服務器端口號/工程名

      /自定義地址:即訪問到Servlet程序的地址

  • (可選)<context-param>:

    • <param-name>:key
    • <param-value>:value
  • 方式二:

  • 編寫一個類繼承HttpServlet類
  • 重寫HttpServlet類中的doGet()、doPost()
  • 配置web.xml文件
  • 生命周期:

    ①執行Servlet構造方法

    ②執行init方法進行初始化

    ③執行service方法

    ④執行destroy進行銷毀

    • ①②在創建Servlet程序時會調用,③是每次訪問網址時調用,④在停止web工程服務時調用

    Servlet中的類


    1)Selvice類:將service方法中ServletRequest類型的形參向下轉型為HttpServletRequest類型,調用其對象的getMethod(),可以獲取發送數據請求的為get還是post類型

    2)ServletConfig類:Selvlet程序的配置信息類,可獲取程序別名、初始化參數、ServletContext對象

    ? ①調用init方法中ServletConfig類型的形參的方法:

  • getServletName():獲取Servlet程序的別名servlet-name的值
  • getInitParameter("初始化參數的名字"):獲取初始化參數init-param的值
  • getServletContext():獲取ServletContext對象
  • ? ②繼承HttpServlet的類中重寫的doGet或doPost方法后:

  • 直接調用getServletConfig()可以直接獲取到一個新的ServletConfig類型的變量
    • 每個ServletConfig只對唯一的Servlet程序有效
    • 若該類重寫了init方法,需要顯示調用super.init(config),否則會報空指針異常
  • 3)ServletContext類:表示Selvlet上下文,是一個接口,一個工程中只會有一個ServletContext對象的實例,且該對象是一個域對象

    • 先調用getServletContext()獲取一個ServletContext類型的變量
  • getInitParameter("上下文參數的名字"):獲取上下文參數context-param的值
  • getContextPart():獲取當前工程的路徑(/工程名)
  • getRealPath(" "):獲取工程("/")或資源("/資源名")在硬盤上的絕對路徑
  • setAttribute("key","value"):設置域數據(同一個Servlet程序中獲取的數據相同)
  • getAttribute("key"):獲取對應域數據的值
  • removeAttribute():刪除數據
  • 4)HttpServletRequest類:Tomcat服務器將每次發送請求的Http協議信息封裝到此類的對象中并作為doGet和doPost方法中的參數供我們調用,可獲取所有的請求信息

  • getRequestURI():獲取請求的資源的路徑
  • getRequestURL():獲取請求的資源的絕對路徑
  • getRemoteHost():獲取客戶端的ip地址
  • getHeader("請求頭"):獲取請求頭相關信息
  • getParameter("name"):獲取請求參數(name=value&name=value)
  • getParameterValues("name"):獲取請求參數(有多個參數時使用)
  • getMethod():獲取請求的方式(GET或POST)
  • setAttribute("key","value"):設置域數據(同一個請求中獲取的數據相同)
  • getAttribute("key"):獲取對應域數據的值
  • getInputStream():獲取輸入流
  • getRequestDispatcher("/地址"):根據地址,獲取到一個RequestDispatcher類的對象,調用該對象的forward(HttpServletRequest,HttpServletResponse)可直接訪問該地址,從而實現請求的轉發(在瀏覽器中訪問了servlet程序的地址,而在servlet程序中訪問了其他資源的地址)
    • 地址要以/開頭,即訪問的是必須是http://ip:port/工程名/下的(webapp目錄下)的資源,地址欄地址不變
    • 請求的轉發 的地址 可以訪問到WEB-INF目錄下
  • setCharacterEncoding("字符編碼"):解決post請求中的亂碼問題(必須在獲取任意一個請求參數之前就使用,否則還會出現亂碼問題)
  • 5)HttpServletResponse類:同樣是Tomcat服務器創建的對象,表示的是發送請求后所有的響應信息,可以用來設置返回給客戶端的信息(流的方式)

    • 兩個流不能同時使用
  • 字節流:getOutputStream():常用于下載(傳遞二進制數據)
  • 字符流:getWriter():常用于回傳字符串
    • 調用getWriter()后返回PrintWriter類的對象,調用該對象的write("str")直接返回給客戶端指定字符串
    • 返回中文字符串時,可能出現中文亂碼,需要將服務器編碼集和瀏覽器編碼集設為一致(要在獲取流對象前設置)
  • getCharacterEncoding():獲取服務器的編碼集(默認ISO-8859-1)
  • setCharacterEncoding("字符編碼集"):設置服務器編碼集
  • setHeader("響應頭","響應頭參數"):設置響應頭
    • Content-Type,text/html;charset=UTF-8:設置瀏覽器編碼集為UTF-8
  • setContentType("text/html;charset=UTF-8"):設置服務器和客戶端(響應頭)的字符集為UTF-8
  • setStatus(響應碼):設置響應碼
  • setHeader("location","新地址的絕對路徑"):設置響應頭,與響應碼一起使用,重定向新的訪問地址,實際上會有兩次請求,地址欄地址發生變化,且兩次請求為兩個對象,不可訪問WEB–INF下的資源,可訪問外部連接
  • sendRedirect("新地址的絕對路徑"):直接設置重定向地址
    • 絕對路徑:/工程名/資源名
  • HTTP


    請求


    1)客戶端–>服務器:請求

    • 請求:GET、POST

    GET請求:

    form標簽中使用method=get、a標簽、link標簽引入css、Script標簽引入js文件、img標簽引入圖片、iframe標簽引入html頁面、瀏覽器輸入地址后回車

    ? ①請求行

  • 請求方式:GET
  • 請求資源路徑(+?+請求參數)
  • 請求的協議和版本號:HTTP/1.1
  • ? ②請求頭:key:value(不同的鍵值對表示不同含義)

  • Accept:告訴服務器客戶端能接收的數據類型
  • Accept-Language:告訴服務器客戶端能接收的語言類型
    • en-US(英語)、zh-CN(漢語)
  • User-Agent:瀏覽器的信息
  • Accept-Encoding:告訴服務器,客戶端能接收的數據編碼格式
  • Host:表示請求的主機ip和端口號
  • Connection:告訴服務器當前的連接如何處理
    • Keep-Alive:回傳數據后不要馬上關閉連接,維持一段時間
    • Closed:馬上斷開連接
  • POST請求:

    form標簽中使用method=post

    ? ①請求行:請求方式(POST)、請求的資源路徑、請求的協議和版本號

    ? ②請求頭

  • Accept、Accept-Language、User-Agent、Host
  • Referer:記錄發起請求時的地址
  • Content-Type:表示發送數據的類型
    • application/x-www-form-urlencoded:表示提交的數據格式是name=value&name=value,然后對其進行url編碼
    • multipart/form-data:表示以多段的形式提交數據給服務器(以流的形式提交,用于上傳)
  • Content-Length:表示發送的數據的長度
  • Cache-Control:表示如何控制緩存
    • no-cache:不緩存
  • (空格一行)

    ? ③請求體:發送給服務器的數據

    響應


    2)服務器–>客戶端:響應

    ? ①響應行

  • 響應的協議和版本號:HTTP/1.1
  • 響應狀態碼:
  • 200(請求成功)
  • 302(請求重定向)
  • 404(服務器收到請求但數據不存在或地址錯誤)
  • 500(服務器收到請求但服務器內部錯誤)
  • 響應狀態描述符:OK
  • ? ②響應頭

  • Server:表示服務器信息
  • Content-Type:響應體的數據類型
    • MIME:大類型/小類型
  • Content-Length:響應體的長度
  • Date:請求響應的時間(格林時間)
  • (空格一行)

    ? ③響應體:回傳給客戶端的數據

    JSP


    jsp頭部的page指令


    language:表示jsp翻譯后為什么語言的文件(目前只支持Java)

    contentType:表示返回的數據類型

    pageEncoding:表示當前jsp頁面的字符集

    import:導包、導類

    autoFlush:(out輸出流專用)設置輸出流緩沖區滿了之后是否自動刷新緩沖區(默認為true)

    buffer:(out輸出流專用)設置輸出流緩沖區的大小,默認為8kb

    errorPage:設置jsp頁面出錯時自動跳轉去的錯誤頁面路徑

    isErrorPage:設置當前jsp頁面是否為錯誤信息頁面(默認是false,true的話會生成異常類捕獲異常信息)

    session:設置訪問當前jsp頁面是否會創建HttpSession對象(默認是true)

    extends:設置jsp文件被Java翻譯出來后默認繼承的類

    腳本


    1)聲明腳本:

    <%! java代碼 %>

  • 可聲明屬性、方法、靜態代碼塊、內部類等
  • 2)表達式腳本:用于在頁面上輸出數據

    <% =表達式 %>

  • 可輸出基本數據類型、對象等
  • 所有表達式腳本會翻譯到_jspService()中
  • 表達式腳本會被翻譯為out.print()輸出到頁面上
  • 表達式腳本可以調用_jspService()中的對象(腳本被翻譯后存在于該方法中)
  • 3)代碼腳本:

    <% java代碼 %>

  • 可寫入條件語句、循環語句
  • 代碼腳本可以調用_jspService()中的對象(腳本被翻譯后存在于該方法中)
  • 可由多個代碼腳本共同組合成完整的代碼語句,還可嵌套表達式腳本
  • EL表達式


    使用

    • 用于替換表達式腳本,主要用于輸出jsp頁面中的數據(特別時域對象中保存的數據)

    ${ 表達式 }

    • 當域對象中都有相同的key時,會按照域的從小到大范圍進行輸出

    • 在輸出null值時,輸出的為空串

    • 在輸出自定義類的對象時,直接調用對象的toString()

      在輸出自定義類對象的屬性值(對象.屬性名)時,實質上調用的是對應屬性名的get()(獲取屬性值)

      不同類型屬性輸出值不同:

      • 變量:值
      • 數組:數組地址,根據數組[下標]找對應值
      • 集合List:集合全部元素,根據集合[下標]找對應值
      • 集合Map:集合全部元素,根據集合.key值找對應value值
    運算符

    ①關系運算符:== / eq(等于)、!= / ne(不等于)、< / lt(小于)、> / gt(大于)、<= / le(小于等于)、>= / ge(大于等于)

    ②邏輯運算符:&& / and(與)、|| / or(或)、| / not(非)

    ③算術運算:+(加)、-(減)、*(乘)、/ / div(除)、% / mod(取余)

    ④empty運算${empty 表達式}:判斷數據是否為空,如果為空,返回true

  • 值為null
  • 值為空串
  • 引用數據類型(Object)數組,長度為0
  • List集合,元素個數為0
  • Map集合,元素個數為0
  • ⑤三元運算:條件 ? 表達式1 : 表達式2

    ⑥[]運算符:Map['帶有特殊符號的key的值']

    • 輸出指定下標的數組或List集合中的值
    • 輸出Map集合中含有特殊字符的key所對應的value值

    ⑦.運算:調用get方法

    隱含對象

    ①PageContextImpl pageContext:獲取jsp頁面中的九大內置對象

    • ${pageContext.九大內置對象}即可獲取九大內置對象,也可以.方法名直接調用對象所擁有的方法(.調用的是方法名所對應的get方法,與調用get方法輸出屬性值類似)

    ②Map<String,Object> pageScope:獲取pageContext域中的數據

    ③Map<String,Object> requestScope:獲取request域中的數據

    ④Map<String,Object> sessionScope:獲取session域中的數據

    ⑤Map<String,Object> applicationScope:獲取servletContext域中的數據

    ⑥ Map<String,String> param:獲取jsp請求頁面中請求參數的值

    ⑦Map<String,String[]> paramValues:獲取jsp頁面中請求參數的值(?name=value & name=value),在有多個值時使用

    ⑧Map<String,String> header:獲取請求頭的信息

    ⑨Map<String,String[]> headerValues:獲取請求頭的信息,多個值時使用

    ⑩Map<String,Cookie> cookie:獲取當前請求的Cookie的信息,可通過該Cookie獲取到指定的Key或其對應的Value值

    ?Map<String,String> initParam:獲取在web.xml中配置的<context-param>上下文參數

    九大內置對象


    HttpServletRequest類:request:請求對象(域對象,一次請求內有效)

    • getScheme():獲取請求的協議
    • getServerName():獲取請求的服務器的IP地址或域名
    • getServerPort():獲取請求的服務器的端口號
    • getContextPath():獲取當前工程路徑(相對)
    • getMethod():獲取請求的方式(GET或POST)
    • getRemoteHost():獲取客戶端的IP地址

    response:響應對象

    PageContextImpl類:pageContext:jsp的上下文對象(域對象,當前jsp頁面范圍內有效)

    HttpSession類:session:會話對象(域對象,一個會話范圍內有效(打開瀏覽器訪問服務器,直到關閉瀏覽器))

    • getID():獲取會話的唯一標識

    ServletContext類:application:ServletContext對象(域對象,整個web工程內有效(web不停止,數據就在))

    config:ServletConfig對象

    out:jsp輸出流對象

    page:指向當前jsp的對象

    exception:異常對象

    • out.wirte()、out.print()和response.getWriter().write()都可以用來輸出數據給客戶端
    • jsp頁面中的所有代碼執行完后,會執行一下兩個操作:
    • 執行out.flush(),將out緩沖區的數據追加寫入到response緩沖區中
    • response執行刷新操作,將數據寫給客戶端
    • out.print():可用于輸出任意類型數據(會先將任意類型數據先轉化為字符串后再調用write())
    • out.write():可輸出字符串(會將任意類型數據先轉化為char類型再輸出)

    常用標簽


    1)靜態包含:

    <%@ include file="/jsp頁面路徑" %>

    • 實質上是將被包含的jsp文件的代碼拷貝到包含的位置處 調用out.write()輸出

    2)動態包含:

    <jsp:include page="/jsp文件路徑" >

    ? (可選)<jsp:param name="參數名" value="參數值">

    </jsp:include>

    • 實質上是執行了JspRuntimeLibrary(requesst,response,"/剪視頻文件路徑",out,false)代碼去調用jsp頁面
    • 該方法共用了九大內置對象
    • 可選部分為傳遞參數,可用request.getParameter("name")獲取值

    3)請求轉發:

    <jsp:forward page="/跳轉路徑"></jsp:forward>

    • 與調用request.getRequestDispatcher("/跳轉路徑").forward(request,response)效果完全一樣

    監聽器


    • 三大組件:Servlet程序、Filter過濾器、Listener監聽器
    • 接口,監聽某事物的變化,通過回調函數,反饋給客戶(程序)去做對應的處理

    ServletContextListener監聽器:監聽ServletContext對象的創建(web工程創建時)和銷毀(web工程停止時)

    • contextInialized(ServletContextEvent sce):在ServletContext對象創建后調用,做初始化
    • contextDestroyed(ServletContextEvent sce):在ServletContext對象銷毀后調用

    使用步驟:

  • 編寫一個類實現ServletContextListener接口

  • 調用其兩個回調方法

  • web.xml中配置監聽器

    • <listener>

      ? <listener-class> </listener-class>

      </listener>

  • JSTL標簽庫


    • 替換代碼腳本

    1)導入標簽庫的jar包:taglibs-standard-impl.jar、taglibs-standard-spec.jar

    2)使用taglib指令引入標簽庫:

  • CORE標簽庫:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  • XML標簽庫:<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

  • FMT標簽庫:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fml" %>

  • SQL標簽庫:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

  • FUNCTIONS標簽庫:<%@ taglib="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

  • 3)常用標簽:

    ? ①<c:set />:往域中保存數據

    • scope:設置保存的域
      • page:PageContext域(默認)
      • request:Request域
      • session:Session域
      • application:ServletContext域
    • var:設置key值
    • value:設置value值

    ②<c:if></c:if>:判斷

    • test:test內的El表達式成立,則輸出標簽間的內容

    ③<c:choose>:多情況判斷

    ? <c:when test="表達式"></c:when>:當test表達式的值為true,執行when標簽

    ? <c:otherwise></c:otherwise>:相當于switch-case的default

    </c:choose>

    • 標簽內只能使用jsp注釋
    • when的父標簽一定是choose
    • otherwise標簽內可以嵌套choose-when

    ④<c:forEach></c:forEach>:遍歷

    • begin:遍歷開始索引
    • end:遍歷結束索引
    • var:當前正在遍歷的數據
    • items:遍歷的數據(集合(Map為鍵值對)、數組等)
    • step:遍歷時的步長(迭代時的步長)
    • varStatus:當前遍歷到的數據的狀態
      • current:獲取當前所遍歷的數據
      • index:獲取遍歷的索引
      • count:當前是遍歷的第幾個
      • first:當前遍歷的數據是否位于第一條
      • last:當前遍歷的數據是否位于最后一條
      • begin:獲取begin屬性值
      • end:獲取end屬性值
      • step:獲取step屬性值

    使用begin-end,var則代表從索引開始到結束

    使用items,var則代表items所要遍歷的數據

    使用EL表達式${}獲取域中的數據作為items所要遍歷的數據

    使用EL表達式${}獲取var的值

    獲取到Map的鍵值對后可通過.key或.value獲取對應的key或value

    文件上傳與下載


    1)上傳文件:(post)

  • 要有form標簽,屬性值method=post,enctype=multipart/form-data

    • get有數據大小限制,所以選用post
    • enctype=multipart/form-data表示提交的數據以多段(每個表單項為一個數據段)的形式進行拼接,然后以二進制流的形式發送給服務器
      • 請求頭中Content-Type表示提交的數據類型
      • boundary是系統每次隨機生成的數據段分隔符,分隔符末尾帶--是數據的結束標記
    • 每段數據以分隔符開始,最后以分隔符結束,數據段以分隔符開始后,包含:①對數據的描述 ②空行 ③上傳的數據
  • 使用<input type="file" name=""/>提交需要上傳的文件

  • 在Servlet程序中對數據進行解析和保存(先導包)

  • 先ServletFileUpload.isMultipartContent(req)判斷上傳的數據是否是多段

  • 通過new DiskFileItemFactory()創建一個FileItemFactory工廠的實現類對象,將其作為參數創建一個ServletFileUpload(FileItemFactory)工具類的對象

  • 調用工具類對象的parseRequest(req)來解析上傳的數據,得到一個封裝了每一個表單項的List<FileItem>集合

  • 循環遍歷(增強for循環)獲取每一個FileItem類型的表單項,調用表單項對象的isFormField()判斷每一個表單項是普通數據類型,還是上傳的文件

    普通表單項:

    • 調用表單項對象的getFiledName()來獲取表單項的name屬性值
    • 調用表單項對象的getString("UTF-8")來獲取表單項的value屬性值

    上傳的文件:

    • 調用表單項對象的getName()獲取上傳的文件名
    • 調用表單項對象的write(new File("path"+"name"))將指定名字的文件保存在指定路徑的位置處
  • 2)下載文件:(get)

  • 獲取要下載的文件名fileName

  • 在下載前需要先知道下載的文件類型(不同文件下載后的格式不一樣)

    • 調用getServletContext()獲取ServletContext對象

    • 調用ServletContext對象的getMimeType("path"+fileName)獲取要下載的文件的數據類型(返回String類型對象)

      • /映射到當前工程目錄的web下
    • 調用resp.setContentType(數據類型),通過響應頭告訴客戶端返回的數據類型

    • 調用resp.setHeader("Content-Disposition","attachment;filename="+fileName),設置并通過響應頭告訴客戶端這個數據是用于下載的

      • Content-Disposition響應頭,表示收到的數據的處理方式

        attachment:表示數據為附件,下載使用

        filename:表示所下載的文件的名

        • 若下載的文件名為中文,需要調用URLEncoder.encode("filename","UTF-8")轉換為UTF-8編碼集的樣式,否則會出現亂碼
  • 讀取要下載的文件內容

    • 調用ServletContext對象的getResourceAsStream("path"+fileName)獲取要下載的文件的一個InputStream流
  • 將要下載的文件內容回傳給客戶端

    • 調用resp.getOutputStream()獲取響應給客戶端的輸出流
    • 若已導入commons-io.jar,直接調用IOUtils.copy(InputStream,OutputStream)將文件的輸入流內容復制給客戶端的輸出流
  • 3)解析上傳的數據:

    • 導入jar包:commons-io.jar、commons-fileupload.jar

    ServletFileUpload類:用于解析上傳的數據

    FileItem類:表示每個表單項

    • boolean ServletFileUpload.isMultipartContent(HttpServletRequest request):判斷上傳的數據是否為多段數據
    • public List<FileItem> parseRequest(HttpServletRequest request):解析上傳的數據
    • boolean FileItem.isFormField():判斷表單項是否為普通的表單項還是文件類型,true則是普通表單項
    • String FileItem.getFieldName():獲取表單項的name屬性值
    • String FileItem.getString():獲取表單項的值,可傳參數"UTF-8"來防止出現亂碼
    • String FileItem.getName():獲取上傳的文件名
    • void FileItem.write(file):將上傳的文件寫入到file所指向的硬盤位置

    Cookie


    創建Cookie:

  • 創建Cookie對象:new Cookie("key","value")
  • 通知客戶端保存Cookie:response對象.addCookie(Cookie)
    • 通過響應頭Set-Cookie通知客戶端保存Cookie(Set-Cookie:key=value)
    • 在收到Set-Cookie響應頭時,會先查看有無該Cookie,沒有則創建,有則修改
    • 可以一次性保存多個Cookie,一個Cookie的大小不能超過4kb
  • 獲取Cookie:

  • 調用request對象.getCookies(),返回一個Cookie[]數組

    • 客戶端通過請求頭Cookie:key=value把Cookie信息發送給服務器
  • 要獲取指定key的Cookie時,只能循環遍歷,判斷Cookie的key與所要的是否相同

  • Cookie對象.getName():獲取Cookie的key

    Cookie對象.getValue():獲取Cookie的value

  • 修改Cookie:

    ①調用構造器:

  • 創建同名的Cookie對象:new Cookie("sameKey","newValue")
  • 通知客戶端保存修改:response對象.addCookie(Cookie)
  • ②調用方法:

  • 找到所要修改的Cookie的對象(for循環遍歷獲取)
  • 調用cookie對象.setValue("newValue")修改value值
    • 中文等會亂碼,需要用Base64編碼
  • 通知客戶端保存修改:response對象.addCookie(Cookie)
  • 設置Cookie存活時間:

  • 調用cookie對象.setMaxAge(s)設置

    • s為存活的秒數

      s為負數時(默認),為會話級別,退出瀏覽器時銷毀Cookie

      s為0時,立即刪除Cookie

      s為正數時,在s秒后刪除Cookie

  • 設置Cookie有效路徑:

  • 調用Cookie對象.setPath("絕對路徑")
    • 該路徑及該路徑下所有的子路徑在請求時都會發送該Cookie
  • Session


    創建Session:

  • 調用request對象.getSession()創建Session對象
    • 第一次調用時是創建Session,之后調用是調用創建好的Session
    • session對象.isNew()可以判斷是否為新創建的Session,返回boolean值
    • 每個Session會有一個唯一的ID
  • Session中存取數值:

  • 調用session對象.setAttribute("key","value")存放數據
  • 調用session對象.getAttribute("key")取數據
  • 設置和獲取Session的超時時長:

  • 調用session對象.setMaxInactiveInterval(s)設置Session的超時時長

    • s為存活的秒數

    • 當s為正數時,設置s秒后銷毀Session,當s為負數時,設置為永不銷毀

    • s的默認時長為30(分鐘),在Tomcat服務器配置文件web.xml中有設定,可以在工程的web.xml中配置以下:

      <session-config>

      ? <session-timeout>存活分鐘</session-timeout>

      </session-config>

  • 調用session對象.getMaxInactiveInterval()獲取Session的超時時長

    • Session超時時長為:客戶端兩次請求間的間隔時長
  • 調用session對象.invalidate()讓當前Session立即失效

  • Filter過濾器


    ①請求攔截、響應過濾

    ②權限配置(實現doFilter方法)

    ③使用Filter過濾器統一處理事務

    • web.xml中配置url為/*可以確保所有的請求都會經過Filter過濾器處理,若在執行的所有路徑中有可能有異常的進行拋出,并由doFilter()進行異常的捕獲,最后判斷是否提交或回滾,由此來實現事務的管理

    (一)web.xml文件配置:

    <filter>

    ? <filter-name>名稱</filter-name>

    ? <filter-class>實現的類的全類名</filter-class>

    ? <init-param>(可選、可多選)

    ? <param-name> name </param-name>

    ? <param-value> value </param-value>

    ? </init-param>

    </filter>

    <filter-mapping>

    ? <filter-name>對應名稱</filter-name>

    ? <url-pattern> 攔截的目標 </url-pattern>(可多選)

    • 攔截的三種目標:

      / :http://localhost:8080/工程路徑/

    • /資源名:精確匹配,攔截所有想訪問指定資源的程序
    • /目錄/*:目錄匹配,攔截所有想訪問指定目錄下的資源的程序
    • *.文件類型:后綴名匹配,攔截所有想訪問相關后綴名的文件的程序

    </filter-mapping>

    (二)實現步驟:

    ①實現javax.servlet.Filter下的Filter接口(需導包)

    ②根據實現Filter的類來配置web.xml文件,限制訪問哪些資源需要經過doFilter過濾

    ③將需要進行請求攔截的內容在doFilter()內實現

    • ServletRequest類要強轉為HttpServletRequest類才能獲取session域

    ④調用參數的方法filterChain.doFilter(servletRequest,servletResponse)實現請求的放行

    • 缺少該步驟的話,即使檢查通過,也不會訪問到目標資源

    (三)Filter過濾器的生命周期

    ①構造器、init()初始化:在Filter過濾器創建時執行

    ②doFilter():每次攔截時執行

    ③destroy():web服務停止時執行銷毀

    (四)Filter過濾器參數中的類

  • FilterConfig類:

    • getFilterName():獲取web.xml文件中所對應的的文本值
    • getInitParameter("name"):獲取web.xml文件中下的下的name所對應的value值
    • getServletContext():獲取ServletContext對象
  • FilterChain過濾器鏈:

    • doFilter():若有多個Fliter過濾器,執行下一個過濾器,否則訪問目標資源

    • Filter過濾器的執行順序是按Filter在web.xml中的配置順序執行的

    • 默認情況下所有Filter過濾器及目標資源處在同一線程

    • 多個Filter過濾器及目標資源共享一個request對象

    • 執行順序:(假設兩個過濾器)

      filter1前——doFilter1——filter2前——doFilter2——目標資源——filter后2——filter后1

      • 若其中任意過濾器執行完后無doFilter,則會直接返回(不會訪問目標資源)
  • (五)ThreadLocal

    • 每個線程中可以為其關聯一個數據,可以使用ThreadLocal來關聯數據
    • 其關聯方式類似于Map(其key值為String類型,存放當前線程名,value值存放想要在該線程中所相關聯的數據的值)
    • 其作用是為了解決線程安全問題(比如事務回滾問題(保存同一個Connection對象)(用后記得將保存的ThreadLocal值remove()))
    • 創建的ThreadLocal對象一般為static修飾
    • 調用ThreadLocal對象的set(數值)來存儲關聯的值(每個ThreadLocal對象只能關聯一個數據值,本質是根據線程名來存儲)
    • 調用ThreadLocal對象的get()來獲取關聯的值(本質是根據線程名來獲取)

    JSON


    • 本質是一個對象

    • 有兩種存在形式:對象(常用于操作JSON中的數據)、字符串(常用于獲取JSON中的數據)

      • JSON.stringify(JSON對象):將JSON對象轉換為字符串形式

        JSON.parse(JSON對象):將JSON對象轉換為對象形式

    (一)客戶端:(javascript下)

    變量:

    var 變量名={

    ? "key1" : 值1 ,

    ? "key2" : 值2 ,

    ? …

    }

    取值:

    變量名.key

    • 數組的話可根據下標獲取指定的值,否則打印數組內全部數據
    • JSON內可嵌套JSON

    (二)服務器:(導包:gson.jsp)

  • JavaBean中:

  • 創建Gson對象
  • 調用Gson對象.toJson(Java類對象)可將java對象轉換為JSON字符串類型對象(返回類型為String類型)
  • 調用Gson對象.fromJson(JSON對象,Java類.class)可將JSON對象轉化為指定的Java類的對象
  • List、Map中:(list與map方法類似)

  • 創建一個Gson對象

  • 調用Gson對象.toJson(list對象)可將list對象轉換為JSON字符串類型對象(返回類型為String類型)

  • 調用Gson對象.fromJson(JSON對象,TypeOfT)可將JSON對象轉換為list集合對象

    • TypeOfT是一個Type類型 ,獲取方法:

      創建一個(匿名)類,該類繼承了TypeToken<集合類型<泛型類型>>,最后調用該類的getType()即可獲取

    • 建議直接使用匿名子類(new TypeToken<集合類型<泛型類型>>(){}的方式調用getType())

  • AJAX


    特點:局部更新、異步請求與響應

    (一)請求與響應:(JavaScript下)

  • var 變量名 = new XMLHttpRequest()創建一個XMLHttpRequest類
  • 創建一個servlet程序,配置web.xml文件
  • 調用XMLHttpRequest變量名.open("請求方式",”servlet程序訪問地址“,true)
    • true:異步
  • (響應所需,無響應時略過)
  • 因為為異步,因此servlet程序中數據的響應格式需要為字符串類型對象(因此使用JSON字符串類型對象(調用toJson()))
  • 使用XMLHttpRequest變量名.onreadystatechange = function(){}綁定事件
  • 在事件中判斷XMLHttpRequest變量名.readyState==4&&XMLHttpRequest變量名.status==200,條件成立時才能調用XMLHttoRequest變量名.responseText獲取到一個JSON字符串類型對象(可調用JSON.parse(JSON對象)轉換為JSON對象以便美觀輸出)
  • 調用XMLHttpRequest變量名.send()發送請求
  • (二)Jquery中使用AJAX:

    ①$.ajax({ })

  • url:請求地址

  • data:請求參數(key=value)

  • type:請求方式

  • success:function(變量名){}:請求后的響應事件

    • 變量名:響應 的對象
  • dataType:決定響應對象的類型

    • text:text純文本

      xml:xml文本的數據格式

      json:JSON對象類型的對象

  • ②$.get("url地址","請求參數","請求響應后的響應事件","響應對象的類型")

    • 請求方式已確定為get請求

    ③$.post("url地址","請求參數","請求響應后的響應事件","響應對象的類型")

    • 請求方式已確定為post請求

    ④$.getJSON("url地址","請求參數","請求響應后的響應事件")

    • 請求方式已確定為get請求,響應對象的類型確定為JSON對象類型

    ⑤$("選擇器").serialize():獲取表單提交的全部數據

    • 數據的格式為key=value&key=value所拼接
    • 在請求轉發到servlet程序時,確保在data(請求參數)中添加&才能獲取到請求參數

    i18n


    思路:

  • 創建一個baseName_localeName.properties的配置文件
    • baseName:共有、通用的名字
    • localName:指定地區語言的名字
    • 配置文件內以key=value的形式保存,key為英文,value為對應的地區的語言
  • 獲取locale對象
    • Locale.getDefault():獲取當前系統默認的地區語言的locale對象
    • Locale.getAvailableLocales():獲取集合全部的地區語言的locale對象
    • Locale.CHINA():獲取zh_CN的locale對象
    • Locale.US():獲取en_US的locale對象
  • 調用ResourceBundle.getBundle("baseName",locale對象)獲取到一個ResourceBundle對象
  • 根據ResourceBundle對象調用其getString("properties文件的key")獲取到key所對應的value值(根據locale對象所對應的地區語言獲取)
  • (一)請求頭方式實現網頁語言的國際化

    <%

  • 配置properties文件(key=value形式來表示頁面上所有用到多種語言的文本,每種語言都要用properties文件)
  • Locale.getLocale()獲取到通過locale對象
  • 調用ResourceBundle.getBundle創建一個ResourceBundle對象
  • %>

    之后在所有用到多種語言的文本處,使用

    <%= ResourceBundle對象.getString("baseName",locale對象) %>

    來表示文本,當瀏覽器默認語言不同時,就會自動更改網頁的語言

    (二)根據用戶選擇實現網頁語言的國際化

  • 每種語言用鏈接標簽<a></a>表示
  • 鏈接標簽的屬性href鏈接到當前網頁,附帶一個參數用來區分不同地區的語言
  • 之后與上述方法一樣,但在獲取locale對象時,要根據參數(request.getParameter("參數名"))來進行判斷(根據不同地區語言獲取不同的locale對象,默認情況再使用Locale.getDefault())
  • (三)使用JSTL標簽庫實現網頁語言的國際化

  • 導包taglibs-standard-impl.jar、taglibs-standard-spec.jar
  • 引入頭標簽<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • 根據用戶選擇的語言,使用鏈接標簽傳遞對應語言的參數 = 對應地區的locale值
  • 使用< fmt:setLocale value="${param.參數名}" />設置locale的值
  • 使用< fmt:setBundle basename=對應properties文件的baseName />設置bundle對象
  • 在所有需要用到不同語言的文本處,使用< fmt:message key="properties文件內對應的key" />替換
  • 當用戶選擇不同語言時,根據參數傳遞不同語言的locale對象,根據locale對象和baseName獲取到bundle對象,再根據bundle對象中對應的key獲取對應的value
  • 零碎知識點


    JS和jQuery的頁面加載完成之后

    • JS:window.onload=function(){}

    • jQuery:$(function(){})、$(document).ready(function(){})

    1)觸發時間:

    JS:頁面加載好后,創建所有標簽的DOM對象,并將標簽顯示內容加載完成

    jQuery:頁面加載好后,創建所有標簽的DOM對象后就執行

    2)執行次數:

    JS:只會執行最后一次賦值的函數

    jQuery:執行所有的function函數,按順序執行

    base標簽

    相對路徑在跳轉時會根據當前頁面地址欄中的地址進行跳轉,使用base標簽可以設置跳轉時的相對路徑

    <base href="絕對路徑"/>

    • href的屬性值變成 相對路徑前的地址,當頁面以相對路徑進行跳轉時,會在該地址的基礎上進行跳轉
    • 絕對路徑下的資源名可以省略(跳轉是在目錄的基礎上跳轉(/、..),與資源名無關)
    web中/的不同意義

    被瀏覽器解析:http://ip:port

    被服務器解析:http://ip:port/工程名

    response.sendRediect("/"):將/發送給瀏覽器解析,得到http://ip:port

    BeanUtils工具類

    • 將客戶端的表單信息快速封裝進自定義類中

    導包:commons-logging.jar、commons-beanutils.jar

  • BeanUtils.populate(Object,Map)
    • Object為要將數據封裝進去的類(先獲取name屬性值,再將值封裝進Object類中)
    • 可調用req.getParameterMap(),獲取客戶端的表單信息并封裝進一個Map集合中,作為populate的另一個參數
    • 本質是獲取name與其值后,調用類中同名的set方法
  • 表單重復提交

    ①在用戶提交表單后,因為瀏覽器會記錄下最后一次請求的信息,服務器若使用請求轉發進行頁面跳轉,當用戶按功能鍵(Ctrl+F5)刷新時,會重新發起瀏覽器的最后一次請求。

    • 解決方法:改用請求轉發為重定向

    ②用戶提交表單,但可能出現網絡延遲,導致用戶多次提交表單

    • 解決辦法:使用驗證碼

    ③用戶提交表單,服務器也正常跳轉,但提交完成后,用戶在瀏覽器頁面下進行回退,重新提交表單

    • 解決辦法:使用驗證碼
    請求轉發與重定向

    1)請求轉發:

    • 客戶端向服務器發送一個請求,(客戶端發送的)請求地址沒有變化,服務器調用內部方法將請求轉發到新地址進行處理,處理完后將結果返回給客戶端
    • 請求轉發的方式只會有一次客戶端對服務器的請求,服務器對客戶端的響應,因此瀏覽器地址欄顯示的依舊為第一次訪問的原地址(request對象保持不變)
    • 請求轉發只能訪問當前工程web下的資源,但可以訪問WEB-INF下的資源,且request.setAttribute()域內保存的數據,新頁面可以獲取

    2)重定向:

    • 客戶端向服務器發送一個請求,(客戶端發送的)請求地址已發生了變化,服務器向客戶端發送了一個全新的地址,此刻客戶端會自動訪問新的地址,服務器將新的地址內容返回給客戶端
    • 客戶端發起了兩次請求,服務器進行了兩次響應,且瀏覽器地址欄顯示的為第二次請求訪問的新地址(request對象發生了改變)
    • 重定向可以訪問其他工程下的資源,但不可訪問WEB-INF下的資源,且request.setAttribute()域內保存的數據,新頁面獲取不到
    驗證碼

  • 導入谷歌驗證碼jar包kaptcha.jar

  • 配置web.xml文件用于生成驗證碼的Servlet程序

    <servlet-class>

    ? com.google.code.kaptcha.servlet.KaptchaServlet

    </servlet-class>

  • 在表單中使用img標簽引用到servlet地址處并獲取到驗證碼圖片

  • 服務器中獲取谷歌生成的驗證碼并和客戶端發送的驗證碼進行比較

    • 使用request對象.getSession().getAttribute(KAPTCHA_SESSION_KEY)獲取Session中的驗證碼
    • 獲取到驗證碼、保存到String中后應立即調用request對象.getSession().removeAttribute(KAPTCHA_SESSION_KEY)銷毀驗證碼
  • 綁定單擊事件,使用this.src="絕對路徑?time="+new Date()直接訪問web.xml下kaptcha的servlet程序,可以起到單擊圖片切換驗證碼的效果,且由于有參數Date的作用,因此不會因為緩存而切換不了驗證碼

  • 異常處理

    步驟:配置web.xml文件,設計好跳轉的頁面,并將異常往外拋出,由Tomcat服務器捕獲

    <error-page>

    ? <error-code> 錯誤碼 </error-code>

    ? <location> 跳轉的頁面地址 </location>

    • / :http://localhost:8080/工程名/

    </error-page>

    BindException

    netstat -ano|findstr 端口號:查看占用端口的程序

    taskkill /F /PID 端口id:結束端口占用

    請求頭


    • req.getHeader():可以獲取對應的請求頭

    Referer:獲取發起請求的絕對路徑(可用于購物車添加后返回原頁面)

    總結

    以上是生活随笔為你收集整理的JavaWeb随手笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。