13 JSP、MVC開發模式、EL表達式和JSPL標籤+軟件設計架構---學習筆記

1.JSPhtml

(1)JSP概念:Java Server Pages 即java服務器端頁面
能夠理解爲:一個特殊的頁面,其中既能夠指定定義html標籤,又能夠定義java代碼
用於簡化書寫!!!java

(2)原理
JSP本質上就是一個Servletweb

(3)JSP的腳本:JSP定義Java代碼的方式
  1. <% 代碼 %>:定義的java代碼,在service方法中。service方法中能夠定義什麼,該腳本中就能夠定義什麼。
  2. <%! 代碼 %>:定義的java代碼,在jsp轉換後的java類的成員位置,能夠定義成員變量成員方法。注意:用的較少
  3. <%= 代碼 %>:定義的java代碼,會輸出到頁面上。輸出語句中能夠定義什麼,該腳本中就能夠定義什麼。數據庫

(4)JSP指令數組

做用:用於配置JSP頁面,導入資源文件
格式:
  <%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>tomcat

例如:服務器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

分類:
  1. page指令  : 配置JSP頁面的
    contentType:等同於response.setContentType()
      1. 設置響應體的mime類型以及字符集
      2. 設置當前jsp頁面的編碼(只能是高級的IDE才能生效,若是使用低級工具,則須要設置pageEncoding屬性設置當前頁面的字符集)
        import:導包
        errorPage:當前頁面發生異常後,會自動跳轉到指定的錯誤頁面
        isErrorPage:標識當前也是是不是錯誤頁面。
        true:是,能夠使用內置對象exception
        false:否。默認值。不能夠使用內置對象exceptionsession


  2. include指令 : 頁面包含的。導入頁面的資源文件
    * <%@include file="top.jsp"%>
  3. taglib指令: 導入資源
    * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    * prefix:前綴,自定義的架構

(5)註釋:
  1. html註釋:
    <!-- -->:只能註釋html代碼片斷
  2. jsp註釋:推薦使用
    <%-- --%>:能夠註釋全部mvc


(6) JSP的內置對象:
在jsp頁面中不須要獲取和建立,能夠直接使用的對象
jsp一共有9個內置對象。
  * request
  * response
  * out:字符輸出流對象。能夠將數據輸出到頁面上。和response.getWriter()相似
    * response.getWriter()和out.write()的區別:
    * 在tomcat服務器真正給客戶端作出響應以前,會先找response緩衝區數據,再找out緩衝區數據。
    * response.getWriter()數據輸出永遠在out.write()以前

  變量名              真實類型                 做用
  * pageContext       PageContext         當前頁面共享數據,還能夠獲取其餘八個內置對象
  * request             HttpServletRequest      一次請求訪問的多個資源(轉發)
  * session             HttpSession            一次會話的多個請求間,共享數據
  * application          ServletContext          全部用戶間共享數據
  * response          HttpServletResponse          響應對象
  * page              Object            當前頁面(Servlet)的對象 this
  * out            JspWriter          輸出對象,數據輸出到頁面上
  * config             ServletConfig            Servlet的配置對象
  * exception          Throwable                 異常對象

(7)jsp動做元素

動做元素基本上都是預約義的函數,JSP規範定義了一系列的標準動做,它用JSP做爲前綴,可用的標準動做元素以下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
<body>
    <%--將頁面從index.jsp轉到main.jsp中--%>
    <jsp:forward page="/pages/main.jsp"/>
</body>
</html>

2.MVC:開發模式
(1) jsp演變歷史
  1. 早期只有servlet,只能使用response輸出標籤數據,很是麻煩
  2. 後來又jsp,簡化了Servlet的開發,若是過分使用jsp,在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指令中:isELIgnored="true" 忽略當前jsp頁面中全部的el表達式
    方法2. \${表達式} :忽略當前這個el表達式

(5) 使用:
  1. 運算:
    * 運算符:
      1. 算數運算符: +   -   *   /(div)   %(mod)
      2. 比較運算符: > < >= <= == !=
      3. 邏輯運算符: &&(and)   ||(or)   !(not)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el_test01</title>
</head>
<body>
    ${3>4}<br>
    <hr>
    <h3>算數運算符</h3>
    ${3+4}<br>
    ${3/4}<br>
    ${3 div 4}<br>
    ${3%4}<br>
    ${3 mod 4}<br>
    <hr>
    <h3>比較運算符</h3>
    ${3 == 4}<br>
    <hr>
    <h3>邏輯運算符</h3>
    ${3>4 && 3<4}<br>


</body>
</html>

      4. 空運算符: empty
        * 功能:用於判斷字符串、集合、數組對象是否爲null或者長度是否爲0
        * ${empty list}:判斷字符串、集合、數組對象是否爲null或者長度爲0
        * ${not empty str}:表示判斷字符串、集合、數組對象是否不爲null 而且 長度>0
  2. 獲取值
    1. el表達式只能從域對象中獲取值
    2. 語法:
      1. ${域名稱.鍵名}:從指定域中獲取指定鍵的值
        * 域名稱:
          1. pageScope --> pageContext域
          2. requestScope --> request域
          3. sessionScope --> session域
          4. applicationScope --> application(ServletContext)域
            * 舉例:在request域中存儲了name=張三
            * 獲取:${requestScope.name}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        request.setAttribute("name","lucky");
        session.setAttribute("age","25");
    %>

    <h1>el獲取值</h1>
    ${requestScope.name}
    ${sessionScope.age}
