131 JSTL標準標籤庫

2020-08-13 19:44:28

1.現有問題

  • EL主要是用於作用域獲取數據,雖然可以做運算判斷,但是得到的都是一個結果,做展示。

  • EL不存在流程控制。比如判斷。

  • EL對於集合只能做單點存取,不能實現遍歷操作。比如回圈。

2.什麼是JSTL?

  • JSTL :全稱Java Server Pages Standard Tag Library

  • JSP標準標籤庫(JSTL)是一個JSP標籤集合。

3.JSTL的作用

  • 可對EL獲取到的數據進行邏輯操作。
  • 與EL合作完成數據的展示。

4.JSTL使用

  • (第一步)匯入兩個jar檔案:standard.jar 和 jstl.jar 檔案拷貝到/WEB-INF/lib/下

  • (第二步)在JSP頁面引入標籤庫<% @taglib uri=「http://java.sun.com/jsp/jstl/core」 prefix=「c」>

6.5核心標籤

6.5.1條件標籤if判斷

  • 語法: <c:if test ="條件> < /cif>
<!-- test屬性中是條件, 但是條件需要使用EL表達式來書寫-->
<h3>條件標籤: if</h3>
<c:if test="${8>2}">
    8大於2是成立的
</c:if>
<c:if test="${8<2}">
    8小於2是成立的
</c:if>

6.5.2多條件choose判斷

  • 語法:

  • < c:choose>

    <c:when test=「條件 1」>結果1 < /c:when>

    <c:when test=「條件2」>結果2< /c:when>

    <c:when test=「條件3」>結果3< /c:when>

    <c:otherwise >結果4< /c:otherwise>

    < /c:choose>

<h3>條件標籤: choose(等價於java中多重if)</h3>
<%-- 測試成績等級>90優秀 >80 良好  >70中等  >60及格--%>
<c:set var="score" value="80"></c:set>
<C :choose>
    <c:when test="${score>=90 }">優秀</c:when>
    <c:when test="${score>=80 }">良好</c:when>
    <c:when test="${score>=70 }">中等</c:when>
    <c:when test="${score>=60 }">及格</c:when>
    <c :otherwise>不及格</c:otherwise>
< /c :choose>

6.5.3迭代foreach標籤

  • 語法

    <c:foreach

    var=「變數名」

    items=「集合」

    begin=「起始下標」

    end=「結束下標」

    step=「間隔長度」

    varstatus=」遍歷狀態」 >

    < /c:foreach>

<h3>測試list集合遍歷獲取學生列表</h3>
<table border="1" width=" 80%" bordercolor="red" cellspacing="0" align= " center ">
	<tr>
        <th>學號</th>
        <th>姓名</th>
        <th>成績</th>
        <th>班級</th>
        <th>是否是第一個</th>
        <th>是否是最後一個</th>
        <th>計數count</th>
        <th>索引index</th>
    </tr>
    <!-- varStatus :變數狀態:遍歷出的每一項內容的狀態:
    first是否是第一行
    last是否是最後 一行
    count當前行數
    index當前元素的下標-->
    
    <!-- var :遍歷出的每-項使用變數先儲存
    items:集合(使用E1表達式)-->
    <c:forEach var="stu" items="${students}" varStatus="vs" >
        <tr>
            <td>${stu.1d}</td>
            <td>${stu.name }</td>
            <td>${stu.score}</td>
            <td>${stu.classes}</td>
            <td>${vs.first}</td>
            <td>${vs.last}</td>
            <td>${vs.count}</td>
            <td>${vs.index}</td>
        </tr>
    </c:forEach>
</table>

程式碼:

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.wlw.entity.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>JSTL標籤庫1</title>
</head>
<body>
    <%
        request.setAttribute("username","tom123");
        request.setAttribute("age",58);

        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        request.setAttribute("list",list);

        List<User> users = new ArrayList<>();
        users.add(new User("tom","123456"));
        users.add(new User("marry","123456"));
        users.add(new User("jack","123456"));
        users.add(new User("gavin","123456"));
        request.setAttribute("users",users);
    %>
    ${username}
    <c:if test="${username eq 'tom'}">
        <h1>歡迎您,${username}</h1>
    </c:if>
    <c:if test="${username ne 'tom'}">
        <h1>請您重新登錄!</h1>
    </c:if>

    <hr/>
    <c:choose>
        <c:when test="${age < 18}" ><h1>少年</h1></c:when>
        <c:when test="${age>=18 && age<30}"><h1>青年</h1></c:when>
        <c:when test="${age >=30 && age<50}"><h1>中年</h1></c:when>
        <c:otherwise><h1>老年</h1></c:otherwise>
    </c:choose>

    <c:forEach var="s" items="${list}" begin="0" end="4" step="1" varStatus="i">
        <h1>${s}&nbsp;&nbsp;${i.first}&nbsp;&nbsp;${i.last}&nbsp;&nbsp;${i.count}&nbsp;&nbsp;${i.index}</h1>
    </c:forEach>
    <hr/>
    <%
        for(String s : list){
            out.println(s);
        }
    %>

    <hr/>
    <c:forEach var="user" items="${users}">
        <h1>${user.username}:${user.password}</h1>
    </c:forEach>
