JSP:Java Server Page SUN 公司提供的動態網頁編程技術,是 Java Web 服務器端的動態資源。html
它相比 html 而言,html 只能爲用戶提供靜態數據,而 Jsp 技術容許在頁面中嵌套 java 代碼,爲用戶提供動態數據。前端
相比 servlet 而言,servlet 很難對數據進行排版,而 jsp 除了能夠用 java 代碼產生動態數據的同時,也很容易對數據進行排版。java
不論是 JSP 仍是 Servlet,雖然均可以用於開發動態 web 資源。但因爲這 2 門技術各自的特色,在長期的軟件實踐中,人們逐漸把 servlet 做爲 web 應用中的控制器組件來使用, 而把 JSP 技術做爲數據顯示模板來使用。web
其實 Jsp 就是一個 Servlet,當咱們第一次訪問 Jsp 的時候,Jsp 引擎都會將這個 Jsp 翻譯 成一個 Servlet,這個文件存放在tomcat(源碼目錄) 中的 work 目錄中。express
這一步不是必須的,固然因爲 編輯器中有些默認的配置項咱們以爲不是很完美,好比"編碼格式"、頁面模板等。咱們能夠在新建 JSP 頁面以前就先修改成咱們須要的。編程
1.選擇"File" —> "Settings..."小程序
2.設置編碼格式。搜索"encode",選擇"File Encoding"瀏覽器
[tomcat
3.設置頁面模板。搜索"template",選擇"File and Code Templates",選擇右側的"Other",選擇下方的"Jsp File"服務器
在 JSP 中支持兩種註釋的語法操做:
一種是顯示註釋,這種註釋是容許客戶端看見的; 另外一種是隱式註釋,此種註釋是客戶端沒法看見的
① 顯示註釋語法:從 HTML 風格繼承而來
② 隱式註釋語法:從 JAVA 風格繼承;JSP 本身的註釋
JSP 的三種註釋方式:
1) // 註釋,單行註釋 /* 多行註釋*/ 2)<!-- HTML風格的註釋 --> 3)<%-- JSP註釋 --%>
在 JSP 中最重要的部分就是 Scriptlet(腳本小程序),全部嵌入在 HTML 代碼中的 Java 程序。
在 JSP 中一共有三種 Scriptlet 代碼:都必須使用 Scriptlet 標記出來
第一種:<% %>: java 腳本段,能夠定義局部變量、編寫語句 第二種:<%! %>:聲明,能夠定義全局(成員)變量、方法、類 第三種:<%= %>:表達式,數據一個變量或具體內容
經過觀察解析爲 java 文件的 jsp 代碼理解三種小腳本
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Scriptlet</title> </head> <body> <% String str = "Hello JSP"; System.out.println(str); response.getWriter().write(str); %> <%! String memberStr = "a member String"; %> <%=memberStr%> <h1>This is a JSP page!!</h1> </body> </html>
使用包含操做,能夠將一些重複的代碼包含進來繼續使用,從正常的頁面組成來看,有時可能分爲幾個區域。而其中的一些區域多是一直不須要改變的,改變的就其中的一個具體內容區域。如今有兩種方法能夠實現上述功能。
方法一:在每一個 JSP 頁面(HTML)都包含工具欄、頭部信息、尾部信息、具體內容
方法二:將工具欄、頭部信息、尾部信息都分紅各個獨立的文件,使用的時候直接導入
很明顯,第二種方法比第一種更好,第一種會存在不少重複的代碼,而且修改很不方便,在 JSP 中若是要想實現包含的操做,有兩種作法:靜態包含、動態包含,靜態包含使用 include 指令便可,動態包含則須要使用 include 動做標籤。
<%@ include file="要包含的文件路徑" %> <!-- 相對路徑 -->
例如:
<%@include file="include.jsp" %> 或 <%@include file="include.html" %>
靜態包含就是將內容進行了直接的替換,就比如程序中定義的變量同樣,是在 servlet 引擎轉譯時,就把此文件內容包含了進去(兩個文件的源代碼整合到一塊兒, 所有放到_jspService 方法中),因此只生成了一個 servlet,因此兩個頁面不能有同名的變量。 運行效率高一點點。耦合性較高,不夠靈活。
動態包含在代碼的編譯階段,包含和被包含部分是兩個獨立的部分,只有當運行時,纔會動態包含進來,比如方法的調用。
<jsp:include page="include.jsp"></jsp:include>
注意:動態包含,中間不要加任何內容,包括空格,除非確認要使用參數,不然報錯!
<jsp:include page="include.html"></jsp:include> <% String a = "hello.jsp"; %> <jsp:include page="<%=a %>"></jsp:include>
使用動態包含還能夠經過在頁面之間傳參。
接收參數經過 request.getParameter(name);
<jsp:include page="hello.jsp" flush="true"> <jsp:param name="uname" value="zhangsan"/> </jsp:include>
hello.jsp
<!-- 接收參數 --> <%=request.getParameter("uname")%>
在JSP中提供了四種屬性的保存範圍,所謂的屬性保存範圍,指的就是一個設置的對象,能夠再多少個頁面中保存並能夠繼續使用
page範圍
pageContext : 只在一個頁面中保存屬性,跳轉以後無效
request範圍
request : 只在一次請求中保存,服務器跳轉後依然有效
session範圍
session : 在一次會話範圍中,不管何種跳轉均可以使用
application範圍
application : 在整個服務器上保存
方法 | 類型 | 描述 |
---|---|---|
public void setAttribute(String name, Object o) | 普通 | 設置屬性的名稱及內容 |
public Object getAttribute(String name) | 普通 | 根據屬性名稱取屬性 |
public void removeAttribute(String name) | 普通 | 刪除指定的屬性 |
本頁面取得,服務器端跳轉(<jsp :forward>)後無效
request
服務器跳轉有效,客戶端跳轉無效
若是是客戶端跳轉,則至關於發出了兩次請求,那麼第一次的請求將不存在了;若是但願不論是客戶端仍是服務器跳轉,都能保存的話,就須要繼續擴大範圍。
session
不管客戶端仍是服務器端均可以取得,可是如今從新開啓一個新的瀏覽器,則沒法取得以前設置的session了,由於每個session只保存在當前的瀏覽器當中,並在相關的頁面取得。
對於服務器而言,每個鏈接到它的客戶端都是一個session
若是想要讓屬性設置一次以後,不論是否是新的瀏覽器打開都能取得則可使用application
application
全部的application屬性直接保存在服務器上,全部的用戶(每個session)均可以直接訪問取得
只要是經過application設置的屬性,則全部的session均可以取得,表示公共的內容,可是若是此時服務器重啓了,則沒法取得了,由於關閉服務器後,全部的屬性都消失了,因此須要從新設置。
問:使用哪一個範圍呢?
答:<font color="red">在合理範圍儘量小</font>
EL(Expression Language) 是爲了使 JSP 寫起來更加簡單。表達式語言的靈感來自於 ECMAScript 和 XPath 表達式語言,它提供了在 JSP 中簡化表達式的方法,讓 Jsp 的代碼更加簡化。
語法結構很是簡單: ${expression}
EL 表達式通常操做的都是<font color="red">域對象中的數據</font>,操做不了局部變量。
域對象的概念在 JSP 中一共有四個:pageContext, request, session, application;範圍依次是,本頁面,一次請求, 一次會話,整個應用程序。
當須要指定從某個特定的域對象中查找數據時可使用四個域對象對應的空間對象,分別是:pageScope, requestScope, sessionScope, applicationScope。
而 EL 默認的查找方式爲從小到大查找,找到便可。當域對象全找完了還未找到則返回空字符串""。
設置域對象中的數據
<% pageContext.setAttribute("uname","zhangsan"); // page做用域 request.setAttribute("uname","lisi"); // request做用域 session.setAttribute("uname","wangwu"); // session做用域 application.setAttribute("uname","zaholiu"); // application %>
獲取域對象的值
<%-- 獲取域對象中的數據:默認查找方式爲從小到大,找到即止。若四個範圍都未找到,則返回空字符串。--%> ${uname} <!-- 輸出結果爲:zhangsan -->
獲取指定域對象的值
${pageScope.uname} <!-- page做用域 --> ${requestScope.uname} <!-- request做用域 --> ${sessionScope.uname} <!-- session做用域 --> ${applicationScope.uname} <!-- application做用域 -->
獲取List
<% List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); request.setAttribute("list", list); %>
<%-- 獲取List中指定下標的數據 ${list[下標] } 獲取集合的長度 ${list.size()} 注: list表明的是存在域對象中的變量名(限域變量名) --%> ${list[1] }
獲取Map
<% Map map = new HashMap(); map.put("aaa", "111"); map.put("bbb", 2222); map.put("ccc-a", 333); request.setAttribute("map", map); %>
<%-- 獲取Map中指定值 ${map["key"] } 或 ${map.key } 注: map表明的是存在域對象中的變量名(限域變量名) --%> ${map.aaa } ${map["bbb"]}
獲取JavaBean對象
User.java
public class User { private Integer userId; private String uname; private String upwd; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpwd() { return upwd; } public void setUpwd(String upwd) { this.upwd = upwd; } }
<% User user = new User(); user.setUserId(1); user.setUname("zhangsan"); user.setUpwd("123456"); request.setAttribute("user",user); %>
<%-- JavBean中的屬性字段須要提供get方法 --%> ${user} <%-- 獲取對象 --%> ${user.uname} <%--獲取對象中的屬性--%>
<%-- empty 判斷域對象是否爲空。爲空,返回true;不爲空返回false; ${empty 限域變量名 } 判斷對象是否不爲空。 ${!empty 限域變量名 } --%> ${empty uname} ${empty list} ${empty map} ${empty user}
<% request.setAttribute("a", 10); request.setAttribute("b", 2); request.setAttribute("c", "aa"); request.setAttribute("d", "bb"); %>
等值判斷
<%-- 比較兩個值是否相等,返回true或false == 或 eq --%> ${a == b } ${c == d } ${c eq d } ${a == 5 } ${c == 'aa' }
算術運算
<%-- 加法: + 減法: - 乘法: * 除法: / 或 div --%> ${a + b } ${a / b } 或 ${a div b }
大小比較
<%-- 大於:> 小於:< 大於等於:>= 小於等於:<= --%> ${a > b} ${a + 1 > 10 } ${a + b >= 10 } ${a > b && b > 5 } ${a + b > 10 || a - b > 5 }
想要更多Java,前端,大數據,微服務等資料<a href="https://i.loli.net/2020/06/22/zbPOtKIqDjo45Mw.png">點我掃碼領取</a>;