動態頁面技術----EL技術、JSTL技術,javaEE的開發模式
1 EL技術
1.1 EL 表達式
EL(Express Lanuage)表達式可以嵌入在jsp頁面內部,減少jsp腳本的編寫,
EL出現的目的是要替代jsp頁面中腳本的編寫,就是簡化java代碼。
1.2 EL最重要的作用:從域中取出數據
jsp腳本:<%=request.getAttribute(name)%>
EL表達式替代上面的腳本:${requestScope.name}
1.2.1獲得四大域中的數據
格式 ${EL表達式}
EL獲得pageContext域中的值:${pageScope.key};
EL獲得request域中的值:${requestScope.key};
EL獲得session域中的值:${sessionScope.key};
EL獲得application域中的值:${applicationScope.key};
例:demo01.jsp:
<% request.setAttribute("name", "zhangsan"); %> ${requestScope.name}
1.2.2 EL從四個域中獲得某個值
${key};
相當於pageContext.findAttribute("key");
同樣是依次從pageContext域,request域,session域,application
例:
<% pageContext.setAttribute("name", "lisi"); request.setAttribute("name", "zhangsan"); %> ${name}
1.2.3獲取屬性
獲得普通字符串
獲得User對象的值
獲得List<User>的值
例:
User實體類:
public class User { private String name; private int age;public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }
demo02.jsp:
<% //普通字符串 request.setAttribute("username", "小紅帽"); //User對象 User user=new User(); user.setName("大灰狼"); user.setAge(18); session.setAttribute("User", user); //List<User> User user02=new User(); user02.setName("外婆"); user02.setAge(55); List<User> list=new ArrayList<User>(); list.add(user); list.add(user02); application.setAttribute("UserList", list); %> <!-- 獲取字符串 --> <p>username:${username}</p> <!-- 獲取User對象 --> <p>User:${User.name}...${User.age}</p> <!-- 獲取List --> <p>UserList:${UserList[0].name}...${UserList[1].age}</p>
1.2.4 pageContext獲得其他八大對象
比較重要的:${pageContext.request.contextPath} 獲得web應用名稱
例:
<!-- 獲取web應用名稱 --> <p>web應用名稱:${pageContext.request.contextPath }</p>
1.3 EL執行表達式
例如:
${1+1} 可以運算
${empty user} 判斷user是否為空,為空:true(判斷的是域裏面的key值)
${user==null?true:false} 三目運算符
例:
<!-- EL執行表達式 --> ${1+1 }<br> ${empty User}<br> ${UserList==null?"空":"不空"}
2 JSTL技術
JSTL(JSP Standard Tag Library),JSP標準標簽庫,可以嵌入在jsp頁面中使用標簽的形式完成業務邏輯等功能。
jstl出現的目的同el一樣,也是要代替jsp頁面中的腳本代碼。
JSTL標準的標準標簽庫有5個子庫,但隨著發展,目前常使用的是核心庫Core
2.1 JSTL下載與導入
“http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”下載JSTL的安裝包:
jakarta-taglibs-standard-1.1.2.zip
將這兩個jar包加到項目中:
2.2使用jsp的taglib指令導入核心標簽庫
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2.3 JSTL核心庫的常用標簽
JSTL標簽要與EL表達式配合使用
1)<c:if test=””>標簽
其中test是返回boolean的條件
例:
<c:if test="${1!=1}"> 1!=1 </c:if> <c:if test="${1==1}"> 1==1 </c:if>
<c:if test="${empty User}"> 登錄 </c:if> <c:if test="${!empty User}"> ${User.name} </c:if>
2)<c:forEach>標簽
例1:
<!-- 普通for --> <c:forEach begin="0" end="10" var="i"> ${i } </c:forEach> <hr> <!-- 增強for --> <c:forEach items="${UserList}" var="user"> ${user.name}...${user.age} </c:forEach>
例2:遍歷
遍歷List<String>的值
遍歷Map<String,String>的值
遍歷Map<String,User>的值
遍歷Map<User,Map<String,User>>的值
<!-- List<String> --> <c:forEach items="${StringList}" var="str"> ${str} </c:forEach> <hr> <!-- Map<String,String>遍歷 --> <c:forEach items="${StringMap}" var="entry"> ${entry.key}...${entry.value} </c:forEach> <hr> <!-- Map<String,User>遍歷 --> <c:forEach items="${UserMap}" var="entry"> ${entry.key}...${entry.value.name}...${entry.value.age} </c:forEach> <hr> <!-- Map<User,Map<String,User>>遍歷 --> <c:forEach items="${UserMaps}" var="entry"> <h4>${entry.key.name}...${entry.key.age}</h4> <c:forEach items="${entry.value}" var="entry1"> ${entry1.key}...${entry1.value.name}...${entry1.value.age}<br> </c:forEach> </c:forEach>
(數據存入的代碼沒貼)
3 javaEE的開發模式
3.1什麽是模式
模式在開發過程中總結出的“套路”,總結出的一套約定俗成的設計模式
3.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.3 javaEE的三層架構
服務器開發時 分為三層:
web層:與客戶端交互----這裏體現了MVC
service層:復雜業務處理
dao層:與數據庫進行交互
開發實踐時,三層架構通過包結構體現
4實例
1)列表實例改成用EL和JSTL實現
<c:forEach items="${ProductList}" var="product"> <div class="col-md-2" style="height:250px"> <a href="product_info.htm"> <img src="${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.market_price}</font> </p> </div> </c:forEach>
2)實例2:完成產品詳情頁
在列表頁的跳轉那裏,加一個參數:
<a href="productInfoServlet?pid=${product.pid}">
productInfoServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收參數 String pid=request.getParameter("pid"); //調用Service層方法 Product pro=productService.lookProduct(pid); request.setAttribute("Product", pro); //存入數據 request.getRequestDispatcher("/product_info.jsp").forward(request, response); //請求轉發 }
product_info.jsp中用el表達式獲取相關屬性信息:
${Product.pimage}
${Product.pname}
${Product.shop_price}
等
Tips:一個servlet只完成一個功能
動態頁面技術----EL技術、JSTL技術,javaEE的開發模式