JSP-JSTL

2020-08-09 11:01:52
<h2>尾部內容</h2>
<%
    System.out.println(request.getParameter("uname"));
    System.out.println(request.getParameter("str"));
%>

JSP和JSTL

zzj

一、JSP

1.1 JSP基本使用

1.1 簡介

JSP:java Server Page是動態網頁程式設計技術,可以使用java程式碼產生動態數據。

其實JSP就是一個servlet,第一次存取JSP的時候,JSP引擎都會講這個JSP翻譯成一個servlet,這個檔案存放在Tomcat中的work目錄中。

1.2 註釋

  1. 顯示註釋(瀏覽器中按F12能看到的註釋)

    繼承HTML風格的註釋;<!–HTML註釋-- >

  2. 隱式註釋(瀏覽器中按F12不能看到的註釋)

    a. jsp自己的註釋;<%–jsp註釋–%>

    b. 繼承java風格的註釋;//單行註釋,/ *多行註釋 */

1.3 JSP的Scriptlet指令碼小程式

  1. Java指令碼段

    可以編寫Java語句,定義區域性變數。生成的程式碼在Servlet的service方法體中。

    <%
    	// 定義區域性變數
    	int num = 100;
    %>
    
  2. 宣告

    可以宣告全域性變數、方法、類等生成的程式碼在Servlet的類體中。

    <%!
        // 全域性變數
        int b = 10;
    %>
    
  3. 輸出

    可以輸出表示式,字面量、變數。生成的程式碼在Servlet的service方法體中,相當於out.write()。

    <%=num%>
    

1.2 JSP的指令標籤

方法:將工具列、頭部資訊、尾部資訊都分成各個獨立的檔案,使用的時候直接匯入。

做法:分成多等分之後使用靜態包含、動態包含的方式。。

1.2.1 include靜態包含

特點:相當於直接內容的貼上,只會生成一個原始碼檔案,不能出現同名變數。

語法:<%@include file=「相對路徑」%>

<%@include file="02-include靜態包含02.jsp"%>
<h2>中間內容</h2>
<%=a%>
<%@include file="02-include靜態包含03.jsp"%>

1.2.2 include動態包含

特點:相當於方法的呼叫,會生成多個原始碼檔案,可以出現同名變數,同名變數按先後順序會進行覆蓋。

語法:<jsp:include page=「路徑」>< /jsp:include>

<jsp:include page="03-include動態包含02.jsp"></jsp:include>
<h2>主體內容</h2>
<%
	String str = "Hello";
%>
<%-- 傳遞參數 --%>
<jsp:include page="03-include動態包含03.jsp">
    <jsp:param name="uname" value="admin"/>
    <jsp:param name="str" value="<%=str%>"/>
</jsp:include>

注意

  1. include動態包含是雙標籤。

  2. include動態包含可以傳遞參數。

    < jsp:param name=「參數名」 value=「參數值」/> name不支援任何表達式,value支援表達式。

    參數接受:request.getParameter(name);

  3. 若沒有參數傳遞,include雙標籤中不能有任何內容。

<jsp:include page="03-include動態包含02.jsp"></jsp:include>
<h2>主體內容</h2>
<%
    String str = "Hello";
%>
<%-- 傳遞參數 --%>
<jsp:include page="03-include動態包含03.jsp">
    <jsp:param name="uname" value="admin"/>
    <jsp:param name="str" value="<%=str%>"/>
</jsp:include>
<h2>尾部內容</h2>
<%
request.getParameter("uname");//admin
request.getParameter("str");//Hello
%>

1.3 JSP的四大域物件與九大隱式物件

1.3.1 四大域物件

  1. pageContext

    只能在本頁面中獲取,頁面跳轉後無效。

  2. request

    請求轉發有效,重定向無效。

  3. session

    請求轉發和重定向都有效。瀏覽器關閉無效

  4. application

    只要伺服器不關閉都有效。

注意:儘量使用範圍小的域物件。

1.3.2 九大隱式物件

九大隱式物件中包含四大域物件。

pageContext、request、session、application、response、out(輸出流)、config(jsp的設定資訊)、page(如同java中的this)、exception (例外處理)

1.4 EL表達式

簡化了jsp程式碼。

1.4.1 獲取域物件

<%
    pageContext.setAttribute("uname","zhangsan");
    request.setAttribute("uname","lisi");
    session.setAttribute("uname","wangwu");
    application.setAttribute("uname","zaholiu");
%>

預設獲取最小範圍的數據:${uname}<br>
page作用域:${pageScope.uname}<br>
request作用域:${requestScope.uname}<br>
session作用域:${sessionScope.uname}<br>
application作用域:${applicationScope.uname}<br>

1.4.2 獲取list

