JavaWeb = EL表達式,jstl標籤庫詳解

EL表達式,jstl標籤庫,三層架構

一.EL表達式

1.概述:

表達式語言(Expression Language)

作用:主要用來代替jsp中腳本的功能,簡化對java代碼的操作。

語法:${表達式}

2.使用

獲取值:獲取域中的值:EL表達式==只能==從域對象(4個域)中獲取數據

語法:

* 標準
	1. ${pageScope.鍵名} 
			從page域中獲取指定鍵名對應的值

	2. ${requestScope.鍵名} 
			從request域中獲取指定鍵名對應的值

	3. ${sessionScope.鍵名} 
			從session域中獲取指定鍵名對應的值

	4. ${applicationScope.鍵名} 
			從servletContext域中獲取指定鍵名對應的值
		
* 簡化
	${鍵名}
		特點:默認從最小域開始找,找到後直接顯示,不在繼續尋找
		小結:要求四個域鍵名唯一
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<h3>el表達式基本語法</h3>
<%
    /*模擬servlet向域中存值....*/
    // pageContext.setAttribute("username", "老師");
    request.setAttribute("username", "小老師");
    request.setAttribute("age", 33);
    session.setAttribute("sex", "女");
    application.setAttribute("address", "小本");
%>
<h5>標準語法</h5>
${pageScope.username} <br> <%--不會出現空指針異常問題--%>
${requestScope.age} <br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>簡化語法</h5>
${username} <br>
${age} <br>
${sex}<br>
${address}<br>
</body>
</html>

獲取集合的值語法:

1. 獲取字符串
		${鍵名}
		
2. 獲取對象(User)
		${鍵名.屬性名}

3. 獲取List(Array)集合
		${鍵名[索引]}

4. 獲取Map集合
		${鍵名.key}
		${鍵名["key"]}
		
5. 注意
	el不會出現null和索引角標越界問題
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo2</title>
</head>
<body>
<h3>獲取user對象</h3>
<%
    User user = new User("大名", 13, "男");
    request.setAttribute("user", user);
%>
${user} <br> <%--執行該對象的toString方法--%>
${user.username} | ${user.age} | ${user.sex} <br>


<h3>獲取list集合</h3>
<%
    List<Object> list = new ArrayList<>();
    list.add("胖");
    list.add("夫");
    list.add("靜");
    list.add(user);
    request.setAttribute("list", list);
%>
${list}<br><%--執行該對象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} | ${list[10]} <br> <%--el表達式不會出現 集合(數組)角標越界異常--%>


<h3>獲取map集合</h3>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "僧");
    map.put("key2", "子");
    map.put("key3", "青");
    map.put("key.4", user);
    request.setAttribute("map", map);
%>
${map}<br><%--執行該對象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].username}<br>
</body>
</html>

2.執行運算

算數運算符
		語法: + - * /(div) %(mod)
		
比較運算符
		語法:> < >= <= ==(eq) !=(ne)
		
邏輯運算符
		語法:&&(and) ||(or) !(not)
		
 三元運算符
		語法:${條件表達式?爲真:爲假}

------------------------------

 空運算符
 		語法:${not empty 對象}
 		功能:
 			可以判斷字符串和對象是否爲空
 			可以判斷一個集合的長度是否爲0
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo3</title>
</head>
<body>
<%
    int a = 4;
    int b = 3;
    request.setAttribute("a", a);
    request.setAttribute("b", b);
%>
<h5>算數運算符</h5>
${a / b} | ${a div b} <br>
${a % b} | ${a mod b}<br>

<h5>比較運算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b} <br>

<h5>三元運算符</h5>
${a == b ? "a相等b" : "a不等b"} <br>

<h5>非空判斷</h5>
<%
    User user = new User();
    request.setAttribute("user", user);

    List list = new ArrayList();
    list.add("aa" );
    request.setAttribute("list", list);
%>
user對象:${not empty user} <br> <%--  if(user !=null ){} --%>
list集合:${not empty list} <br> <%-- if(list !=null && list.size>0 ){}--%>

<h5>空值判斷</h5>
user對象:${empty user} <br> <%--  if(user ==null ){} --%>
list集合:${empty list} <br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>

3.隱式對象

* el表達式中有11個隱式對象

        pageContext
            就是jsp九大內置對象之一,他可以獲得其他八個內置對象
        cookie
            可以獲取瀏覽器指定cookie名稱的值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隱式對象..</h3>
${pageContext.request.contextPath}  動態獲取:項目名稱(虛擬路徑) <br>

${cookie.JSESSIONID.value} 獲取指定cookie名稱的值... <br>
</body>
</html>

注意事項:

* jsp默認支持el表達式
        servlet2.3規範中,默認不支持el表達式

