EL&JSTL
阿新 • • 發佈:2017-09-11
收集 aries 客戶端 alt 註冊 glib true 內部 hive EL&JSTL(重要)
一、EL技術
1、EL表達式概述
EL(Express Language)表達式可以嵌入jsp頁面內部,建設jsp腳本的編寫,EL出現的目的是要替代jsp頁面腳本的編寫。(不能進行邏輯運算)
2、EL從域中取出數據(EL最重要的作用(90%以上))
EL最主要的作用是獲得四大域中的數據,格式${EL表達式}
EL獲得pageContext域中的值:${pageContextScope.key);}
EL獲得request域中的值:${requestScope.key);}
EL獲得session域中的值:${sessionScope.key);}
EL獲得application域中的值:${applicationScope.key);}
EL從四個域中獲得某個值${key;}
---同樣是依次從pageContext域,request域,session域,application域中 獲取屬性,在某個域中獲取後將不在向後尋找。
<!-- 模擬取域中的數據 -->
<%
//request存入一個字符串
request.setAttribute("company", "黑馬程序員");
//session域中存入一個對象
User user = new User();
user.setId(1);
user.setName("zhangsan");
user.setPassword("123");
session.setAttribute("user", user);
//application域(ServletContext)存入一個集合
List<User> list = new ArrayList<User>();
User user1 = new User();
user1.setId(2);
user1.setName("lisi");
user1.setPassword("456");
list.add(user1);
User user2 = new User();
user2.setId(3);
user2.setName("wangwu");
user2.setPassword("789");
list.add(user2);
application.setAttribute("list", list);
%>
<!-- jsp腳本取出域中的值 -->
<%=request.getAttribute("company")%>
<%out.write("<br>"); %>
<% User sessionUser = (User) session.getAttribute("user");
out.write(sessionUser.getName());%>
<%out.write("<br>"); %>
<% List<User> appList = (List<User>) application.getAttribute("list");
for(User appUser : appList){
if(appUser.getId() == 3){
out.write(appUser.getName());
}
}
%>
<!-- 使用EL表達式獲得域中的值 -->
<%out.write("<br>"); %>
${requestScope.company}
<%out.write("<br>"); %>
${sessionScope.user.name}
<%out.write("<br>"); %>
${applicationScope.list[1].name}
<%out.write("<br>"); %>
<!-- 使用el表達式全域查找 -->
${company}
<%out.write("<br>"); %>
${user.name }
<%out.write("<br>"); %>
${list[1].name }
3、EL的內置對象11個(解決客戶端接收服務器數據問題)
pageScope,requestScope,sessionScope,applicationScope
---- 獲取JSP中域中的數據
param,paramValues - 接收參數.
--------相當於request.getParameter() rrquest.getParameterValues()
header,headerValues - 獲取請求頭信息
---------相當於request.getHeader(name)
initParam - 獲取全局初始化參數
---------相當於this.getServletContext().getInitParameter(name)
cookie - WEB開發中cookie
----------相當於request.getCookies()---cookie.getName()---cookie.getValue()
pageContext - WEB開發中的pageContext.
----------pageContext獲得其他八大對象
${pageContext.request.contextPath}
相當於
<%=pageContext.getRequest().getContextPath%> 這句代碼不能實現
獲得WEB應用的名稱
4、EL執行表達式
例如:
${1+1}
<!--empty 判斷某個對象是否為null 是null返回true-->
${empty user}
${user == null?true:false}
二、JSTL技術
1、JSTL概述
JSTL(JSP Standard Tag Library),JSP標準標簽庫,可以嵌入在jsp頁面中使用標簽的形式完成業務邏輯等功能。jstl出現的目的同el一樣也是要代替jsp頁面中的腳本代碼。JSTL標準標準標簽庫有5個子庫,但隨著發展,目前常使用的是他的核心庫。
核心使用就是Core標簽庫。
2、JSTL下載與導入
JSTL下載:
從Apache的網站下載JSTL的JAR包。進入“http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”網址下載JSTL的安裝包。jakarta-taglibs-standard-1.1.2.zip,然後將下載好的JSTL安裝包 進行解壓,此時,在lib目錄下可以看到兩個JAR文件,分別為jstl.jar和standard.jar。其中,jstl.jar文件包含JSTL規範中定義的接口和相關類,standard.jar文件包含用於實現JSTL的.class文件以及JSTL中5個標簽庫描述符文件(TLD)。
jstl.jar
standard.jar
然後將兩個jar包導入我們工作的lib中。
使用jsp的taglib指令導入核心標簽庫
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
快捷鍵:Alt+/
3、JSTL核心庫的常用標簽
1)<c:if test=””>標簽
其中test是返回boolean的條件
<!-- test代表的返回boolean的表達式 -->
<c:if test="${1==1}">
xxxxx
</c:if>
<c:if test="${1!=1}">
yyyyy
</c:if>
首頁用戶登錄:
<ol class="list-inline">
<!-- 用戶沒有登錄 -->
<c:if test="${empty user}">
<li><a href="login.jsp">登錄</a></li>
<li><a href="register.jsp">註冊</a></li>
</c:if>
<!-- 用戶已經登錄 -->
<c:if test="${!empty user}">
<li>${user.name }</li>
<li><a href="#">提出</a></li>
</c:if>
<li><a href="cart.jsp">購物車</a></li>
<li><a href="order_list.jsp">我的訂單</a></li>
</ol>
使用session保存用戶登錄信息。
2)<c:forEach>標簽
使用方式有兩種組合形式:
<!-- forEach模擬 -->
<!-- for(int i=0;i<=5;i++) {syso(i);} -->
<c:forEach begin="0" end="5" var="i">
${i}<br>
</c:forEach>
<!-- 模擬增強for productList--List<Product> -->
<!-- for(Product product : productList){syso(product.getPname());} -->
<!-- items:一個集合或數組,var代表集合中的某一個元素(自命名) -->
<c:forEach items="${productList}" var="pro">
${pro.pname}
</c:forEach>
<%
//模擬List<String> strList
List<String> strList = new ArrayList<String>();
strList.add("itcast");
strList.add("itheima");
strList.add("boxuegu");
strList.add("shandingyu");
request.setAttribute("strList", strList);
//遍歷List<User>的值
List<User> userList = new ArrayList<User>();
User user1 = new User();
user1.setId(2);
user1.setName("lisi");
user1.setPassword("123");
userList.add(user1);
User user2 = new User();
user2.setId(3);
user2.setName("wangwu");
user2.setPassword("123");
userList.add(user2);
application.setAttribute("userList", userList);
//遍歷Map<String,String>的值
Map<String,String> strMap = new HashMap<String,String>();
strMap.put("name", "lucy");
strMap.put("age", "18");
strMap.put("addr", "西三旗");
strMap.put("email", "[email protected]");
session.setAttribute("strMap", strMap);
//遍歷Map<String,User>的值
Map<String,User> userMap = new HashMap<String,User>();
userMap.put("user1", user1);
userMap.put("user2", user2);
request.setAttribute("userMap", userMap);
%>
<h1>取出strList的數據</h1>
<c:forEach items="${strList }" var="str">
${str }<br/>
</c:forEach>
<h1>取出userList的數據</h1>
<c:forEach items="${userList}" var="user">
user的name:${user.name }------user的password:${user.password }<br/>
</c:forEach>
<h1>取出strMap的數據</h1>
<c:forEach items="${strMap }" var="entry">
${entry.key }====${entry.value }<br/>
</c:forEach>
<h1>取出userMap的數據</h1>
<c:forEach items="${userMap }" var="entry">
${entry.key }:${entry.value.name }--${entry.value.password }<br/>
</c:forEach>
練習:
遍歷Map<User,Map<String,User>>的值
entry.key-----User
entry.value------List<String,User>
Map<User,Map<String,User>> userMMap = new HashMap<User,Map<String,User>>();
三、JavaEE的開發模式
1、什麽是模式?
模式在開發過程中總結出的“套路”,總結出的一套約定俗成的設計模式。
2、JavaEE經歷的模式
model1模式
技術組成:jsp+javaBean
model1的弊端:隨著業務復雜性 導致jsp頁面比較混亂。
model2模式
技術組成:jsp+servlet+javaBean
model2的優點:開發中 使用各個技術擅長的方面。
servlet:擅長處理java業務代碼。
jsp:擅長頁面的現實。
MVC:---- web開發的設計模式
M:Model---模型 javaBean:封裝數據
V:View-----視圖 jsp:單純進行頁面的顯示
C:Controller----控制器 Servelt:獲取數據--對數據進行封裝--傳遞數據-- 指派顯示的jsp頁面
3、JavaEE的三層架構
服務器開發時分為三層
web層:與客戶端交互。
service層:復雜業務處理。
dao層:與數據庫進行交互。
開發實踐時,三層架構通過包結構體現。
MVC與三層架構有什麽關系?
4、使用三層架構完成商品列表的顯示
a、三層架構,包的實現,前綴:公司域名。例如:com.scalpel.xxx
其他包名:com.scalpel.web , com.scalpel.service, com.scalpel.dao, com.scalpel.domain, com.scalpel.utils。(基本這樣搭建,每個包下面可以再搭建更小的包。)
b、業務分析:客戶端發起請求,發起訪問商品列表的請求----->web層servlet接收客戶端請求------>找service層ProductService------->dao層ProductDao------>到數據庫查找到數據----->List<Product>------>返回dao,service,web----->jsp顯示(el+jstl進行顯示)。
四、總結
EL表達式:
1、從域中取出數據${域中存儲的數據的name}
2、域中的內置對象,${pageContext.request.contextPath} 獲取web名稱
3、表達式
JSTL標簽(核心庫):
1、引入標簽<%@ taglib uri="" prefix="c"%>
2、<c: if test="">
3、<c:forEach items="數組或集合" var="數組或集合中的每一個元素">
JavaEE三層架構+MVC:
web層:收集頁面數據,封裝數據,傳遞數據,指定響應的jsp頁面。
service層:邏輯業務代碼的編寫。
dao層:數據庫的訪問代碼的編寫。
標簽庫 | 標簽庫的URI | 前綴 |
Core | http://java.sun.com/jsp/jstl/core | c |
118N | 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 |
客戶端 | 服務器 | DB | ||
客戶端發起請求,發起訪問。 | Web層 | service層 | dao層 | |
servlet javaBean jsp struts2 springMVC | 業務代碼 spring | 數據庫操作的代碼 hibernate mybatis |
EL&JSTL