tatic 是我們日常生活中經常用到的關鍵字,也是 Java 中非常重要的一個關鍵字,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 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 修飾的內部類,靜態內部類可以包含靜態成員,也可以包含非靜態成員,但是在非靜態內部類中不可以聲明靜態成員。
靜態內部類有許多作用,由于非靜態內部類的實例創建需要有外部類對象的引用,所以非靜態內部類對象的創建必須依托于外部類的實例;而靜態內部類的實例創建只需依托外部類;
并且由于非靜態內部類對象持有了外部類對象的引用,因此非靜態內部類可以訪問外部類的非靜態成員;而靜態內部類只能訪問外部類的靜態成員;
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 所修飾的屬性和方法都屬于類的,不會屬于任何對象;它們的調用方式都是 類名.屬性名/方法名,而實例變量和局部變量都是屬于具體的對象實例。
首先,先來認識一下 JVM 的不同存儲區域。
static 變量的生命周期與類的生命周期相同,隨類的加載而創建,隨類的銷毀而銷毀;普通成員變量和其所屬的生命周期相同。
我們知道,序列化的目的就是為了 把 Java 對象轉換為字節序列。對象轉換為有序字節流,以便其能夠在網絡上傳輸或者保存在本地文件中。
聲明為 static 和 transient 類型的變量不能被序列化,因為 static 修飾的變量保存在方法區中,只有堆內存才會被序列化。而 transient 關鍵字的作用就是防止對象進行序列化操作。
我們前面提到了類加載順序這么一個概念,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 可以和單例模式完全匹配。
下面是一個經典的雙重校驗鎖實現單例模式的場景
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 在進行第一次判空后,也會進行實例化過程,此時仍然會創建多個對象。
這個問題我相信大部分小伙伴都沒有考慮過,在 Java 編程思想中有這么一句話 類的構造器雖然沒有用 static 修飾,但是實際上是 static 方法,但是并沒有給出實際的解釋,但是這個問題可以從下面幾個方面來回答
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 | 網頁交互 |
HTML,超文本標記語言(Hyper Text Markup Language),是一門描述性語言。標記,標簽,元素,叫法不同,意思相同。HTML超文本標記語言主要通過標簽的方式,對網頁頁面的文本、圖片、音頻、視頻等內容進行描述。學習HTML,就是學習各種標簽,來搭建網頁的結構。
結構:!DOCTYPE
說明:作用是告訴瀏覽器用哪個文檔規范來解析文檔
標簽:html
說明:用于搭建HTML網頁文檔結構和網頁布局
?標簽:head
說明:用于定義HTML網頁文檔的頭部,它是所有頭部元素的容器?
?標簽:body
說明:用來定義HTML網頁文檔的主體區域?
?標簽:meta
說明:用來描述HTML網頁文檔的屬性?
?標簽:title
說明:用來放到HTML網頁文檔的頭部,是搜索引擎首要抓取的目標代碼?
標簽,也叫作標記,是由一對尖括號<>,里面包含單詞組成
<html></html>
<br>
嵌套關系
<html>
<head>
</head>
</html>
并列關系
<head>
</head>
<body>
</body>
注釋用來幫助程序員記錄程序設計方法,輔助程序閱讀
雙標簽,定義網頁的標題
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>百度一下,你就知道了</title>
</head>
<body>
</body>
</html>
是單標簽,用來描述HTML網頁文檔的屬性
屬性值 | 說明 |
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、屬性沒有先后順序之分
屬性值 | 說明 |
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>
是雙標簽,用來定義標簽的css樣式
<!DOCTYPE html>
<html lang="en">
<head>
<style type="text/css">
/* css內聯樣式寫這里 */
</style>
</head>
<body>
</body>
</html>
是單標簽,是用來引入外部css樣式文件
<link rel="stylesheet" href="css/index.css" type="text/css">
是雙標簽,是用來寫JavaScript代碼的地方
<!DOCTYPE html>
<html lang="en">
<head>
<script>
/* 這里寫JavaScript代碼 */
</script>
</head>
<body>
</body>
</html>
是單標簽,是用來設置整個網頁的基礎路徑。
<!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標簽內的
是雙標簽,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>在一個頁面最多只能有一個,不要用多個
是雙標簽,p是paragraph的縮寫
<p>這是一段文字</p>
<p>這是一段文字</p>
<p>這是一段文字</p>
特點:
1、獨占一行
2、段落與段落之間,存在間隙
是單標簽,br是break的縮寫
<p>這是一段<br>文字</p>
特點:
1、強制換行
2、單標簽
是單標簽,hr是horizon地平線的縮寫
<p>這是一段文字</p>
<hr>
<p>這是一段文字</p>
特點:
1、在頁面中顯示一條水平線
2、單標簽
標簽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所在列標簽
sup是superscripted這個單詞的縮寫
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
a<sup>2</sup>
</body>
</html>
sub是subscripted這個單詞的縮寫
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
H<sub>2</sub>O
</body>
</html>
在網頁中展示特殊符號效果時,需要使用字符實體替代
顯示結果 | 描述 | 實體名稱 |
空格 |
| |
< | 小于號 | < |
> | 大于號 | > |
& | 與 | & |
" | 雙引號 | " |
x | 乘號 | × |
÷ | 除號 | ÷ |
- | 長破折號 | — |
| | 豎線 | | |
‘ | 左單引號 | ‘ |
‘ | 右單引號 | ’ |
? | 版權符 | © |
? | 注冊商標 | ® |
? | 商標 | ™ |
° | 度 | ° |
<img src="./001.jpg" alt="">
img標簽常見屬性:
屬性名 | 說明 |
src | 圖片路徑(絕對路徑、相對路徑) |
alt | 圖片加載失敗時,顯示的文字 |
title | 鼠標懸停時,顯示的文字 |
width | 圖片寬度 |
height | 圖片高度 |
只設置寬或高,會自動等比縮放,寬高只需要數字,不需要'px'
<img src="./001.jpg" alt="圖片加載失敗" title="這是程序兔" width="200" height="200">
絕對路徑:指目錄下的絕對位置,比如從根目錄開始的路徑,或完整的網絡地址
相對路徑:從當前文件開始出發找目標文件的過程
<audio src="music.mp3" controls autoplay loop></audio>
audio標簽常見屬性:
屬性名 | 說明 |
src | 音頻路徑 |
controls | 顯示播放控件 |
autoplay | 自動播放 |
loop | 循環播放 |
支持mp3、wav、ogg三種音頻格式
<video src="video.mp4" controls loop autoplay></video>
屬性名 | 說明 |
src | 視頻路徑 |
controls | 顯示播放控件 |
autoplay | 自動播放 |
loop | 循環播放 |
支持mp4、webm、ogg三種視頻格式
超鏈接,是雙標簽,實現各個獨立頁面之間進行跳轉,可以跳去站外也可以在站內之間跳轉
<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
<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>
<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>
<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>
<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>
屬性名 | 屬性值 | 描述 |
border | 數字 | 邊框寬度 |
width | 數字 | 表格寬度 |
height | 數字 | 表格高度 |
<table border="1" width="200" height="50">
<tr>
<td>1</td>
</tr>
</table>
<caption>標題內容</caption>,位于表格內第一行
<table border="1" width="200" height="50">
<caption>數字</caption>
<tr>
<td>1</td>
</tr>
</table>
<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>
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>
屬性名 | 屬性值 | 說明 |
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>
雙標簽,包裹其它表單標簽
<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>
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>
<textarea name="文本名稱" cols="列數" rows="行數"></textarea>
<form>
<textarea name="文本名稱" cols="1" rows="2"></textarea>
</form>
<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>
<iframe src="URL" width="數值" height="數值"></iframe>
框架標簽常用屬性
屬性名 | 說明 |
src | 嵌入的文檔地址 |
width | 標簽寬度 |
height | 標簽高度 |
<iframe src="https://www.bilibili.com" width="300" height="200"></iframe>
有些文檔禁止被嵌入
HTML標簽分為三種,行內標簽、塊級標簽和行內塊級標簽。
特點:
1、在頁面內只占據剛好能包裹自己內容的空間
2、沒有寬高,內容多大就多大,行內標簽不能嵌套塊級標簽(a標簽除外)
3、行內標簽設置寬高無效,可以對行高line-height進行設置
4、可以設置外邊距margin和內邊距padding,但只對左右邊距有效果,上下無效
5、常見行內標簽span、a、strong、ins、del、br等
span標簽
雙標簽,行內標簽,本身沒有固定樣式
<p>我是<span>中國人</span></p>
特點:
1、獨占一行
2、高度、寬度、外邊距、內邊距都可以設置生效
3、寬度默認是父級寬度的100%
4、是一個容器盒子,可以嵌套多層子級行內標簽、塊級標簽,文本類塊級標簽除外
5、常見塊級標簽div、p、h1~h6、ol、ul、li等
div標簽
雙標簽,塊級標簽,本身沒有固定樣式
<!-- 頭部區域 -->
<div></div>
<!-- 內容區域 -->
<div></div>
特點
1、在頁面內只占據剛好能包裹自己內容的空間
2、高度、寬度、外邊距、內邊距都可以設置生效
3、常見塊級標簽img、input、td
通過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。
何謂轉義?就是把html語言的關鍵字過濾掉。例如,<div>就是html的關鍵字,如果要在html頁面上呈現<div>,其源代碼就必須是<div>
Django在默認情況下會自動轉義html關鍵字。如果不想轉義可以使用safe filter,還有autoescape tag。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。