根據集合的下標獲取。

<%
    List<String> list = new ArrayList<String>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("list", list);
%>
獲取集合的長度:${list.size()} <br>
獲取指定下標的值:${list[0]}<br>

1.4.3 獲取map

通過key值直接獲取。

<%
    Map map = new HashMap();
    map.put("aaa", "111");
    map.put("bbb", 2222);
    map.put("ccc-a", 333);
    request.setAttribute("map", map);
%>
獲取指定key的value:${map.aaa} -- ${map["bbb"]} <br>

1.4.4 獲取javabean

<%
    User user = new User();
    user.setUserId(1);
    user.setUname("zhangsan");
    user.setUpwd("123456");

    Student student = new Student();
    student.setId(1);
    student.setStuName("ncdx");

    user.setStudent(student);

    request.setAttribute("user",user);
%>
獲取JavaBean物件:${user} <br>
<%-- 屬性欄位必須提供get方法 --%>
獲取JavaBean物件的屬性:${user.getUname()} -- ${user.uname} -- ${user.student.stuName}<br>

1.5 empty

判斷域物件是否爲空。爲空返回true,不爲空返回false

request.setAttribute("str1","");
request.setAttribute("str2",null);
request.setAttribute("str3","Hello");

List<String> list1 = null;
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
list3.add("aaa");
list3.add("bbb");
list3.add("ccc");
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);

Map<String,String> map1 = null;
Map<String,String> map2 = new HashMap<>();
Map map3 = new HashMap();
map3.put("aaa", "111");
map3.put("bbb", 2222);
map3.put("ccc-a", 333);
request.setAttribute("map1", map1);
request.setAttribute("map2", map2);
request.setAttribute("map3", map3);
字串:${empty str1} -- ${empty str2} -- ${empty str3} <br><!--true,true,false-->
List:${empty list1} -- ${empty list2} -- ${empty list3}<br><!--true,true,false-->
Map:${empty map1} -- ${empty map2} -- ${empty map3}<br><!--true,true,false-->

javabean中

User user1 = null;
User user2 = new User();
User user3 = new User();
user3.setUserId(1);
request.setAttribute("user1", user1);
request.setAttribute("user2", user2);
request.setAttribute("user3", user3);
JavaBean:${empty user1} --${empty user2} --${empty user3} <br><!--true,false,false-->

1.6 EL運算

${a == b }
${c == d }
${c eq d }
${a == 5 }
${c == 'aa' }

二、 JSTL

jsp的標準標籤庫,最重要的是用於迭代集合以及格式化日期等。

使用JSTL要記得匯入兩個jar包,使用maven的時候不用導包,它會自動生成一個倉庫。

2.1 條件動作標籤

2.1.1 if標籤

<%
    int num = 10;
    request.setAttribute("num",num);
    int score = 60;
    request.setAttribute("score", score);
%>
<c:if test="${num>1}">
    <h3>num值大於1</h3>
</c:if>

<c:if test="${score<60}">
    <h3>不及格</h3>
</c:if>
<c:if test="${score==60}">
    <h3>剛剛及格</h3>
</c:if>
<c:if test="${score>60}">
    <h3>哎喲不錯哦!</h3>
</c:if>

2.1.2 choose、when、otherwise標籤

類似於switch、case、default關鍵字。

<%
    int num = 10;
    request.setAttribute("num",num);
    int score = 60;
    request.setAttribute("score", score);
%>
<c:choose>
    <c:when test="${score < 60}">
        <h3>你個小渣渣!</h3>
    </c:when>
    <c:when test="${score == 60}">
        <h3>分不在高,及格就行!</h3>
    </c:when>
    <c:otherwise>
        <h3>哎喲不錯哦!</h3>
    </c:otherwise>
</c:choose>

2.1.3 迭代標籤

  1. forEach標籤

    <c:forEach var="i" begin="1" end="10">
        ${i}
    </c:forEach>
    <br>
    <%
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        request.setAttribute("list", list);
    
    %>
    <c:forEach var="str" items="${list}">
        ${str}
    </c:forEach><!--常用-->
    

2.1.4 格式化動作標籤

格式化日期:(日期型別轉化爲字串型別)

<%
    request.setAttribute("date1",new Date());
%>
${date1}<br>
<fmt:formatDate value="${date1}" type="date"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="time"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="both"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="date" dateStyle="FULL"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" type="date" dateStyle="short"></fmt:formatDate><br>
<fmt:formatDate value="${date1}" pattern="yyyy-MM-dd"></fmt:formatDate>

字串型別轉化爲日期型別:

<%
	request.setAttribute("str1","2020-08-09");
%>
<fmt:parseDate value="${str1}" type="date" /> <br>
<fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" /> <br>