swagger依賴和配置類
技術標籤:Java Web
目錄
一、EL表示式簡介
- EL 表示式的全稱:Expression Language。是表示式語言。
- EL 表示式的作用:EL 表示式主要是代替 jsp 頁面中的表示式指令碼在 jsp 頁面中進行資料的輸出。因為 EL 表示式在輸出資料的時候,要比 jsp 的表示式指令碼要簡潔很多。
- EL表示式的語法格式:${表示式}。EL 表示式在輸出 null 值的時候,輸出的是空串。jsp 表示式指令碼輸出 null 值的時候,輸出的是 null 字串。
二、EL表示式獲取資料
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>EL表示式簡介</title> </head> <body> <% request.setAttribute("userName", "root"); %> JSP表示式輸出userName:<%= request.getAttribute("userName") %><br /> JSP表示式輸出password:<%= request.getAttribute("password") %><br /> EL表示式輸出userName:${userName }<br /> EL表示式輸出password:${password }<br /> </body> </html>
1.EL 表示式搜尋域資料的順序
EL 表示式主要是在 jsp 頁面中輸出資料。主要是輸出域物件中的資料。當四個域中都有相同的 key 的資料的時候,EL 表示式會按照四個域的從小到大的順序去進行搜尋,找到就輸出。如下:
<body> <% pageContext.setAttribute("key", "pageContextValue"); request.setAttribute("key", "requestValue"); session.setAttribute("key", "sessionValue"); application.setAttribute("key", "applicationValue"); %> EL表示式輸出資料:${key }<br /> </body>
訪問瀏覽器結果:EL表示式輸出資料:pageContextValue
2.EL表示式獲取JavaBean的資料
2.1 JavaBean規範
- JavaBean 類必須是一個公共類,並將其訪問屬性設定為 public。
- JavaBean 類必須有一個空的建構函式:類中必須有一個不帶引數的公用構造器,此構造器也應該通過呼叫各個特性的設定方法來設定特性的預設值。
- 一個JavaBean類不應有公共例項變數,類變數都為private。
- 持有值應該通過一組存取方法(getXxx 和 setXxx)來訪問:對於每個特性,應該有一個帶匹配公用 getter 和 setter 方法的專用例項變數。若是布林值,可以用isXxx來代替getXxx。
- 成員變數的第二個字母最好不要大寫, 像rCategory, hFilename之類,生成getter 和setter會有問題。
2.2 獲取JavaBean中不同型別的資料
public class Person {
private String name;
private String[] hobbies;
private List<String> friends;
private Map<String, String> map;
public String getName() {
System.out.println("Person類的getName方法");
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getHobbies() {
System.out.println("Person類的getHobbies方法");
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public List<String> getFriends() {
System.out.println("Person類的getFriends方法");
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
public Map<String, String> getMap() {
System.out.println("Person類的getMap方法");
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Person類的toString方法";
}
}
<body>
<%
String[] hobbies = {"打籃球","下棋"};
List<String> friends = new ArrayList<String>();
friends.add("李四");
friends.add("王五");
Map<String, String> hashMap = new HashMap<>();
hashMap.put("key1", "value1");
hashMap.put("key2", "value2");
Person p = new Person();
p.setName("張三");
p.setHobbies(hobbies);
p.setFriends(friends);
p.setMap(hashMap);
pageContext.setAttribute("person", p);
%>
EL表示式輸出p物件: ${person }<br />
EL表示式輸出name成員: ${person.name }<br />
EL表示式輸出hobbies陣列的第一個元素: ${person.hobbies[0] }<br />
EL表示式輸出hobbies陣列越界的元素: ${person.hobbies[10] }<br />
EL表示式輸出firends集合: ${person.friends }<br />
EL表示式輸出firends集合的第一個元素: ${person.friends[0] }<br />
EL表示式輸出map: ${person.map }<br />
EL表示式輸出map的第一個鍵對應的值: ${person.map.key1 }<br />
</body>
瀏覽器訪問結果:
由於在JavaBean中每個成員的getter方法中都往控制檯輸出了一句話,下面為控制檯輸出:
可以看到,EL表示式獲取值其實是通過JavaBean的getter方法獲取資料。
三、EL的11個隱含物件
EL 個達式中 11 個隱含物件,是 EL 表示式中自己定義的,可以直接使用。如下:
變數 | 型別 | 作用 |
pageContext | PageContextImpl | 它可以獲取 jsp 中的九大隱含物件 |
pageScope | Map<String,Object> | 它可以獲取 pageContext 域中的資料 |
requestScope | Map<String,Object> | 它可以獲取 request 域中的資料 |
sessionScope | Map<String,Object> | 它可以獲取 session 域中的資料 |
applicationScope | Map<String,Object> | 它可以獲取 application 域(ServletContext)中的資料 |
param | Map<String,String> | 它可以獲取請求引數的值 |
paramValues | Map<String,String[]> | 它也可以獲取請求引數的值,獲取多個值的時候使用。 |
header | Map<String,String> | 它可以獲取請求頭的資訊 |
headerValues | Map<String,String[]> | 它可以獲取請求頭的資訊,它可以獲取多個值的情況 |
cookie | Map<String,Cookie> | 它可以獲取當前請求的 Cookie 資訊 |
initParam | Map<String,String> | 它可以獲取在 web.xml 中配置的<context-param>上下文引數 |
1.pageContext的使用
EL表示式中的pageContext可以獲取JSP中的九個隱含物件,JSP中的幾個物件的原型我們可以檢視其轉換後的Servlet類得知。比如JSP中的request物件就是HttpRequest物件,session就是HttpSession物件,所以我們可以呼叫其暴露出來的getter方法,而EL表示式只不過是以“.”的形式執行其getter方法。
<body>
1.獲取請求的協議: ${pageContext.request.scheme }<br />
2.獲取伺服器IP: ${pageContext.request.serverName }<br />
3.獲取伺服器埠: ${pageContext.request.serverPort }<br />
4.獲取工程路徑: ${pageContext.request.contextPath }<br />
5.獲取請求方法: ${pageContext.request.method }<br />
6.獲取客戶端 IP: ${pageContext.request.remoteHost }<br />
7.獲取會話ID: ${pageContext.session.id }<br />
</body>
瀏覽器訪問結果如下:
2.獲取四個特定域中的屬性
如果不使用EL域物件那麼其搜尋域資料的順序是由小到大的,EL提供4個域物件方便精準獲取資料。
<body>
<%
pageContext.setAttribute("key", "pageContextValue");
request.setAttribute("key", "requestValue");
session.setAttribute("key", "sessionValue");
application.setAttribute("key", "applicationValue");
%>
pageContext域中的資料: ${pageScope.key }<br />
request域中的資料: ${requestScope.key }<br />
session域中的資料: ${sessionScope.key }<br />
application域中的資料: ${applicationScope.key }<br />
</body>
瀏覽器訪問結果如下:
3.其他隱含物件的使用
獲取請求引數
<body>
<%--請求引數:?userName=123&hobby=c&hobby=java --%>
1.獲取請求引數userName的值:${param.userName }<br />
2.獲取請求引數userName的值:${paramValues.userName[0] }<br />
3.獲取請求引數hobby的值 : ${paramValues.hobby[0] }<br />
4.獲取請求引數hobby的值 : ${paramValues.hobby[1] }<br />
</body>
瀏覽器訪問結果如下:
獲取請求頭資訊
<body>
1.輸出請求頭【User-Agent】的值:${header['User-Agent'] } <br />
2.輸出請求頭【User-Agent】的值:${headerValues['User-Agent'][0] } <br />
3.輸出請求頭【Accept-Language】的值:${header['Accept-Language'] } <br />
4.輸出請求頭【Connection】的值:${header.Connection } <br />
5.輸出請求頭【Host】的值:${header.Host } <br />
</body>
瀏覽器訪問結果如下:
獲取Cookie資訊
<body>
1.獲取 Cookie 的名稱:${cookie.JSESSIONID.name } <br />
2.獲取 Cookie 的值:${cookie.JSESSIONID.value } <br />
</body>
瀏覽器訪問結果如下:
獲取web.xml中配置的值
<context-param>
<param-name>userName</param-name>
<param-value>root</param-value>
</context-param>
<body>
獲取全域性配置userName 的值:${initParam.userName } <br />
</body>
訪問結果為:root
四、EL中的運算子
1.關係運算
關係運算符 | 示例 | 結果 |
==或eq | ${5 == 5}或 ${5 eq 5} | true |
!=或ne | ${5 != 5}或 ${5 ne 5} | false |
<或lt | ${2 < 8}或 ${2 lt 8 } | true |
>或gt | ${2 > 8 }或 ${2 gt 8 } | false |
<=或 le | ${2 <= 2 }或 ${2 le 2 } | true |
>=或 ge | ${2 >= 6}或 ${2 ge 6} | false |
2.邏輯運算
邏輯運算子 | 示例 | 結果 |
&&或and | ${12 < 20 && 2 > 1}或 ${12 < 20 and 2 > 1} | true |
||或or | ${12 == 12 || 1 > 6}或 ${12 == 12 or 1 > 6} | true |
!或not | ${! true}或 ${not true} | false |
3.算數運算
算數運算子 | 示例 | 結果 |
+ | ${10 + 1} | 11 |
- | ${10 - 1} | 9 |
* | ${10 * 2} | 20 |
/或div | ${10 / 2}或 ${10 div 2} | 5 |
%或mod | ${11 % 10}或 ${11 mod 10} | 1 |
4.empty運算
empty 運算可以判斷一個數據是否為空,如果為空,則輸出 true,不為空輸出 false。
以下幾種情況為空:
- 值為 null 值的時候,為空
- 值為空串的時候,為空
- 值是 Object 型別陣列,長度為零的時候
- list 集合,元素個數為零
- map 集合,元素個數為零
5.三元運算子
表示式 1?表示式 2:表示式 3
如果表示式 1 的值為真,返回表示式 2 的值,如果表示式 1 的值為假,返回表示式 3 的值。
6."."點運算和[]中括號運算子
.點運算,可以輸出 Bean 物件中某個屬性的值。[]中括號運算,可以輸出有序集合中某個元素的值。並且[]中括號運算,還可以輸出 map 集合中 key 裡含有特殊字元的 key 的值。
<body>
<%
Map<String, String> hashMap = new HashMap<>();
hashMap.put("Accept-Language", "xxx");
hashMap.put("User-Agent", "yyy");
hashMap.put("Connection", "zzz");
pageContext.setAttribute("map", hashMap);
%>
${pageScope.map["Accept-Language"] }<br />
${pageScope.map["User-Agent"] }<br />
${pageScope.map.Connection }<br />
</body>
最後需要注意的是:EL表示式目的是替代JSP指令碼表示式可以使頁面變得整潔,方便,避免<%= %>的出現。由於JSP中Java程式碼就是寫在<%%>中的,這將導致不能與EL表示式一起使用,可以利用JSP中的各種標籤替代Java程式碼,這樣可以結合EL表示式。比如對於一些使用if判斷的java程式碼可以使用JSP標籤來代替<c:if>等。