整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          一篇文章帶你全面認識 static 關鍵字

          tatic 是我們日常生活中經常用到的關鍵字,也是 Java 中非常重要的一個關鍵字,static 可以修飾變量、方法、做靜態代碼塊、靜態導包等,下面我們就來具體聊一聊這個關鍵字,我們先從基礎開始,從基本用法入手,然后分析其原理、優化等。

          初識 static 關鍵字

          static 修飾變量

          static 關鍵字表示的概念是 全局的、靜態的,用它修飾的變量被稱為靜態變量。

          public class TestStatic {
              
              static int i = 10; // 定義了一個靜態變量 i 
          }
          

          靜態變量也被稱為類變量,靜態變量是屬于這個類所有的。什么意思呢?這其實就是說,static 關鍵字只能定義在類的 {} 中,而不能定義在任何方法中。

          就算把方法中的 static 關鍵字去掉也是一樣的。

          static 屬于類所有,由類來直接調用 static 修飾的變量,它不需要手動實例化類進行調用

          public class TestStatic {
          
              static int i = 10;
          
              public static void main(String[] args) {
                  System.out.println(TestStatic.i);
              }
          }
          

          這里你需要理解幾個變量的概念

          • 定義在構造方法、代碼塊、方法外的變量被稱為實例變量,實例變量的副本數量和實例的數量一樣。
          • 定義在方法、構造方法、代碼塊內的變量被稱為局部變量;
          • 定義在方法參數中的變量被稱為參數。

          詳情參考

          static 修飾方法

          static 可以修飾方法,被 static 修飾的方法被稱為靜態方法,其實就是在一個方法定義中加上 static 關鍵字進行修飾,例如下面這樣

          static void sayHello(){}
          

          《Java 編程思想》在 P86 頁有一句經典的描述

          static 方法就是沒有 this 的方法,在 static 內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用 static 方法,這實際上是 static 方法的主要用途

          其中有一句非常重要的話就是 static 方法就是沒有 this 的方法,也就是說,可以在不用創建對象的前提下就能夠訪問 static 方法,如何做到呢?看下面一段代碼

          在上面的例子中,由于 staticMethod 是靜態方法,所以能夠使用 類名.變量名進行調用。

          因此,如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置為 static。平常我們見的最多的 static 方法就是 main方 法,至于為什么 main 方法必須是 static 的,現在應該很清楚了。因為程序在執行 main 方法的時候沒有創建任何對象,因此只有通過類名來訪問。

          static 修飾方法的注意事項

          • 首先第一點就是最常用的,不用創建對象,直接類名.變量名 即可訪問;
          • static 修飾的方法內部不能調用非靜態方法;

          • 非靜態方法內部可以調用 static 靜態方法。

          static 修飾代碼塊

          static 關鍵字可以用來修飾代碼塊,代碼塊分為兩種,一種是使用 {} 代碼塊;一種是 static {} 靜態代碼塊。static 修飾的代碼塊被稱為靜態代碼塊。靜態代碼塊可以置于類中的任何地方,類中可以有多個 static 塊,在類初次被加載的時候,會按照 static 代碼塊的順序來執行,每個 static 修飾的代碼塊只能執行一次。我們會面會說一下代碼塊的加載順序。下面是靜態代碼塊的例子

          static 代碼塊可以用來優化程序執行順序,是因為它的特性:只會在類加載的時候執行一次。

          static 用作靜態內部類

          內部類的使用場景比較少,但是內部類還有具有一些比較有用的。在了解靜態內部類前,我們先看一下內部類的分類

          • 普通內部類
          • 局部內部類
          • 靜態內部類
          • 匿名內部類

          靜態內部類就是用 static 修飾的內部類,靜態內部類可以包含靜態成員,也可以包含非靜態成員,但是在非靜態內部類中不可以聲明靜態成員。

          靜態內部類有許多作用,由于非靜態內部類的實例創建需要有外部類對象的引用,所以非靜態內部類對象的創建必須依托于外部類的實例;而靜態內部類的實例創建只需依托外部類;

          并且由于非靜態內部類對象持有了外部類對象的引用,因此非靜態內部類可以訪問外部類的非靜態成員;而靜態內部類只能訪問外部類的靜態成員;

          • 內部類需要脫離外部類對象來創建實例
          • 避免內部類使用過程中出現內存溢出
          public class ClassDemo {
            
              private int a = 10;
              private static int b = 20;
          
              static class StaticClass{
                  public static int c = 30;
                  public int d = 40;
                
                  public static void print(){
                      //下面代碼會報錯,靜態內部類不能訪問外部類實例成員
                      //System.out.println(a);
               
                      //靜態內部類只可以訪問外部類類成員
                      System.out.println("b = "+b);
                      
                  }
                
                  public void print01(){
                      //靜態內部內所處的類中的方法,調用靜態內部類的實例方法,屬于外部類中調用靜態內部類的實例方法
                      StaticClass sc = new StaticClass();
                      sc.print();
                  }   
              }
          }
          

          靜態導包

          不知道你注意到這種現象沒有,比如你使用了 java.util 內的工具類時,你需要導入 java.util 包,才能使用其內部的工具類,如下

          但是還有一種導包方式是使用靜態導包,靜態導入就是使用 import static 用來導入某個類或者某個包中的靜態方法或者靜態變量。

          import static java.lang.Integer.*;
          
          public class StaticTest {
          
              public static void main(String[] args) {
                  System.out.println(MAX_VALUE);
                  System.out.println(toHexString(111));
              }
          }
          

          static 進階知識

          我們在了解了 static 關鍵字的用法之后,來看一下 static 深入的用法,也就是由淺入深,慢慢來,前戲要夠~

          關于 static 的所屬類

          static 所修飾的屬性和方法都屬于類的,不會屬于任何對象;它們的調用方式都是 類名.屬性名/方法名,而實例變量和局部變量都是屬于具體的對象實例。

          static 修飾變量的存儲位置

          首先,先來認識一下 JVM 的不同存儲區域。

          • 虛擬機棧 : Java 虛擬機棧是線程私有的數據區,Java 虛擬機棧的生命周期與線程相同,虛擬機棧也是局部變量的存儲位置。方法在執行過程中,會在虛擬機棧種創建一個 棧幀(stack frame)。
          • 本地方法棧: 本地方法棧也是線程私有的數據區,本地方法棧存儲的區域主要是 Java 中使用 native 關鍵字修飾的方法所存儲的區域
          • 程序計數器:程序計數器也是線程私有的數據區,這部分區域用于存儲線程的指令地址,用于判斷線程的分支、循環、跳轉、異常、線程切換和恢復等功能,這些都通過程序計數器來完成。
          • 方法區:方法區是各個線程共享的內存區域,它用于存儲虛擬機加載的 類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據,也就是說,static 修飾的變量存儲在方法區中
          • 堆: 堆是線程共享的數據區,堆是 JVM 中最大的一塊存儲區域,所有的對象實例,包括實例變量都在堆上進行相應的分配。

          static 變量的生命周期

          static 變量的生命周期與類的生命周期相同,隨類的加載而創建,隨類的銷毀而銷毀;普通成員變量和其所屬的生命周期相同。

          static 序列化

          我們知道,序列化的目的就是為了 把 Java 對象轉換為字節序列。對象轉換為有序字節流,以便其能夠在網絡上傳輸或者保存在本地文件中。

          聲明為 static 和 transient 類型的變量不能被序列化,因為 static 修飾的變量保存在方法區中,只有堆內存才會被序列化。而 transient 關鍵字的作用就是防止對象進行序列化操作。

          類加載順序

          我們前面提到了類加載順序這么一個概念,static 修飾的變量和靜態代碼塊在使用前已經被初始化好了,類的初始化順序依次是

          加載父類的靜態字段 -> 父類的靜態代碼塊 -> 子類靜態字段 -> 子類靜態代碼塊 -> 父類成員變量(非靜態字段)

          -> 父類非靜態代碼塊 -> 父類構造器 -> 子類成員變量 -> 子類非靜態代碼塊 -> 子類構造器

          static 經常用作日志打印

          我們在開發過程中,經常會使用 static 關鍵字作為日志打印,下面這行代碼你應該經常看到

          private static final Logger LOGGER = LogFactory.getLoggger(StaticTest.class);
          

          然而把 static 和 final 去掉都可以打印日志

          private final Logger LOGGER = LogFactory.getLoggger(StaticTest.class);
          private Logger LOGGER = LogFactory.getLoggger(StaticTest.class);
          

          但是這種打印日志的方式存在問題

          對于每個 StaticTest 的實例化對象都會擁有一個 LOGGER,如果創建了1000個 StaticTest 對象,則會多出1000個Logger 對象,造成資源的浪費,因此通常會將 Logger 對象聲明為 static 變量,這樣一來,能夠減少對內存資源的占用。

          static 經常用作單例模式

          由于單例模式指的就是對于不同的類來說,它的副本只有一個,因此 static 可以和單例模式完全匹配。

          下面是一個經典的雙重校驗鎖實現單例模式的場景

          public class Singleton {
            
              private static volatile Singleton singleton;
           
              private Singleton() {}
           
              public static Singleton getInstance() {
                  if (singleton == null) {
                      synchronized (Singleton.class) {
                          if (singleton == null) {
                              singleton = new Singleton();
                          }
                      }
                  }
                  return singleton;
              }
          }
          

          來對上面代碼做一個簡單的描述

          使用 static 保證 singleton 變量是靜態的,使用 volatile 保證 singleton 變量的可見性,使用私有構造器確保 Singleton 不能被 new 實例化。

          使用 Singleton.getInstance() 獲取 singleton 對象,首先會進行判斷,如果 singleton 為空,會鎖住 Singletion 類對象,這里有一些小伙伴們可能不知道為什么需要兩次判斷,這里來解釋下

          如果線程 t1 執行到 singleton == null 后,判斷對象為 null,此時線程把執行權交給了 t2,t2 判斷對象為 null,鎖住 Singleton 類對象,進行下面的判斷和實例化過程。如果不進行第二次判斷的話,那么 t1 在進行第一次判空后,也會進行實例化過程,此時仍然會創建多個對象。

          類的構造器是否是 static 的

          這個問題我相信大部分小伙伴都沒有考慮過,在 Java 編程思想中有這么一句話 類的構造器雖然沒有用 static 修飾,但是實際上是 static 方法,但是并沒有給出實際的解釋,但是這個問題可以從下面幾個方面來回答

          • static 最簡單、最方便記憶的規則就是沒有 this 引用。而在類的構造器中,是有隱含的 this 綁定的,因為構造方法是和類綁定的,從這個角度來看,構造器不是靜態的。
          • 從類的方法這個角度來看,因為 類.方法名不需要新創建對象就能夠訪問,所以從這個角度來看,構造器也不是靜態的
          • 從 JVM 指令角度去看,我們來看一個例子
          public class StaticTest {
          
              public StaticTest(){}
          
              public static void test(){
          
              }
          
              public static void main(String[] args) {
                  StaticTest.test();
                  StaticTest staticTest = new StaticTest();
              }
          }
          

          我們使用 javap -c 生成 StaticTest 的字節碼看一下

          public class test.StaticTest {
            public test.StaticTest();
              Code:
                 0: aload_0
                 1: invokespecial #1                  // Method java/lang/Object."<init>":()V
                 4: return
          
            public static void test();
              Code:
                 0: return
          
            public static void main(java.lang.String[]);
              Code:
                 0: invokestatic  #2                  // Method test:()V
                 3: new           #3                  // class test/StaticTest
                 6: dup
                 7: invokespecial #4                  // Method "<init>":()V
                10: astore_1
                11: return
          }
          
          

          我們發現,在調用 static 方法時是使用的 invokestatic 指令,new 對象調用的是 invokespecial 指令,而且在 JVM 規范中 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.invokestatic 說到

          從這個角度來講,invokestatic 指令是專門用來執行 static 方法的指令;invokespecial 是專門用來執行實例方法的指令;從這個角度來講,構造器也不是靜態的。

          語言

          描述

          結構

          HTML

          網頁元素和內容

          表現

          CSS

          網頁元素頁面樣式

          行為

          JavaScript

          網頁交互

          1 HTML概念

          HTML,超文本標記語言(Hyper Text Markup Language),是一門描述性語言。標記,標簽,元素,叫法不同,意思相同。HTML超文本標記語言主要通過標簽的方式,對網頁頁面的文本、圖片、音頻、視頻等內容進行描述。學習HTML,就是學習各種標簽,來搭建網頁的結構。

          2 HTML結構

          結構:!DOCTYPE

          說明:作用是告訴瀏覽器用哪個文檔規范來解析文檔

          標簽:html

          說明:用于搭建HTML網頁文檔結構和網頁布局


          ?標簽:head

          說明:用于定義HTML網頁文檔的頭部,它是所有頭部元素的容器?


          ?標簽:body

          說明:用來定義HTML網頁文檔的主體區域?


          ?標簽:meta

          說明:用來描述HTML網頁文檔的屬性?


          ?標簽:title

          說明:用來放到HTML網頁文檔的頭部,是搜索引擎首要抓取的目標代碼?


          ?2.1 標簽

          標簽,也叫作標記,是由一對尖括號<>,里面包含單詞組成

          2.1.1 雙標簽

          <html></html>

          2.1.2 單標簽

          <br>

          2.1.3 標簽關系

          嵌套關系

          <html>
              <head>
              </head>
          </html>

          并列關系

          <head>
          </head>
          <body>    
          </body>

          3 注釋

          注釋用來幫助程序員記錄程序設計方法,輔助程序閱讀

          4 head標簽

          4.1 title標簽

          雙標簽,定義網頁的標題

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="utf-8">
              <title>百度一下,你就知道了</title>
          </head>
          <body>
          
          </body>
          </html>

          4.2 meta標簽

          是單標簽,用來描述HTML網頁文檔的屬性

          4.2.1 name屬性

          屬性值

          說明

          keywords

          網頁關鍵字,多個逗號隔開

          description

          網頁描述

          author

          作者

          copyright

          版權信息

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <!-- 網頁關鍵字 -->
              <meta name="keywords" content="html,css,javascript">
              <!-- 網頁描述 -->
              <meta name="description" content="基礎前端知識">
              <!-- 網頁作者 -->
              <meta name="author" content="buddha">
              <!-- 網頁版權信息 -->
              <meta name="copyright" content="版權所有,翻版必究">
          </head>
          <body>
          
          </body>
          </html>

          標簽屬性:

          1、標簽的屬性寫在開始標簽內部

          2、標簽名與屬性之間要有空格隔開

          3、一個標簽可以同時存在多個屬性

          4、屬性之間以空格隔開

          5、屬性沒有先后順序之分

          4.2.2 http-equiv屬性

          屬性值

          說明

          Content-Type

          定義網頁所使用編碼

          refresh

          定義網頁自動刷新跳轉

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <!-- 設置網頁編碼完整寫法 -->
              <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
              <!-- 設置網頁編碼簡寫寫法 -->
              <meta charset="UTF-8">
              <!-- 網頁打開3秒后跳去百度 -->
              <meta http-equiv="refresh" content="3;url=https://www.baidu.com">
          </head>
          <body>
          
          </body>
          </html>

          4.3 style標簽

          是雙標簽,用來定義標簽的css樣式

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <style type="text/css">
                  /* css內聯樣式寫這里 */
              </style>
          </head>
          <body>
          
          </body>
          </html>

          4.4 link標簽

          是單標簽,是用來引入外部css樣式文件

          <link rel="stylesheet" href="css/index.css" type="text/css">

          4.5 script標簽

          是雙標簽,是用來寫JavaScript代碼的地方

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <script>
                  /* 這里寫JavaScript代碼 */
              </script>
          
          </head>
          <body>
          
          </body>
          </html>

          4.6 base標簽

          是單標簽,是用來設置整個網頁的基礎路徑。

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <base href="https://pic.rmb.bdstatic.com">
          
          </head>
          <body>
              <img src="bjh/news/e7fb4c2be6a2e439ff7e3197fa205d8f1336.gif">
          </body>
          </html>

          開發中很少用到,有人使用知道就行

          上面所述標簽是放在head標簽里的,接下來接觸的標簽都是放在body標簽內的

          5 文本標簽

          5.1 標題標簽

          是雙標簽,h是header的縮寫

          <h1>h1標簽:一級標題</h1>
          <h2>h2標簽:二級標題</h2>
          <h3>h3標簽:三級標題</h3>
          <h4>h4標簽:四級標題</h4>
          <h5>h5標簽:五級標題</h5>
          <h6>h6標簽:六級標題</h6>

          特點:

          1、字體加粗

          2、獨占一行

          3、從h1到h6,字體逐漸減小

          4、使用<h>標簽的主要意義是告訴搜索引擎這是一段文字的標題

          5、<h1>在一個頁面最多只能有一個,不要用多個

          5.2 段落標簽

          是雙標簽,p是paragraph的縮寫

          <p>這是一段文字</p>
          <p>這是一段文字</p>
          <p>這是一段文字</p>

          特點:

          1、獨占一行

          2、段落與段落之間,存在間隙

          5.3 換行標簽

          是單標簽,br是break的縮寫

          <p>這是一段<br>文字</p>

          特點:

          1、強制換行

          2、單標簽

          5.4 水平線標簽

          是單標簽,hr是horizon地平線的縮寫

          <p>這是一段文字</p>
          <hr>
          <p>這是一段文字</p>

          特點:

          1、在頁面中顯示一條水平線

          2、單標簽

          6 文本格式化標簽

          標簽1

          標簽2

          說明

          b

          strong

          加粗

          u

          ins

          下劃線

          i

          em

          傾斜

          s

          del

          刪除線

          <b>這是一段文字</b>
          <strong>這是一段文字</strong>
          <br>
          <u>這是一段文字</u>
          <ins>這是一段文字</ins>
          <br>
          <i>這是一段文字</i>
          <em>這是一段文字</em>
          <br>
          <s>這是一段文字</s>
          <del>這是一段文字</del>

          特點:

          1、不會獨占一行

          2、推薦使用標簽2所在列標簽

          6.1 上標標簽

          sup是superscripted這個單詞的縮寫

          <!DOCTYPE html>
          <html lang="en">
          <head>
          </head>
          <body>
              a<sup>2</sup>
          </body>
          </html>

          6.2 下標標簽

          sub是subscripted這個單詞的縮寫

          <!DOCTYPE html>
          <html lang="en">
          <head>
          </head>
          <body>
              H<sub>2</sub>O
          </body>
          </html>

          6.3 字符實體

          在網頁中展示特殊符號效果時,需要使用字符實體替代

          顯示結果

          描述

          實體名稱


          空格

          <

          小于號

          <

          >

          大于號

          >

          &

          &

          "

          雙引號

          "

          x

          乘號

          ×

          ÷

          除號

          ÷

          -

          長破折號

          |

          豎線

          |

          左單引號

          右單引號

          ?

          版權符

          ©

          ?

          注冊商標

          ®

          ?

          商標

          °

          °

          7 媒體標簽

          7.1 圖片標簽

          <img src="./001.jpg" alt="">

          img標簽常見屬性:

          屬性名

          說明

          src

          圖片路徑(絕對路徑、相對路徑)

          alt

          圖片加載失敗時,顯示的文字

          title

          鼠標懸停時,顯示的文字

          width

          圖片寬度

          height

          圖片高度

          只設置寬或高,會自動等比縮放,寬高只需要數字,不需要'px'

          <img src="./001.jpg" alt="圖片加載失敗" title="這是程序兔" width="200" height="200">

          絕對路徑:指目錄下的絕對位置,比如從根目錄開始的路徑,或完整的網絡地址

          相對路徑:從當前文件開始出發找目標文件的過程

          7.2 音頻標簽

          <audio src="music.mp3" controls autoplay loop></audio>

          audio標簽常見屬性:

          屬性名

          說明

          src

          音頻路徑

          controls

          顯示播放控件

          autoplay

          自動播放

          loop

          循環播放

          支持mp3、wav、ogg三種音頻格式

          7.3 視頻標簽

          <video src="video.mp4" controls loop autoplay></video>

          屬性名

          說明

          src

          視頻路徑

          controls

          顯示播放控件

          autoplay

          自動播放

          loop

          循環播放

          支持mp4、webm、ogg三種視頻格式

          7.4 超鏈接標簽

          超鏈接,是雙標簽,實現各個獨立頁面之間進行跳轉,可以跳去站外也可以在站內之間跳轉

          <a href="鏈接地址">文本或圖片</a>

          站外跳轉,采用絕對路徑

          <a href="http://www.baidu.com" target="_blank">百度</a>

          站內跳轉,采用相對路徑

          <!-- a頁面 -->
          <a href="b.html">跳去b頁面</a>
          <!-- b頁面 -->
          <p>b頁面</p>

          頁面內跳轉

          <a href="#ms">美食</a>
          <a href="#jd">景點</a>
          <h3 id="ms">推薦美食</h3>
          <!-- 省略n個br標簽 -->
          <br>
          <h3 id="jd">推薦景點</h3>

          屬性名

          說明

          href

          跳轉鏈接

          target

          鏈接打開方式

          target屬性值

          屬性值

          說明

          _self

          默認,原窗口打開鏈接

          _blank

          在新窗口打開鏈接

          _parent

          在父窗口打開鏈接

          _top

          在頂層窗口打開超鏈接

          target屬性值一般使用_self(默認)和_blank

          8 列表標簽

          8.1 無序列表

          <ul type="屬性值">
              <li>列表項</li>
              <li>列表項</li>
              <li>列表項</li>
          </ul>

          解釋:

          1、ul,unordered lists,無序列表,li,list item,列表項

          2、ul標簽子標簽只允許是li標簽

          3、li標簽可以包含任意內容

          type屬性值

          屬性值

          說明

          disc

          默認,實心圓

          circle

          空心圓

          square

          實心方型

          <ul>
              <li>你</li>
              <li>我</li>
              <li>他</li>
          </ul>

          8.2 有序列表

          <ol type="屬性值">
              <li>列表項</li>
              <li>列表項</li>
              <li>列表項</li>
          </ol>

          解釋:

          1、ol,ordered lists,有序列表,li,list item,列表項

          2、ol標簽子標簽只允許是li標簽

          3、li標簽可以包含任意內容

          type屬性值

          屬性值

          說明

          1

          默認,阿拉伯數字,1,2,3......

          a

          小寫英文字母,a,b,c......

          A

          大寫英文字母,A,B,C......

          i

          小寫羅馬數字,i,ii,iii......

          I

          大寫羅馬數字,I,II,III......

          <ol>
              <li>你</li>
              <li>我</li>
              <li>他</li>
          </ol>

          8.3 自定義列表

          <dl>
              <dt>名詞</dt>
              <dd>描述</dd>
              ……
          </dl>

          解釋:

          1、dl,definition lists,自定義列表;dt,definition term,自定義列表組;dd,definition description,自定義列表描述

          <dl>
              <dt>稱呼</dt>
              <dd>你</dd>
              <dd>我</dd>
              <dd>他</dd>
          </dl>

          9 表格標簽

          9.1 表格基本結構

          <table>
              <tr>
                  <td>單元格1</td>
                  <td>單元格2</td>
              </tr>
              <tr>
                  <td>單元格3</td>
                  <td>單元格4</td>
              </tr>
          </table>

          解釋:

          1、tr,table row,表格行;td,table data cell,表行單元格

          <table>
              <tr>
                  <td>1</td>
              </tr>
          </table>

          9.2 表格標簽屬性

          屬性名

          屬性值

          描述

          border

          數字

          邊框寬度

          width

          數字

          表格寬度

          height

          數字

          表格高度

          <table border="1" width="200" height="50">
              <tr>
                  <td>1</td>
              </tr>
          </table>

          9.3 表格標題標簽

          <caption>標題內容</caption>,位于表格內第一行

          <table border="1" width="200" height="50">
              <caption>數字</caption>
              <tr>
                  <td>1</td>
              </tr>
          </table>

          9.4 表格表頭單元格標簽

          <th></th>,th,table header cell,表頭單元格

          <table border="1" width="200" height="50">
              <caption>數字</caption>
              <tr>
                  <th>序號</th>
              </tr>
              <tr>
                  <td>1</td>
              </tr>
          </table>

          9.5 表格語義化結構標簽

          thead、tbody、tfoot

          <table border="1" width="200" height="50">
              <caption>數字</caption>
              <thead>
                  <tr>
                      <th>序號</th>
                  </tr>
              </thead>
              <tbody>
                  <tr>
                      <td>1</td>
                  </tr>
              </tbody>
              <tfoot>
                  <tr>
                      <td>匯總</td>
                  </tr>
              </tfoot>
          </table>

          9.6 合并單元格

          屬性名

          屬性值

          說明

          rowspan

          合并單元格個數

          合并行,單元格垂直合并

          colspan

          合并單元格個數

          合并列,單元格水平合并

          <td rowspan="跨越的行數"></td>
          <td colspan="跨越的列數"></td>
          <table border="1" width="200" height="50">
              <caption>數字</caption>
              <thead>
                  <tr>
                      <th>序號</th>
                      <th>金額</th>
                      <th>金額</th>
                  </tr>
              </thead>
              <tbody>
                  <tr>
                      <td>1</td>
                      <td rowspan="2">20</td>
                      <td rowspan="2">20</td>
                  </tr>
                  <tr>
                      <td>2</td>
                  </tr>
              </tbody>
              <tfoot>
                  <tr>
                      <td>匯總</td>
                      <td colspan="2">40</td>
                  </tr>
              </tfoot>
          </table>

          10 表單標簽

          10.1 form標簽

          雙標簽,包裹其它表單標簽

          <form>
              // 表單
          </form>

          form標簽的常用屬性

          屬性

          說明

          name

          表單名稱

          method

          提交方式

          action

          提交地址

          target

          打開方式

          enctype

          編碼方式

          name屬性

          一個頁面中,表單可能不止一個。name屬性,用來區分不同的表單

          <form name="myForm"></form>

          method屬性

          用來指定表單數據使用哪種提交方式給后端

          屬性值

          說明

          get

          get方式

          post

          post方式

          <form method="get"></form>

          action屬性

          用來指定表單數據提交到哪個地址

          <!-- 比如提交到index.php地址 -->
          <form action="index.php"></form>

          target屬性

          該屬性跟a標簽的target屬性一樣,其屬性值也是四個,一般情況只用到_blank屬性值,默認也是這個值

          <form target="_blank"></form>

          enctype屬性

          屬性值

          說明

          application/x-www-form-urlencoded

          在發送前編碼所有字符(默認)

          multipart/form-data

          不對字符編碼,在使用包含文件上傳控件的表單時,必須使用該值

          text/plain

          空格轉換為 "+" 加號,但不對特殊字符編碼

          <form enctype="multipart/form-data"></form>

          10.2 input標簽

          input是單標簽

          <input type="表單類型">

          屬性值

          說明

          text

          單行文本框

          password

          密碼文本框

          radio

          單選框

          checkbox

          多選框

          button

          普通按鈕

          submit

          提交按鈕

          reset

          重置按鈕

          file

          文件上傳

          單行文本框常用屬性

          屬性

          說明

          value

          設置文本框的默認值

          size

          設置文本框的長度

          maxlength

          設置最多可輸入字符

          <form>
              <input type="text" value="默認值" size="長度" maxlength="可輸入字符">
          </form>
          <form>
              <label>姓名:<input type="text" value="曹操" size="20" maxlength="10"></label>
          </form>

          密碼文本框常用屬性

          密碼文本框常用屬性和單行文本框常用屬性相同

          <input type="password" value="默認值" size="長度" maxlength="可輸入字符">
          <form>
              <label>密碼:<input type="password" value="12345678" size="20" maxlength="10"></label>
          </form>

          單選框

          屬性

          說明

          name

          組名,同組單選框,組名要相同,必要屬性

          value

          單選框選項取值,必要屬性

          checked

          默認選中項,同組單選框,可以有一個默認選中項

          <input type="radio" name="組名" value="取值" checked="checked">
          <form>
              性別:
              <input type="radio" name="sex" value="男" checked="checked">男
              <input type="radio" name="sex" value="女">女
          </form>

          復選框

          復選框和單選框的屬性都相同,區別復選框可以多選

          <form>
              愛好:
              <input type="checkbox" name="hobby" value="籃球" checked>籃球
              <input type="checkbox" name="hobby" value="足球" checked>足球
              <input type="checkbox" name="hobby" value="臺球">臺球
          </form>

          普通按鈕

          <input type="button" value="取值">
          <form>
              <input type="button" value="普通按鈕">
          </form>
          <button>普通按鈕</button>

          區別:

          1、input是單標簽,button是雙標簽

          2、button標簽的信息除了文本,還可以是圖像、其它標簽等

          3、button有type屬性,屬性值可以是button、submit、reset等

          提交按鈕

          <input type="submit" value="取值">
          <form>
              <input type="submit" value="提交">
          </form>

          把對應表單數據提交給后端服務器

          重置按鈕

          <input type="reset" value="取值">
          <form>
              <input type="reset" value="重置">
          </form>

          點擊重置后,所在form表單里所有內容被清空了

          文件上傳

          <input type="file">
          <form>
              <input type="file">
          </form>

          10.3 多行文本框

          <textarea name="文本名稱" cols="列數" rows="行數"></textarea>
          <form>
              <textarea name="文本名稱" cols="1" rows="2"></textarea>
          </form>

          10.4 下拉列表

          <select>
              <option>選項內容</option>
              <option>選項內容</option>
          </select>

          下拉列表標簽是為了節省頁面空間

          select標簽屬性

          屬性名

          說明

          name

          數據提交后端所需字段

          size

          下拉選項顯示個數

          multiple

          默認只允許選一個,選多個得加這個屬性

          disabled

          所有下拉選項禁止選中

          <form>
              <select name="age" size="4" multiple="multiple" disabled="disabled">
                  <option>18歲以下</option>
                  <option>18-28歲</option>
                  <option>28-38歲</option>
                  <option>38歲以上</option>
              </select>
          </form>

          option標簽屬性

          屬性名

          說明

          selected

          默認選中

          value

          被選中,數據提交后端的值

          disabled

          該下拉選項禁止選中

          <form>
              <select name="age" size="5">
                  <option value="1">18歲以下</option>
                  <option value="2" disabled="disabled">18-28歲</option>
                  <option value="3" selected="selected">28-38歲</option>
                  <option value="4">38歲以上</option>
              </select>
          </form>

          11 框架標簽

          <iframe src="URL" width="數值" height="數值"></iframe>

          框架標簽常用屬性

          屬性名

          說明

          src

          嵌入的文檔地址

          width

          標簽寬度

          height

          標簽高度

          <iframe src="https://www.bilibili.com" width="300" height="200"></iframe>

          有些文檔禁止被嵌入

          12 標簽類型

          HTML標簽分為三種,行內標簽、塊級標簽和行內塊級標簽。

          12.1 行內標簽

          特點:

          1、在頁面內只占據剛好能包裹自己內容的空間

          2、沒有寬高,內容多大就多大,行內標簽不能嵌套塊級標簽(a標簽除外)

          3、行內標簽設置寬高無效,可以對行高line-height進行設置

          4、可以設置外邊距margin和內邊距padding,但只對左右邊距有效果,上下無效

          5、常見行內標簽span、a、strong、ins、del、br等

          span標簽

          雙標簽,行內標簽,本身沒有固定樣式

          <p>我是<span>中國人</span></p>

          12.2 塊級標簽

          特點:

          1、獨占一行

          2、高度、寬度、外邊距、內邊距都可以設置生效

          3、寬度默認是父級寬度的100%

          4、是一個容器盒子,可以嵌套多層子級行內標簽、塊級標簽,文本類塊級標簽除外

          5、常見塊級標簽div、p、h1~h6、ol、ul、li等

          div標簽

          雙標簽,塊級標簽,本身沒有固定樣式

          <!-- 頭部區域 -->
          <div></div>
          <!-- 內容區域 -->
          <div></div>

          12.3 行內塊級標簽

          特點

          1、在頁面內只占據剛好能包裹自己內容的空間

          2、高度、寬度、外邊距、內邊距都可以設置生效

          3、常見塊級標簽img、input、td

          12.4 標簽類型轉換

          通過css樣式display屬性轉換,這是css的內容

          文出處:

          Stack Overflow

          https://stackoverflow.com/questions/2053258/how-do-i-output-html-in-a-message-in-the-new-django-messages-framework

          原文標題:

          How do I output HTML in a message in the new Django messages framework?


          問題:

          我正在嘗試通過Django的消息框架顯示一條信息,這條信息中包含了一些HTML內容。具體來說,我使用ModelAdmin.message_user方法發送消息,這個方法僅僅是對messages()的薄封裝:

          到目前為止,我嘗試了很多方法,但最后都顯示轉義后的HTML。

          上面的這段代碼行不通,下面的代碼也不行。

          base.html模板里的代碼非常簡單:

          所以我不太確定我做錯了什么。

          非常感謝您的意見或指導,謝謝!


          回答:

          該回答獲得最多的59個贊。

          另一種選擇是使用extra_tags關鍵字參數,用以表明該信息是安全的。例如:

          然后利用模板邏輯來使用safe filter。


          By Django的那些事兒

          何謂轉義?就是把html語言的關鍵字過濾掉。例如,<div>就是html的關鍵字,如果要在html頁面上呈現<div>,其源代碼就必須是&lt;div&gt;

          Django在默認情況下會自動轉義html關鍵字。如果不想轉義可以使用safe filter,還有autoescape tag。


          主站蜘蛛池模板: 中文字幕乱码人妻一区二区三区| 中文字幕一区二区三区日韩精品| 无码AV动漫精品一区二区免费| 福利一区二区三区视频午夜观看| 精品成人av一区二区三区| 国产一区二区三区在线影院 | 国产成人高清亚洲一区久久| 一区二区三区在线播放视频| 国产精品日本一区二区在线播放| 91在线看片一区国产| 激情久久av一区av二区av三区| 福利一区福利二区| 久久久久人妻精品一区二区三区 | 亚洲AV无码一区二区三区在线 | 国产麻豆精品一区二区三区| 日韩经典精品无码一区| 久久免费区一区二区三波多野| 国模无码一区二区三区| 国产免费伦精品一区二区三区| 亚洲av色香蕉一区二区三区| 精品乱人伦一区二区三区| 亚洲av综合av一区| 日本福利一区二区| 亚洲AV色香蕉一区二区| 亚洲日韩AV无码一区二区三区人 | 亚洲码一区二区三区| 国产一区二区三区免费在线观看| 亚洲AV色香蕉一区二区| 免费人人潮人人爽一区二区| 91久久精品一区二区| 国产vr一区二区在线观看| 日韩精品无码一区二区三区不卡 | 人妻免费一区二区三区最新| 日韩精品电影一区亚洲| 国产高清视频一区二区| 中文字幕在线播放一区| 精品欧洲av无码一区二区三区| asmr国产一区在线| 人妻夜夜爽天天爽一区| 无码人妻精品一区二区三区久久| 成人免费视频一区|