1. EL和JSTL的表達(dá)式
1.1. 什么是EL表達(dá)式
- EL表達(dá)式存在的目的是為了更方便的獲取Servlet域?qū)ο笾写鎯Φ臄?shù)據(jù),在其出現(xiàn)之前要獲取Servlet域?qū)ο笾械臄?shù)據(jù)需要嵌入很多java代碼,這樣做的會讓jsp頁面混亂朗儒,難以維護(hù)拾稳,為此在jsp2.0規(guī)范中提供了EL表達(dá)式
1.2. EL通過內(nèi)置對象獲取數(shù)據(jù)
- 通過pageScope吮炕、requestScope、sessionScope访得、applicationScope分別獲取四大域?qū)ο蟮臄?shù)據(jù)
${pageScope.name};
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
- 通過param和paramValues內(nèi)置對象獲取請求參數(shù)
${param.username}
${paramValues.hobby}
- 通過header和headerValues獲取請求頭
${header['accept-Encoding']}<!-- 注意這個-無法識別只能用這種方式 -->
${headerValues['accept-Encoding'][0]}<!-- 獲取數(shù)組里面的第一個-->
- 通過pageContext獲取jsp上下文數(shù)據(jù)
${pageContext.request.contextPath}<!--獲取項目路徑龙亲,這個是動態(tài)的路徑開發(fā)的時候用于書寫form表單的action路徑,非常有用悍抑。-->
- 通過initParam內(nèi)置對象獲取全局化參數(shù)
<!-- 加入在web.xml中配置了name為person的全局化參數(shù)
<context-param>
<param-name>person</param-name>
<param-value>白月</param-value>
</context-param>
-->
${initParam.person}
- 通過cookie對象獲取cookie內(nèi)容
${cookie.company}
1.3. EL可以獲取不同類型的數(shù)據(jù)
- EL獲取自定義數(shù)據(jù)鳄炉、字符串、數(shù)組搜骡、List類型拂盯、Map集合數(shù)據(jù)。
1.4. EL可以執(zhí)行表達(dá)式
- 算術(shù)運(yùn)算符
- 邏輯運(yùn)算符
- 關(guān)系運(yùn)算符
- 三元運(yùn)算符
- empty運(yùn)算符--對象是否為null,字符串是否為"",集合是否為0
1.5. 什么是JSTL
- 由于jsp支持自定義標(biāo)簽记靡,因此各個廠商定制了自身應(yīng)用的標(biāo)簽庫谈竿,因此出現(xiàn)了同一功能的標(biāo)簽因不同廠商的制定而不同,這就造成了標(biāo)簽的混亂摸吠,不利于開發(fā)空凸,因此sun公司制定了同一的標(biāo)準(zhǔn)。sun公司制定的標(biāo)簽庫又有5個標(biāo)簽庫組成寸痢。
1.6. 導(dǎo)入標(biāo)簽庫
- 使用taglib 指令導(dǎo)入標(biāo)簽庫,注意需要導(dǎo)入兩個包的:jstl.jar,standard.jar
<%@ taglib uri="" prefix=" " %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
1.7. 使用JSTL標(biāo)簽和EL表達(dá)式判斷是否登錄案例
- 例如:商城首頁里面有個登錄按鈕呀洲,當(dāng)商城首頁在沒有登錄時首頁顯示登錄,在登錄后首頁顯示登陸者的用戶名轿腺。這個就可以通過JSTL和EL表達(dá)式聯(lián)合實現(xiàn)两嘴。
<!-- 用戶沒有登錄 假設(shè)已經(jīng)導(dǎo)入了JSTL標(biāo)簽庫core-->
<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="register.jsp">注冊</a></li>
</c:if>
- 這里面使用了<c:if>標(biāo)簽,這個標(biāo)簽有三個屬性族壳,test用于設(shè)置邏輯表達(dá)式憔辫,var設(shè)置變量,scope設(shè)置作用范圍仿荆,默認(rèn)值為page,如果test計算結(jié)果為true那么標(biāo)簽將會被執(zhí)行贰您,否則標(biāo)簽體不會被執(zhí)行坏平。
- jstL中的forEach標(biāo)簽
- forEach標(biāo)簽有兩種組合方式:第一種是模擬java中的for循環(huán)很相似;
<!-- for(int i=0;i<5;i++){} -->
<c:forEach begin="0" end="5" var="i">
${i}<br/>
</c:forEach>
- 第二種是模擬增強(qiáng)for循環(huán)
<!-- 模擬增強(qiáng)for循環(huán) productList----List<Product>
for(Product product:productList){
syso()
}-->
<!-- item代表一個集合或數(shù)組锦亦,var代表集合中的某一個元素-->
<c:forEach items="${productList}" var="pro">
${pro.name }
</c:forEach>
1.8. 第二個案例舶替,獲取request域中的數(shù)據(jù)
<c:forEach items="${productList }" var="product">
<div class="col-md-2" style="height:250px">
<a href="product_info.htm">
<img src="${pageContext.request.contextPath }/${product.pimage }" width="170" height="170" style="display: inline-block;">
</a>
<p>
<a href="product_info.html" style='color: green'>${product.pname }</a>
</p>
<p>
<font color="#FF0000">商城價:¥${product.shop_price }</font>
</p>
</div>
</c:forEach>
- 注意: 引用css,js里的圖片,都要寫絕對的路徑杠园,本案例使用了
${pageContext.request.contextPath}/${product.pimage}
<!-- 注意pageContext對象可以調(diào)用其他內(nèi)置對象顾瞪,contextPath用來獲取web應(yīng)用路徑,用el表達(dá)式的目的是獲取動態(tài)的路徑抛蚁。注意這個pimage是product的屬性陈醒,這就是應(yīng)用了MVC架構(gòu)中的javaBean-->
2. MVC架構(gòu)和javaEE的三層架構(gòu)區(qū)別?
2.1. 什么是MVC架構(gòu)
- MVC架構(gòu)是web層的技術(shù)瞧甩,MVC架構(gòu)分為三層钉跷,分別是Model(將數(shù)據(jù)封裝到j(luò)avaBean)、View(顯示頁面)肚逸、Controller(控制層爷辙,用于邏輯處理,接收表單的數(shù)據(jù)朦促,將數(shù)據(jù)處理后封裝到model膝晾,或者將數(shù)據(jù)通過view層顯示出來。)
2.2. javaEE的三層架構(gòu)
-
javaEE也分為三層架構(gòu)思灰,可以說是模仿MVC架構(gòu)的玷犹,但是JAVAEE的三層架構(gòu)師javaEE特有的。javaEE三層架構(gòu)分為:
web層:與客戶端交互洒疚,搜集頁面數(shù)據(jù),封裝數(shù)據(jù)坯屿,傳遞數(shù)據(jù)油湖,指定響應(yīng)的jsp頁面。
service層:復(fù)雜業(yè)務(wù)處理
dao層:與數(shù)據(jù)庫進(jìn)行交互领跛。
從圖中可以看出乏德,web層里面包含了MVC架構(gòu),這與其他層沒有關(guān)系吠昭。