1. 程式人生 > 實用技巧 >JavaWeb - JSP核心、MVC開發模式、EL表示式、JSTL標籤、三層架構

JavaWeb - JSP核心、MVC開發模式、EL表示式、JSTL標籤、三層架構

1. JSP核心

  1. 指令

    * 作用:用於配置JSP頁面,匯入資原始檔

    * 格式:

      <%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>

    * 分類:

      1. page : 配置JSP頁面的

        * contentType:等同於response.setContentType()

          1. 設定響應體的MIME型別以及字符集

          2. 設定當前JSP頁面的編碼(只能是高階的IDE才能生效,如果使用低階工具,則需要設定pageEncoding屬性設定當前頁面的字符集)

        * import:導包

        * errorpage:當前頁面發生異常後,會自動跳轉到指定的錯誤頁面

        * iserrorpage:標識當前頁面是否是錯誤頁面

          * true:是,可以使用內建物件exception

          * false:否,預設值。不可以使用內建物件exception

      2. include :頁面包含的。匯入頁面的資原始檔,比如大家都需要同樣的一個頭資訊,就不用重複寫,直接包含進來即可

      3. taglib :匯入資源

        *<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

          * prefix為自定義字首 JSTL一般用c

  2. 註釋

    1. html註釋:<!- - - - >:只能註釋html程式碼片段

    2. jsp註釋:<%- - - -%>:可以註釋所有

  3. 內建物件

    * 在jsp頁面中不需要建立,直接使用的物件

    * 一共有9個:

      * pageContext: 真實型別:pageContext 作用:當前頁面共享資料,還可以獲取其他八個內建物件

      * request:   真實型別:HttpServletRequest 作用:一次請求訪問的多個資源(轉發)間共享資料

      * session     真實型別:HttpSession 作用:一次會話的多個請求間共享資料

      * application  真實型別:ServletContext 作用:所有使用者間共享資料

      * response   真實型別:HttpServletResponse 作用:響應物件

      * page     真實型別:Object 作用:當前頁面(Servlet)物件 this

      * out      真實型別:JspWriter 作用: 輸出物件,資料輸出到頁面上

      * config     真實型別:ServletConfig 作用:Servlet的配置物件

      * exception   真實型別:Throwable 作用:異常物件

2. MVC開發模式

  1. jsp演變歷史

    1. 早期只有servlet,只能使用response輸出標籤資料,非常的麻煩

    2. 後來有了jsp,簡化了Servlet的開發,如果過度使用sp,在jsp中既寫大量的java程式碼,又寫html標籤,造成難以維護,難於分工協作

    3. 再後來,java的web開發,借鑑mvc開發模式,使得程式的設計更加合理

  2. MVC

    1. M:Model,模型。JavaBean

      * 完成具體的業務操作,如:查詢資料庫、封裝物件

    2. V:View,檢視。JSP

      * 展示資料

    3. C:Controller,控制器。Servlet

      * 獲取使用者的輸入

      * 呼叫模型

      * 將資料交給檢視進行展示

    * 優缺點:

      1. 優點:

        1. 耦合性低,方便維護,可以利於分工協作

        2. 重用性高

      2. 缺點:

        1. 使得專案的架構變得複雜,對開發人員要求高

3. EL表示式

  1. 概念:Expression Language 表示式語言

  2. 作用:替換和簡化jsp頁面中java程式碼的編寫

  3. 語法:${ 表示式 }

  4. 注意:

    * jsp預設支援EL表示式。 如果要忽略el表示式

      1. 設定jsp中page指令中:isELIgnore="true" 忽略當前jsp頁面中所有的EL表示式

      2.\${ } : 忽略當前這個EL表示式

  5. 作用

    1. 運算

      * 運算子:

        1. 算數運算子: + - * /(div) %(mod)

        2. 比較運算子: > < = >= <= == !=

        3. 邏輯運算子:&&(and) ||(or) !(not)

        4. 空運算子:empty

          * 功能:用於判斷字串、集合、陣列物件是否為null或者長度是否為0

          * ${ not empty list }:表示判斷字串、集合、陣列物件是否不為null 並且長度大於0

    2. 獲取值

      1. 注意事項:el表示式只能從域物件中獲取值

      2. 語法:

        1. ${ 域名稱 . 鍵名稱 }:從指定域中獲取指定鍵的值

          * 域名稱:

            1. pageScope - - > pageContext

            2. requestScope - - > request

            3. sessionScope - - > session

            4. application - - > application(ServletContext)

          * 舉例:如在request域中儲存了name=張三

            獲取:${ requestScope.name }

        2. ${ 鍵名 }:表示依次從最小的域中去查詢是否有該鍵對應的值,直到找到為止

        3. 獲取物件、List集合、Map集合

          1. 物件的值:通過的是物件的屬性來獲取 ${ 域名稱.鍵名.屬性名} 本質上會去呼叫物件的getter方法

            # 屬性:指的是setter或getter方法,去掉set或get,再將剩餘部分變為小寫。 如setName - - > name

          2. List集合:${ 域名稱.鍵名[索引]}

          3. Map集合:${ 域名稱.鍵名.key名稱} 或 ${ 域名稱.鍵名['key名稱']}

      3. 隱式物件:

        * el表示式中有11個隱式物件

        * pageContext:

          * 獲取jsp其他八個內建物件

            在jsp頁面中動態獲取虛擬目錄: ${ pageContext.request.contextPath }