* 如果要忽略el表達式
    1)忽略當前jsp頁面中所有的el表達式
        設置jsp中page指令中:isELIgnored="true" 屬性
    2)忽略單個el表達式
        \${表達式}

isELIgnored="false"

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隱式對象..</h3>
${pageContext.request.contextPath}  動態獲取:項目名稱(虛擬路徑) <br>

\${cookie.JSESSIONID.value} 獲取指定cookie名稱的值... <br>
</body>
</html>

JavaBean:他其實就是一個普通的java類

使用規範

  1. 所有字段(成員變量)爲private

  2. 提供無參構造方法

  3. 提供getter、setter和is方法

  4. 實現serializable接口

 

二.JSTL標籤庫

1.概述:

Jsp 標準標籤庫(Jsp Standard Tag Library),是由Apache組織提供的開源的jsp標籤庫

作用:替換和簡化jsp頁面中java代碼的編寫

JSTL標準標籤庫有5個子庫,但隨着發展,目前常使用的是它的核心庫(Core)

標籤庫 標籤庫的URI 前綴
Core http://java.sun.com/jsp/jstl/core c
國際化(幾乎不用) 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
JSTL標籤庫提供5大功能:
1. corejstl的核心標籤庫。
2. fmt:格式化(國際化)的標籤(使用較少,對頁面顯示數據,格式化,現在都交給前端去做)
3. functionsjstl中提供對字符串操作的函數庫(不再使用,建議在數據顯示在頁面之前,在後臺程序中,先格式
化好字符串,然後直接顯示,不再頁面做處理,如果有前端,交給前端處理(javascript  解析json格式數據)
4. sqljstl提供的在jsp頁面上書寫sql,操作數據庫,目前已經不再(不允許)使用(jsp開發模式二,這個開發模
式不允許,在頁面操作數據庫)
5. xmljstl操作xml文件的。目前已經不再使用(頁面傳遞數據,頁面解析數據,使用json格式字符串代替xml
 

2.jstl標籤的使用:

使用步驟:當前web項目導入jar包,在當前的jsp頁面tablib指令引入 即可

2.常用標籤:

① c:if標籤

就相當於,java中 if(){}
    語法
        <c:if test="boolean值"></c:if>
            true:顯示標籤體內容
            false:隱藏標籤體內容
        通常與el表達式一起使用
        注意:此標籤沒有else功能,如果想實現else效果,請讓條件取反

 

<%@ page import="cn.wsl.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<%
    User user = new User();
    user.setUsername("jck");
    request.setAttribute("user", user);
%>

<c:if test="${empty user}">
    你好,請登錄...
</c:if>

<c:if test="${not empty user}">
    你好,${user.username}
</c:if>
</body>
</html>

② c:forEach標籤

相當於java中的for循環
    1)普通for
        for(int i=1; i<=5; i++){
            i
        }
        <c:forEach begin="1" end="5" step="1" var="i">
            ${i}
        </c:forEach>
            begin="1" 起始值(包含)
            end="5"   結束值(包含)
            step="1"  步長爲1
            var="i"   當前輸出臨時變量
    2)增強for
        for(User user : list){
            user
        }
        <c:forEach items="${list}" var="user" varStatus="vs">
            ${user}
        </c:forEach>
            items="list" 集合
            var="user"   當前輸出的臨時變量
            varStatus="vs" 變量狀態
                index 當前索引 從0開始
                count 計數器   從1開始

<%@ page import="java.util.List" %>
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo</title>
</head>
<body>
<h3>普通for循環</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循環將臨時變量存儲到了 pageContext域空間--%>
    ${i} <br>
</c:forEach>

<h3>增強for循環</h3>
<%
    List<User> list = new ArrayList<>();
    list.add(new User("dilireb", 27, "女"));
    list.add(new User("娜扎", 23, "女"));
    list.add(new User("扎哈", 127, "中"));
    request.setAttribute("list", list);
%>

<c:forEach items="${list}" var="user" varStatus="vs">
   索引:${vs.index} |  計數器: ${vs.count} | ${user.username} <br>
</c:forEach>
</body>
</html>

③ c:choose標籤

相當於java中switch語句
    <c:choose>  等價於 switch
    <c:when>    等價於 case+break
    <c:otherwise> 等價於 default

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo</title>
</head>
<body>
<h3>choose標籤</h3>
<%
    Integer money = 7000;
    request.setAttribute("money", money);
%>
<c:choose>
    <c:when test="${money == 7000}">
        單身汪....
    </c:when>
    <c:when test="${money == 15000}">
        撩小
    </c:when>
    <c:when test="${money > 30000}">
       上完人呢.
    </c:when>
    <c:otherwise>
        奮鬥吧騷年....
    </c:otherwise>
</c:choose>
</body>
</html>

 

三.三層架構