</body>
</html>

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

      3. 獲取對象、List集合、Map集合的值
        1. 對象:${域名稱.鍵名.屬性名}
          * 本質上會去調用對象的getter方法

案例:

User.java

package el;

import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
    private String name;
    private int age;
    private Date birthday;

    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;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getBirthdayStr(){
        if(birthday!=null){
            //1.格式化日期對象
            SimpleDateFormat sdf=new SimpleDateFormat("yy-MM-dd HH:mm:ss");
            String birthday_format = sdf.format(birthday);
            return birthday_format;
        }else {
            return "";
        }
    }
}

el_test03.jsp

<%@ page import="el.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>獲取數據</title>
</head>
<body>
    <%
        User user=new User();
        user.setName("lucky");
        user.setAge(25);
        user.setBirthday(new Date());
        request.setAttribute("user",user);
    %>
    <h3>獲取對象中的值</h3>
    ${user.name}
    ${user.age}
    ${user.birthday}
    ${user.birthdayStr}
</body>
</html>

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

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

<%@ 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>獲取list集合中的值</title>
</head>
<body>
    <%
        List list=new ArrayList();
        list.add("aaa");
        list.add("bbb");
        request.setAttribute("list",list);

        Map map=new HashMap();
        map.put("name","linda");
        map.put("age","28");
        request.setAttribute("map",map);

    %>

    <h3>獲取list集合</h3>
    ${list[0]}

    <h3>獲取map集合</h3>
    ${requestScope.map.name}
</body>
</html>

  3. 隱式對象:
    * el表達式中有11個隱式對象
      * pageContext:
        * 獲取jsp其餘八個內置對象
        * ${pageContext.request.contextPath}:動態獲取虛擬目錄

4.JSTL標籤
(1)JSTL概念:JavaServer Pages Tag Library JSP標準標籤庫
是由Apache組織提供的開源的免費的jsp標籤 <標籤>

(2)JSTL做用:用於簡化和替換jsp頁面上的java代碼

(3) 使用步驟:
  1. 導入jstl相關jar包(javax.servlet.jsp.jstl.jar和jstl-impl.jar這兩個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表達式一塊兒使用
    2. 注意:
      c:if標籤沒有else狀況,想要else狀況,則能夠在定義一個c:if標籤

小案例:判斷數字是奇數仍是偶數

<%@ page import="java.util.List" %>
<%@ 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>jstl標籤</title>
</head>
<body>
    <c:if test="true">
        <h3>我是真</h3>
    </c:if>

    <%
        List list=new ArrayList();
        list.add("aaaa");
        list.add("bbbb");
        request.setAttribute("list",list);
        request.setAttribute("number",3);

    %>

    <%--${not empty list} 判斷集合是否爲空--%>
    <c:if test="${not empty list}">
        遍歷集合
    </c:if>

    <hr>
    <c:if test="${number%2!=0}">
        ${number}是奇數
    </c:if>
</body>
</html>

頁面顯示:

  2. choose標籤:至關於java代碼的switch語句
    1. 使用choose標籤聲明 至關於switch聲明
    2. 使用when標籤作判斷 至關於case
    3. 使用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>choose標籤使用</title>
</head>
<body>
    <%
        request.setAttribute("number",4);
    %>
    <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>
</body>
</html>

頁面顯示:

  3. foreach標籤:至關於java代碼的for語句

    1. 完成重複的操做
      for(int i = 0; i < 10; i ++){

      }
      * 屬性:
        begin:開始值
        end:結束值
        var:臨時變量
        step:步長
        varStatus:循環狀態對象
        index:容器中元素的索引,從0開始
        count:循環次數,從1開始
    2. 遍歷容器
      List<User> list;
      for(User user : list){

      }

      * 屬性:
        items:容器對象
        var:容器中元素的臨時變量
        varStatus:循環狀態對象
        index:容器中元素的索引,從0開始
        count:循環次數,從1開始

小案例:

<%@ page import="java.util.List" %>
<%@ 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>Title</title>
</head>
<body>
    <c:forEach begin="1" end="10" var="i" step="2">
        ${i}<br>
    </c:forEach>

    <%
        List list=new ArrayList();
        list.add("111");
        list.add("222");
        list.add("333");
        request.setAttribute("list",list);
    %>
    <c:forEach items="${list}" var="str" varStatus="s">
        <%--索引--循環次數----%>
        ${s.index} ${s.count} ${str}<br>
    </c:forEach>
</body>
</html>

頁面顯示:

5. 練習:
* 需求:在request域中有一個存有User對象的List集合。須要使用jstl+el將list集合數據展現到jsp頁面的表格table中

5.三層架構:軟件設計架構
(1)界面層(表示層):用戶看的得界面。用戶能夠經過界面上的組件和服務器進行交互
(2)業務邏輯層:處理業務邏輯的。
(3)數據訪問層:操做數據存儲文件。

相關文章
相關標籤/搜索