4. JSTL

  1. 概念:JavaServer Pages Tag Library : JSP標準標籤庫

    * 是由Apache組織提供的開源的免費的jsp標籤

  2. 作用:用於簡化和替換jsp頁面上的java程式碼

  3. 使用步驟:

    1. 匯入JSTL相關jar包

    2. 引入標籤庫:taglib指令 :<%@ taglib %> 如:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    3. 使用標籤

  4. 常用的JSTL標籤

    1. if :相當於java程式碼的if語句

      1. 屬性:

        * test 必須屬性,接收boolean表示式

          * 如果表示式為true,則顯示if標籤體內容,如果為false,則不顯示標籤體內容

          * 一般情況下,test屬性值會結合el表示式一起使用

            如:判斷request域中的一個list集合是否為空,如果不為null則顯示遍歷集合 : <c:if test="${ not empty requestScope.list}"> 遍歷集合 </c:if>

    2. choose:相當於java程式碼的switch when標籤做數字判斷 otherwise做其他情況的宣告

      * 案例:完成數字編號對應星期幾的案例

  <%
    request.setAttribute("number",3);
  %>
  <c:choose>
      <c:when test="${number==1}">星期一</c:when>
      <c:when test="${number==2}">星期二</c:when>
      <c:when test="${number==3}">星期三</c:when>
      <c:when test="${number==4}">星期四</c:when>
      <c:when test="${number==5}">星期五</c:when>
      <c:when test="${number==6}">星期六</c:when>
      <c:when test="${number==7}">星期天</c:when>
      <c:otherwise>數字輸入有誤</c:otherwise>
  </c:choose>

    3. foreach:相當於java程式碼的for迴圈

      * 屬性:

        (普通for迴圈時)

        begin:開始值

        end:結束值

        var:臨時變數

        step:步長

        varStatus:迴圈狀態物件

          index:容器中元素的索引,從0開始

          count:迴圈次數,從1開始

 <c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
      ${s.index} ${s.count}
  </c:forEach>

        (遍歷容器時)

        items:容器物件

        var:容器中元素的臨時變數

   <%
    List list = new ArrayList<>();
    list.add("aaa");
    list.add("ccc");
    request.setAttribute("list",list);
  %>
  <c:forEach items="${list}" var="str" varStatus="s">
      ${s.index} ${s.count} ${str}<br>
  </c:forEach>

  5. 練習

    * 需求:在request域中有一個存有User物件的List集合。需要使用JSTL+EL將list集合資料展示到jsp頁面的表格table中

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    List list = new ArrayList();
    list.add(new User("張三",23,new Date()));
    list.add(new User("李四",24,new Date()));
    list.add(new User("王五",25,new Date()));
    request.setAttribute("list",list);
%>

<table border="1" width="500" align="center">
    <tr>
        <th>編號</th>
        <th>姓名</th>
        <th>年齡</th>
        <th>生日</th>
    </tr>
    <%--資料化--%>
    <c:forEach items="${list}" var="user" varStatus="s">
        <c:if test="${s.count % 2== 0}">
            <tr bgcolor="#ffd700">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birthday}</td>
            </tr>
        </c:if>

        <c:if test="${s.count % 2== 1}">
            <tr bgcolor="aqua">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birthday}</td>
            </tr>
        </c:if>

    </c:forEach>
</table>

</body>
</html>
案例實現

5. 三層架構

  1. 介面層(表示層):使用者看的到的介面。使用者可以通過節目上的元件和伺服器進行互動

  2. 業務邏輯層:處理業務邏輯。

  3. 資料訪問層:操作資料儲存檔案

6. 案例:使用者資訊列表展示

  1. 需求:使用者資訊的增刪改查操作

  2. 設計:

    1. 技術選型:Servlet + JSP + MySQL + JDBCTemplate + Druid + BeanUtils + tomcat

    2. 資料庫設計

      create database day17; - - 建立資料庫

      use day17; - - 使用資料庫

      create table user( - - 建立表

        id int primary key auto_increatment,

        name varchar(20) not null,

        gender varchar(5),

        age int,

        address varchar(32),

        qq varchar(20),

        email varchar(50)

        );

    3. 開發:

      1. 環境搭建

        1. 建立資料庫環境

        2. 建立專案,匯入需要的jar包

      2. 編碼

    4. 測試

    5. 部署運維