1. 程式人生 > >動態頁面技術----EL技術、JSTL技術,javaEE的開發模式

動態頁面技術----EL技術、JSTL技術,javaEE的開發模式

tdi ont height 服務器開發 use 接收 true 安裝 tex

1 EL技術

1.1 EL 表達式

ELExpress 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技術

JSTLJSP 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使用jsptaglib指令導入核心標簽庫

技術分享圖片

<%@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開發的設計模式

  MModel---模型 javaBean:封裝數據

  VView-----視圖 jsp:單純進行頁面的顯示

  CController----控制器 Servelt:獲取數據--對數據進行封裝--傳遞數據--指派顯示的jsp頁面

3.3 javaEE的三層架構

服務器開發時 分為三層

web層:與客戶端交互----這裏體現了MVC

service層:復雜業務處理

dao層:與數據庫進行交互

技術分享圖片

開發實踐時,三層架構通過包結構體現

4實例

1)列表實例改成用ELJSTL實現

    <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">商城價:&yen;${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的開發模式