JSP模式是理論基礎,但實際開發中,我們常將服務器端程序,根據邏輯進行分層。一般比較常見的是分三層,我們
稱爲:經典三層體系架構。三層分別是:表示層、業務邏輯層、數據訪問層。
表示層:又稱爲 web層,與瀏覽器進行數據交互的。
業務邏輯層:又稱爲service層,專門用於處理業務數據的。
數據訪問層:又稱爲dao層,與數據庫進行數據交換的。將數據庫的一條記錄與JavaBean進行對應。

 

1.概述:

通常意義上的三層架構就是將整個業務應用劃分爲:表示(現)層、業務邏輯層、數據訪問層。

區分層次的目的 爲了高內聚低耦合的思想

表示(現)層:又稱爲web層,與瀏覽器進行數據交互(控制器和視圖)

業務邏輯層:又稱爲service層,處理業務數據(if判斷,for循環)

數據訪問(持久)層:又稱爲dao層,與數據庫進行交互的(每一條(行)記錄與javaBean實體對應)

項目目錄建立規則:

* com.wsl.基本包(公司域名倒寫)

* com.wsl.dao 持久層

* com.wsl.service 業務層

* ccom.wsl.web 表示層

* com.wsl.domain 實體(JavaBean)

* com.wsl.util 工具

mvc架構:

各層之間會傳遞一些實體對象,cn.wsl.項目名.domain(pojo,vo)

優點:降低各層之間的耦合性,提高各層代碼的複用性

一個項目的完整的分包如下:

cn.wsl公司域名倒寫
cn.wsl.xxx 項目名稱
cn.wsl.xxx.yyy 子模塊
cn.wsl.xxx.yyy.dao 子模塊dao層接口
cn.wsl.xxx.yyy.dao.impl 子模塊dao層實現類
cn.wsl.xxx.yyy.service 子模塊service層接口
cn.wsl.xxx.yyy.service.impl 子模塊service層實現類
cn.wsl.xxx.yyy.domain 子模塊JavaBean (子模塊yyy可省略)
cn.wsl.xxx.yyy.web.servlet 子模塊web層,servlet
cn.wsl.xxx.yyy.web.filter 子模塊web層,filter
cn.wsl.xxx.util 工具
cn.wsl.xxx.exception 自定義異常
cn.wsl.xxx.constant 常量

 

四.案例:

coding:

進行簡單的分包

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>索引</title>
  </head>
  <body>
  <h1><a href="${pageContext.request.contextPath}/FindAllServlet">用戶列表查詢</a></h1>
  </body>
</html>

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>列表</title>

    <style type="text/css">
        #content {
            margin: 0 auto;
            border: red solid 1px;
            width: 800px;
            height: 600px;
        }
        table {
            width: 800px;
        }
        td{
            border: red solid 1px;
        }
    </style>
</head>
<body>

<div id="content">
    <table>
        <tr>
            <td>編號</td>
            <td>姓名</td>
            <td>年齡</td>
            <td>性別</td>
            <td>QQ</td>
        </tr>
        <c:forEach items="${list}" var="user" varStatus="sl">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.sex}</td>
                <td>${user.QQ}</td>
            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>


User.java

package com.wsl.demo.domain;

public class User {
    private String id;

    private String name;

    private String age;

    private String sex;

    private String QQ;

    public User() {
    }

    public User(String id, String name, String age, String sex, String QQ) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.QQ = QQ;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getQQ() {
        return QQ;
    }

    public void setQQ(String QQ) {
        this.QQ = QQ;
    }
}
UserDao.java

package com.wsl.demo.dao;

import com.wsl.demo.domain.User;

import java.util.ArrayList;
import java.util.List;

public class UserDao {

    private static List<User> list = new ArrayList<>();

    static {
        list.add(new User("1","王明明","32","男","9876543"));
        list.add(new User("1","李天一","39","女","8756543"));
        list.add(new User("1","張明天","26","女","4566543"));
        list.add(new User("1","董永","31","男","1298743"));
        list.add(new User("1","李明","35","女","9456743"));
        list.add(new User("1","尚明","22","男","3890543"));
    }


    public List<User> findAll() {
        return list;
    }
}
UserService.java

package com.wsl.demo.service;

import com.wsl.demo.dao.UserDao;
import com.wsl.demo.domain.User;

import java.util.List;

public class UserService {
    public List<User> findAll() {
        UserDao userDao = new UserDao();
       List<User> list = userDao.findAll();
        return list;
    }
}
FindAllServlet.java

package com.wsl.demo.web;

import com.wsl.demo.domain.User;
import com.wsl.demo.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserService userService = new UserService();

        List<User> list = userService.findAll();

        request.setAttribute("list",list);

        request.getRequestDispatcher("/list.jsp").forward(request,response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

 

資料

JSTL標籤與EL表達式

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章