02-3 el&jstl
jsp的開發規範:一個標準jsp中不允許出現一行java程式碼
所以用el和jstl來代替jsp指令碼
【EL】
1.EL 表示式概述
EL(Express Lanuage)表示式可以嵌入在jsp頁面內部,減少jsp指令碼的編寫,
EL出現的目的是要替代jsp頁面中指令碼的編寫。
2.EL從域中取出資料(EL最重要的作用)
jsp指令碼:<%=request.getAttribute(name)%>
EL表示式替代上面的指令碼:${requestScope.name}
EL最主要的作用是獲得四大域中的資料,格式${EL表示式}
EL獲得pageContext域中的值:${pageScope.key};
EL獲得request域中的值:${requestScope.key};
EL獲得session域中的值:${sessionScope.key};
EL獲得application域中的值:${applicationScope.key};
EL從四個域中獲得某個值${key};
---同樣是依次從pageContext域,request域,session域,application域中 獲取屬性,在某個域中獲取後將不在向後尋找
<% // 模擬Servlet往域中存放資料 // 簡單的String型別 //pageContext.setAttribute("name", "page-zhangsan"); //request.setAttribute("name", "request-zhangsan"); //session.setAttribute("name", "session-zhangsan"); //application.setAttribute("name", "app-zhangsan"); // User型別 //request.setAttribute("user", new User("zhangsan", "123")); // List<User>型別 List<User> list = new ArrayList<User>(); list.add(new User("zhangsan", "123")); list.add(new User("lisi", "234")); list.add(new User("wangwu", "345")); request.setAttribute("uList", list); %> <%--原來的方式 --%> <%--= request.getAttribute("name") --%> <%-- el表示式 --%> <%-- ${pageScope.name} ${requestScope.name} ${sessionScope.name} ${applicationScope.name} --%> <%--分別從4個域中取值 page->request->session->application --%> <%-- ${name} --%> <!-- 從域中取出user的uname屬性 --> <%--= ((User)request.getAttribute("user")).getUname() --%> <!-- 用el表示式取出user的uname屬性 --> <%-- ${user.uname} --%> <!-- 取出uList中第1個user的upwd屬性 --> <%--= ((List<User>)request.getAttribute("uList")).get(1).getUpwd() --%> EL取出uList中第2個user的uname屬性 ${uList[2].uname}
學會取出資料就可以對昨天的顯示單一商品程式碼進行優化
<div class="single"> <div class="detail"> <img src="${pageContext.request.contextPath}/images/${product.prodImage}" /> </div> <div class="detail"> 商品名稱:${product.prodId}<br /> 商品單價:${product.prodPrice}<br /> 商品庫存:${product.prodAmount}<br /> <input type="text" value="1"> <br /> <input type="button" value="新增到購物車"> <input type="button" value="立即購買"> </div> </div>
3.EL的內建物件11個
pageScope,requestScope,sessionScope,applicationScope
---- 獲取JSP中域中的資料
param,paramValues - 接收引數.
相當於request.getParameter() request.getParameterValues()
header,headerValues - 獲取請求頭資訊
相當於request.getHeader(name)
initParam - 獲取全域性初始化引數
相當於this.getServletContext().getInitParameter(name)
cookie - WEB開發中cookie
相當於request.getCookies()---cookie.getName()---cookie.getValue()
form1:寫一個表單
<form action="${pageContext.request.contextPath}/el/form2.jsp">
使用者名稱: <input type="text" name="uname">
密碼: <input type="password" name="upwd">
<input type="submit">
</form>
弄張圖片
<img src="${pageContext.request.contextPath}/img/prod204.jpg"/>
//寫一個cookie物件,訪問本頁後,再訪問下一個jsp頁面獲取cookie引數
Cookie cookie = new Cookie("name", "zhangsan");
response.addCookie(cookie);
form2:通過el內建物件獲取引數
jsp指令碼
<%= request.getParameter("uname") %>
el內建物件獲得
${ param.uname }
jsp指令碼
<%= request.getParameter("upwd") %>
el內建物件獲得
${ param.upwd }
獲取請求頭資訊
${header["User-Agent"]}
獲得全域性初始化引數
${initParam.key}
獲得cookie的值
${cookie.name.value}
pageContext - WEB開發中的pageContext.
pageContext獲得其他八大物件
${pageContext.request.contextPath}
相當於
<%=pageContext.getRequest().getContextPath%> 這句程式碼不能實現
獲得WEB應用的名稱:可以把src或者href中的專案名改為用${pageContext.request.contextPath}獲取,這樣把專案名改了也不會影響正常執行.
4.EL執行表示式
例如:
<%
request.setAttribute("name", "");
%>
執行表示式 -> 只要有結果, 就可以顯示在頁面上
${1+1}
${empty name}
${user==null?true:false}
【JSTL】
1.JSTL概述
JSTL(JSP Standard Tag Library),JSP標準標籤庫,可以嵌入在jsp頁面中使用標籤的形式完成業務邏輯等功能。
jstl出現的目的同el一樣也是要代替jsp頁面中的指令碼程式碼。
JSTL標準標準標籤庫有5個子庫,但隨著發展,目前常使用的是他的核心庫(Core)
標籤庫 標籤庫的URI 字首
Core http://java.sun.com/jsp/jstl/core c
I18N http://java.sun.com/jsp/jstl/fmt fmt
SQL http://java.sun.com/jsp/jstl/sql sql
XML http://java.sun.com/jsp/jstl/xml x
Functions http://java.sun.com/jsp/jstl/functions fn
2.JSTL下載與匯入
從Apache的網站下載JSTL的JAR包。進入 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
找到jakarta-taglibs-standard-1.1.2\lib子資料夾下的
放到專案名/webContent/WEB-INF/lib下
不用build path,eclipse會自動導包,jar包圖示左下角出現類似系統庫圖示就表示導包完成
使用jsp的taglib指令匯入核心標籤庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3.JSTL核心庫的常用標籤
1)<c:if test=””>標籤
其中test是返回boolean的條件
用另一個取反的if標籤來表示else
<!-- 登入效果
如果已經登入, 就顯示使用者名稱
如果沒有登入, 就顯示請登入
-->
判斷
<c:if test="${empty name}">
請登入
</c:if>
<c:if test="${!(empty name)}">
歡迎你 ${name}
</c:if>
<hr />
2)<c:forEach>標籤
使用方式有兩種組合形式:
遍歷map的實質是遍歷map的entry
在<c:forEach>迴圈體內:取出k-v:${strMap.key}:${strMap.value}
<%
// 1. List<String> strList
List<String> strList = new ArrayList<String>();
strList.add("a");
strList.add("b");
strList.add("c");
pageContext.setAttribute("strList", strList);
// 2. List<User> uList
List<User> uList = new ArrayList<User>();
uList.add(new User("zhangsan", "123"));
uList.add(new User("lisi", "234"));
uList.add(new User("wangwu", "345"));
pageContext.setAttribute("uList", uList);
// 3. Map<String, String> strMap
Map<String, String> strMap = new HashMap<String, String>();
strMap.put("one", "一");
strMap.put("two", "二");
strMap.put("three", "三");
pageContext.setAttribute("strMap", strMap);
// 4. Map<String, User> uMap
Map<String, User> uMap = new HashMap<String, User>();
uMap.put("zhangsan", new User("zhangsan", "123"));
uMap.put("lisi", new User("lisi", "123"));
uMap.put("wangwu", new User("wangwu", "123"));
pageContext.setAttribute("uMap", uMap);
%>
<hr />
1. List<String> strList
<c:forEach items="${strList}" var="str">
${str}
</c:forEach>
<hr />
2. List<User> uList
<c:forEach items="${uList}" var="user">
${user.uname}:${user.upwd}
</c:forEach>
<hr />
3. Map<String, String> strMap
<c:forEach items="${strMap}" var="strMap">
${strMap}
</c:forEach>
<hr />
4. Map<String, User> uMap
遍歷map的實質是遍歷map的entry
<%-- 物件導航 --%>
<c:forEach items="${uMap}" var="strMap">
${strMap.key}:${strMap.value.uname}:${strMap.value.upwd}
</c:forEach>
學了<c:forEach>標籤,那麼就可以對昨天顯示商品.jsp裡的迴圈語句進行優化,把jsp指令碼全部去掉
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page import="com.wowowo.bean.Product" %>
<%@ page import="com.wowowo.bean.PageBean" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet">
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
<style type="text/css">
.prod {
border: 1px solid black;
width: 230px;
}
.prod_price {
float: right;
}
</style>
</head>
<body>
<h1 class="text-center">歡迎訪問服裝商城</h1>
<div class="container">
<c:forEach items="${pageBean.data}" var="product">
<div class="prod col-md-3">
<div>
<a href="${pageContext.request.contextPath}/single?uid=${product.prodId}"><img
src="${pageContext.request.contextPath}/images/${product.prodImage}" /></a>
</div>
<div>
${product.prodName}
<span class="prod_price">價格:
${product.prodPrice}
</span>
</div>
</div>
</c:forEach>
</div>
<div style="text-align: center;">
<a href="goods?pageNum=1&pageSize=5" class="btn btn-danger">首頁</a>
<a
href="goods?pageNum=${pageBean.pageNum<=1?1:pageBean.pageNum-1}&pageSize=5"
class="btn btn-danger">上一頁</a>
<a href="goods?pageNum=${pageBean.pageNum>=pageBean.pageMaxSize?pageBean.pageNum:pageBean.pageNum+1}&pageSize=5"
class="btn btn-danger">下一頁</a>
<a href="goods?pageNum=${pageBean.pageMaxSize}&pageSize=5"
class="btn btn-danger">末頁</a>
</div>
</body>
</html>