</body>
</html>

6.5.4 url 標籤

  • 在Cookie禁用的情況下,通過重寫URL拼接JSESSIONID來傳遞ID值。便於下一次存取時仍可查詢到上一次的Session物件。
<c:url context='${pageContext.request.contextPath}' value='/xxxController' />
//在form表單的action中巢狀動態路徑
<form action=" <c:url context='${pageContext.request.contextPath}' value='/xxxController' />">
    
</form>

  • 經驗:所有涉及到頁面跳轉或者重定向跳轉時,都應該使用URL重寫。

程式碼:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>JSTL標籤庫2</title>
</head>
<body>
    <%
        String newURL = response.encodeRedirectURL(request.getContextPath()+"/jstl/jstl1.jsp");
    %>
    <%=newURL%>

    <a href="<%=response.encodeRedirectURL(request.getContextPath()+"/jstl/jstl1.jsp")%>">跳轉</a>
    <br/>
    <c:url context="${pageContext.request.contextPath}" value="/jstl/jstl1.jsp"></c:url>
    <a href="<c:url context='${pageContext.request.contextPath}' value='/jstl/jstl1.jsp'></c:url>">跳轉2</a>
</body>
</html>

6.6整合

將現有的EmpProject專案逬行整合,使用EL+JSTL替換指令碼程式碼

<%@ page import="java.util.List" %>
<%@ page import="com.wlw.emp.entity.Emp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>顯示所有員工</title>
</head>
<body>
    <table border="1">
        <tr>
            <td>編號</td>
            <td>姓名</td>
            <td>工資</td>
            <td>年齡</td>
            <td colspan="2">操作</td>
        </tr>

    <%--
    <%
        List<Emp> emps = (List<Emp>)request.getAttribute("emps");
        for (Emp emp:emps){
    %>
        <tr>
            <td><%=emp.getId()%></td>
            <td><%=emp.getName()%></td>
            <td><%=emp.getSalary()%></td>
            <td><%=emp.getAge()%></td>
            <td><a href="<%= request.getContextPath()+"/manager/safe/removeEmpController?id="+emp.getId()%>">刪除</a></td>
            <td><a href="<%= request.getContextPath()+"/manager/safe/showEmpController?id="+emp.getId()%>">修改</a></td>
        </tr>
    <%
        }
    %>
    --%>

        
        <c:forEach var="emp" items="${requestScope.emps}">
            <tr>
                <td>${emp.id}</td>
                <td>${emp.name}</td>
                <td>${emp.salary}</td>
                <td>${emp.age}</td>
                <td><a href=" <c:url context='${pageContext.request.contextPath}'
                    value='/manager/safe/removeEmpController?id=${emp.id}'></c:url>">刪除</a></td>
                <td><a href=" <c:url context='${pageContext.request.contextPath}'
                    value='//manager/safe/showEmpController?id=${emp.id}'></c:url>">修改</a></td>
            </tr>
        </c:forEach>

    </table>
</body>
</html>

<%@ page import="com.wlw.emp.entity.Emp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>修改員工資訊頁面</title>
</head>
<body>
<%--
    <%
        Emp emp = (Emp) request.getAttribute("emp");
    %>

    <!--<form action="/empproject/manager/safe/updateEmpController" method="post"> -->
    <form action="<%=request.getContextPath()+"/manager/safe/updateEmpController" %>" method="post">
        編號:<input type="text" name="id" value="<%=emp.getId()%>" readonly><br/>
        姓名:<input type="text" name="name" value="<%=emp.getName()%>"><br/>
        工資:<input type="text" name="salary" value="<%=emp.getSalary()%>"><br/>
        年齡:<input type="text" name="age" value="<%=emp.getAge()%>"><br/>
        <input type="submit" value="修改">
    </form>
--%>
    
    <form action="<c:url context='${pageContext.request.contextPath}' value='/manager/safe/updateEmpController'></c:url>
        " method="post">
        編號:<input type="text" name="id" value="${emp.id}" readonly><br/>
        姓名:<input type="text" name="name" value="${emp.name}"><br/>
        工資:<input type="text" name="salary" value="${emp.salary}"><br/>
        年齡:<input type="text" name="age" value="${emp.age}"><br/>
        <input type="submit" value="修改">
    </form>

</body>
</html>