2020年_Jsp Jstl 学习笔记
2020年_Jsp & Jstl 筆記
servlet
每創建/修改一個servlet,都要重新部署一遍項目。(修改Jsp不需要,支持熱更新)
@WebServlet(name = "ServletDemo",value="/scope") //value的值是路徑一、Jsp的腳本
普通腳本
<% %>所有Java語句都可以在里面書寫,除了函數語句。
聲明腳本
<%! %>-
聲明腳本聲明的變量是全局變量
-
聲明腳本的內容必須在普通腳本<% %>中調用
-
如果聲明腳本中的函數具有返回值,使用輸出腳本調用<%= %>
輸出腳本
<%= %>后面可以寫函數,但是必須有返回值,結尾不需要加分號。
Jsp注釋
<%-- 注釋的內容 --%> // 不會輸出,甚至不會被編譯當然也可以直接使用html注釋
<!-- 這是一條注釋 --> // 這個注釋在頁面中通過 F12能看到Jsp指令
JSP指令用來設置與整個Jsp頁面相關的屬性。
Page指令
語法 <% @page attribute1=“value1” attribute2=“value2” %>
| contentType | 指定當前Jsp頁面的MIME類型和字符編碼格式 |
| errorPage | 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面 |
| isErrorPage | 指定當前頁面是否作為寧一個Jsp頁面的錯誤處理頁面 |
| import | 導入要使用的Java類 |
| language | 定義JSP頁面所用的腳本語言,默認是Java |
| session | 制定Jsp頁面是否使用session。默認為true則立即創建,false為使用時創建 |
Include指令
- 語法: <%@ include file= “被包含的JSP路徑”
- 被包含的文件可以使JSP文件、html文件或者文本文件,包含的文件就好是當前JSP文件的一部分,會被同時編譯執行(靜態包含)。
- 注意可能會出現 重名的問題,不建議使用
動作標簽
- 語法:<jsp:action name attribute=“value”/>
- 動作標簽指的是 jsp頁面在運行期間的命令
include(動作標簽)
- 語法:< jsp:include page=“相對URL地址”/>
- <jsp:include > 動作元素會將外部文件輸出的結果包含在jsp中(動態包含)
- 注意: 前面已經介紹過include指令,它是將外部文件的輸出代碼復制到當前Jsp文件中,而這里的jsp:include動作不同,是將外部文件的輸出結果引入到了當前Jsp文件中。
useBean(注冊對象)
- 語法 <jsp:useBean id=“name” class=“package.className” />
- jsp:useBean 動作用來加載一個將在JSP頁面中使用的JavaBean。
| id | 必須,對象的名字 |
| class | 必須,全限定名 |
-
在類載入后,我們可以通過jsp:setProperty 和 jsp:getProperty動作來修改和獲取bean的屬性。
-
在創建類的時候,屬性要全部私有化,必須含有getter and setter、無參構造方法 和 有參構造方法
setProperty
可以在jsp:useBean元素之后使用jsp:setProperty進行屬性的賦值
| name | 必須,用來指定設置屬性的是哪個bean |
| property | 必須,表示要設置哪個屬性 |
| value | value屬性是可選的。該屬性用來指定Bean屬性的值 |
getProperty
jsp:getProperty動作提取指定Bean屬性的值,轉換成字符串,然后輸出。
| name | 要檢索的Bean屬性名稱。Bean必須已定義。 |
| property | 表示要提取Bean屬性的值 |
forward
- 語法:< jsp:forwar page=“相對URL”
- jsp:forward 動作把請求轉到另外的頁面。
| page | page屬性包含的是一個相對url地址 |
forward
- 語法: <jsp:param name="" value="" />
- 在轉發動作的內部使用,作為參數傳遞
內置對象
由JSP自動創建的對象,可以直接使用,九大內置對象。
四大域對象
JSP有四大作用域對象,存儲數據和獲取數據的方式一樣,不同的是取值的范圍有差別
- pageContext(javax.servlet.jsp.PageContext) 當前JSP頁面范圍
- request(javax.servlet.http.HttpServletRequest) 一次請求有效
- session(javax.servlet.http.HttpSession) 一次會話有效(關閉瀏覽器失效)
- application(javax.servlet.ServletContext) 整個web應用有效(服務器重啟或關閉失效)
pageContext對象
- pageContext對象是javax.servlet.jsp.PageContext類的實例,擁有作用域,用來代表整個Jsp頁面。
- 當前頁面的作用域對象,一旦跳轉則失效
- 通過setAttribute(“name”,“value”)存儲值
- 通過getAttribute(“name”) 獲取值
- 用于獲取其他8個內置對象或者操作其他對象的作用域
pageContext獲取其他內置對象
<%pageContext.getRequest();pageContext.getResponse();pageContext.getSession();pageContext.getServletConfig();pageContext.getServletContext();pageContext.getOut();pageContext.getException();pageContext.getPage();%>pageContext操作其他作用域
pageContext.setAttribute("page","123"); pageContext.setAttribute("req","aaa",PageContext.REQUEST_SCOPE); pageContext.setAttribute("session","bbb",PageContext.SESSION_SCOPE); String req = (String) request.getAttribute("req"); String session = (String) session.getAttribute("sess"); String sess = (String) session.getAttribute("sess"); String app = (String) qpplication.getAttribute("app"); // 全能王 String result = (String) pageContext.findAttribute("req"); // 它會依次查找 pageContext 、 request 、session 、 application // 如果查找到了,它就直接返回二、EL表達式(express Language)
2.1 概念
EL使JSP寫起來更簡潔。主要用于獲取作用域中的數據
2.2 作用
用于替換作用域對象getAttribute(“name”)
2.3 應用
- ${scope.name } 獲取具體某個作用域中的數據
- ${name} 獲取作用域中的數據,逐級查找 pageContext、request、session、application
2.4.1 EL案例
<%request.setAttribute("name","tom");request.setAttribute("age","18"); %> ${requestScope.name} ${name} // 從最小作用域逐級查找,找不到則返回“”2.4.2 EL和JSP腳本的區別
- <%= request.getAttribute() %> // 沒有找到返回null
- ${requestScope.name} // 沒有找到返回“”
2.5 EL獲得引用對象
使用 .成員變量名方式訪問,或者arr[i]來訪問,或者使用get方法
<% Emp e = new Emp();e.setName("gavin");e.setAge("19");request.setAttribute("e",e); %> ${requestScope.e.name}2.6 EL的empty運算符
用于測試數值是否為空值
<%request.setAttribute("aaa","");request.setAttribute("bbb",null);%>${empty aaa} //true${empty bbb} //true2.7 隱式對象
2.7.1 獲取應用上下文
<%=request.getContextPath()%>${pageContext.request.contextPath}2.7.2 獲取Cookie對象
${cookie.name.value}<br> ${cookie.pass.value} <hr/> <%-- 使用傳統方法 --%> <% Cookie[] cookies = request.getCookies(); String username = ""; String pass = ""; if (cookies != null){for (Cookie cookie : cookies){if (cookie.getName().equals("name")){username=cookie.getValue();}if (cookie.getName().equals("pass")){pass = cookie.getValue();}} } %> <%=username%><%=pass %>六、JSTL標準標簽庫
6.1 現有問題
- EL主要是用于作用域獲取數據,雖然可以做運算判斷,但是得到的都是一個結果,作展示。
- EL不存在流程控制。比如判斷
- EL對于集合智能做單點訪問,不能實現遍歷操作。
6.2 什么是JSTL?
- JSTL:全稱Java Server Pages Standard Tag Liabrary
- JSP標準標簽庫(JSTL)是一個JSP標簽機和。
6.3 JSTL的作用
- 可對EL獲取到的數據進行邏輯操作。
- 與EL合作完成數據的展示。
6.4 JSTL使用
- 導入兩個jar文件:stardard.jar 和 jstl.jar 文件拷貝到/WEB-INF/lib/下
- 在JSP頁面引入標簽庫 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
6.5 核心標簽
6.5.1 條件標簽if判斷
語法: <c:if test=“條件”> < /c:if >
<% pageContext.setAttribute("username","jerry"); pageContext.setAttribute("age",1000); %><c:if test="${username eq 'tom'}"><h1>歡迎訪問,${username}</h1> </c:if><c:if test="${username != 'tom'}"><h1>請重新登錄</h1> </c:if>6.5.2 多條件choose判斷
語法:< c:choose>
? <c:when test=“條件1”> 結果1 < /c:when>
? <c:when test=“條件2”> 結果2 < /c:when>
? <c:otherwise > 結果4 </c:otherwise >
? < /c:choose>
<c:choose><c:when test="${age<=18}"><h1>青年</h1></c:when><c:when test="${age<=30}"><h1>中年</h1></c:when><c:when test="${age<=80}"><h1>老年</h1></c:when><c:otherwise><h1>修仙者</h1></c:otherwise> </c:choose>6.5.3 迭代foreach標簽
語法
<c:foreach
? var=“變量名”
? items=“集合”
? begin=“起始下標”
? end=“結束下標”
? step=“間隔長度”
? varstatus=“遍歷狀態” > //very important
< /c:foreach>
<% List<Person> persons = new ArrayList<Person>(); persons.add(new Person("tom","18")); persons.add(new Person("jerry","18")); persons.add(new Person("alice","18")); persons.add(new Person("mike","18")); request.setAttribute("persons",persons); %><c:forEach var="item" items="${persons}" begin="0" end="2" step="1" varStatus="i">${item.name} - ${item.age} - ${i.first} - ${i.last} - ${i.count} - ${i.index}<br> </c:forEach>特別標注:forEach循環無法主動停止。如果想執行某些操作后停止循環,
可以采用以下方式不執行循環里的操作。
<c:set var="exitId" value="0"/> //set 變量 <c:forEach var="element" items="${reserveArr}" varStatus="vs"> <c:if test="${exitId eq '0' && item.bookId eq element}"> <a href="${baseUrl}/user/book/cancel?username=${u.username}&bid=${item.bookId}"><button type="button" class="btn btn-default">取消預定</button></a><c:set var="exitId" value="1"/> // 完成循環目的后,停止循環, set 變量等于1 </c:if> <c:if test="${exitId eq '0' && vs.last && item.bookId ne element}"><a href="${baseUrl}/user/book/reserve?username=${u.username}&BookId=${item.bookId}"><button type="button" class="btn btn-primary">提前預定</button></a><c:set var="exitId" value="1"/> </c:if> </c:forEach> <c:set var="exitId" value="0"/> //值恢復成原來的6.5.4 url標簽
在Cookie禁用的情況下,通過重寫URL拼寫JESSIONID來傳遞ID值。便于下一次訪問時可查找到上一次的Session對象。(如果Cookie沒有被禁用url就不會被禁止)
<%-- 當指定 var屬性后,就不會渲染到頁面中,而是可以通過${} 進行訪問 --%> <c:url context="${pageContext.request.contextPath}" value="/user/book.jsp" var="lianjie"/> <a href="<c:url context='${pageContext.request.contextPath}' value='/user' />">鏈接</a> <a href="${lianjie}">鏈接</a>- 經驗: 所有涉及到鏈接的都應該使用url重寫機制。
MVC架構
總結
以上是生活随笔為你收集整理的2020年_Jsp Jstl 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【3分钟掌握】什么是DNS解析
- 下一篇: 重学C语言_数据结构与基础语法