JavaWeb核心篇(3)——JSP,MVC,三層架構

JavaWeb核心篇(3)——JSP,MVC,三層架構

在本篇文章中我們會學習到JSP,MVC,三層架構

雖然JSP已經快被時代所淘汰,但是在一些老舊的工作場所還是有在使用,所以了解一下也不為過

至於MVC和三層架構,應該是屬於核心思想部分

JSP

首先我們先來簡單介紹一下JSP:

  • 概念:Java Server Pages ,Java服務端頁面
  • 一種動態的網頁技術,其中既可以定義HTML,JS,CSS等靜態內容,還可以定義Java代碼的動態內容
  • JSP = HTML + Java
  • JSP的作用:簡化開發,避免了在Servlet中直接輸出HTML標籤的問題

我們先來了解一下未開發JSP之前,Servlet是如何輸出HTML標籤的:

// Servlet通過writer的write方法進行一行一行的輸出:
// 例如:
Writer.write("<html>");
Writer.write("<body>");
Writer.write("username");
Writer.write("</body>");
Writer.write("</html>");

所以在古老版本,JSP的開發實際上很大程度的遍歷了編程

JSP快速入門

JSP需要導入jar包才可以使用,這裡我們採用Maven來進行操作:

  1. 導入JSP坐標(注意:使用範圍為provided)
            <dependency>
        		<groupId>javax.servlet.jsp</groupId>
        		<artifactId>jsp-api</artifactId>
        		<version>2.2</version>
       			<scope>provided</scope>
    		</dependency>
  1. 創建JSP文件
  2. 編寫HTML和Java代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>hello jsp</h1>

    <%
        System.out.println("hello,jsp~");
        int i = 3;
    %>


    <%="hello"%>
    <%=i%>

    <%!
        void  show(){}
        String name = "zhangsan";
    %>


</body>
</html>

JSP原理

在介紹JSP的腳本語法之前,我們先了解一下JSP的原理:

  • JSP本質上是一個Servlet
  • JSP在被訪問時,由JSP容器(Tomcat)將其轉換為Java文件(Servlet),在由JSP容器(Tomcat)將其編譯,最終對外提供服務的其實是這個位元組碼文件

JSP腳本

JSP中可以直接書寫HTML代碼,因為JSP會自動將文本帶入到out的write方法中去

但是Java的內容不能直接輸出,需要採用腳本方法

JSP的腳本主要分為三種:

  1. <% … %>:
  • 內容會直接放到_jspService()方法中去
  • 屬於正常Java代碼,在運行時調用
<%
System.out.println("hello,jsp~");
%>
  1. <%= … %>:
  • 內容會放到out.print()方法中,作為out.print()的參數
  • 作為輸出
<=%
"Hello JSP"
%>
  1. <%! … %>:
  • 內容會放到_jspService()方法之外,被類直接包含
  • 作為成員函數或者成員變量
<!%
String name;
void method(){};
%>

注意:在<%%> 中不可以輸入HTML,如果想使用for或if等方法需要在{}之間插入%><%來結束腳本內容來書寫HTML標籤

代碼示例:

<%@ page import="com.itheima.pojo.Brand" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    // 查詢數據庫
    List<Brand> brands = new ArrayList<Brand>();
    brands.add(new Brand(1,"三隻松鼠","三隻松鼠",100,"三隻松鼠,好吃不上火",1));
    brands.add(new Brand(2,"優衣庫","優衣庫",200,"優衣庫,服適人生",0));
    brands.add(new Brand(3,"小米","小米科技有限公司",1000,"為發燒而生",1));

%>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
    <tr>
        <th>序號</th>
        <th>品牌名稱</th>
        <th>企業名稱</th>
        <th>排序</th>
        <th>品牌介紹</th>
        <th>狀態</th>
        <th>操作</th>

    </tr>



    <%
        for (int i = 0; i < brands.size(); i++) {
            Brand brand = brands.get(i);
    %>

    <tr align="center">
        <td><%=brand.getId()%></td>
        <td><%=brand.getBrandName()%></td>
        <td><%=brand.getCompanyName()%></td>
        <td><%=brand.getOrdered()%></td>
        <td><%=brand.getDescription()%></td>

        <%
            if(brand.getStatus() == 1){
                //顯示啟用
        %>
            <td><%="啟用"%></td>
        <%
            }else {
                // 顯示禁用
        %>
            <td><%="禁用"%></td>
        <%
            }
        %>

        <td><a href="#">修改</a> <a href="#">刪除</a></td>
    </tr>

    <%
        }
    %>



</table>

</body>
</html>

JSP缺點

我們之前說到JSP已經被時代所淘汰,所以我們現在來談論一下JSP的缺點:

  • 書寫麻煩,特別對於複雜的頁面
  • 閱讀麻煩
  • 複雜度高,運行時需要依賴各種環境
  • 佔用內存和磁盤,JSP會自動生成Java和class文件占磁盤,運行的是class文件占內存
  • 調試困難,出錯後需要找到自動生成的Java代碼調試
  • 不利於團隊協作,現在一般都是前後端分離,技術不協調

最開始由Servlet單獨運作,到後來由JSP單獨運作,再後來由Servlet和JSP合作運行:

  • Servlet:負責邏輯處理,封裝數據
  • JSP:負責獲得數據,便於展現數據

到了如今已經基本完全被HTML和Ajax替代

EL表達式

EL表達式是一種表達式語言,用於簡化JSP頁面的Java代碼:

  • 主要功能:獲得數據
  • 語法:${expression}
${brands}:表示獲得域(request)中存儲的key為brands的數據

然後我們來介紹一下JavaWeb中的四大域對象:

  • page:當前頁面有效
  • request:當前請求有效
  • session:當前會話有效
  • application:當前應用有效

EL表達式獲得數據,會依次從這四個域中尋找,直到找到為止

域值範圍: page < request < session < application

JSTL標籤

我們使用JSTL標籤需要先導入jar包,這裡我們同樣使用Maven導入:

  1. 導入坐標
	<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.1.2</version>
	</dependency>
	<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
	</dependency>
  1. 在JSP頁面上導入JSTL標籤庫
<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>
  1. 使用即可
<c:if>
</c:if>

因為JSTL並不常用,我們在這裡只介紹簡單的if和for循環:

  1. if語句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--
        c:if:來完成邏輯判斷,替換java  if else
    --%>
<%--

    <c:if test="true">
        <h1> true </h1>
    </c:if>

    <c:if test="false">
        <h1> false </h1>
    </c:if>
--%>
    <c:if test="${status ==1}">
        啟用
    </c:if>

    <c:if test="${status ==0}">
        禁用
    </c:if>

</body>
</html>
  1. for語句
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
    <tr>
        <th>序號</th>
        <th>品牌名稱</th>
        <th>企業名稱</th>
        <th>排序</th>
        <th>品牌介紹</th>
        <th>狀態</th>
        <th>操作</th>

    </tr>


    <!-- 
	c:forEach -> for(int i : nums) 
	items -> nums
	var -> i
	varStatus -> 狀態碼;
	varStatus有兩個屬性,
	status.index 屬性:當前迭代的元素在集合中的索引,從 0 開始。
	status.count 屬性:當前迭代的元素是集合中第幾個元素,從 1 開始。
	--> 
    <c:forEach items="${brands}" var="brand" varStatus="status">
        <tr align="center">
            <%--<td>${brand.id}</td>--%>
            <td>${status.count}</td>
            <td>${brand.brandName}</td>
            <td>${brand.companyName}</td>
            <td>${brand.ordered}</td>
            <td>${brand.description}</td>
            <c:if test="${brand.status == 1}">
                <td>啟用</td>
            </c:if>
            <c:if test="${brand.status != 1}">
                <td>禁用</td>
            </c:if>

            <td><a href="#">修改</a> <a href="#">刪除</a></td>
        </tr>

    </c:forEach>




</table>


<hr>

<!--
c:forEach -> 對標普通循環
begin:開始數
end:結束數
var:當前數
step:步長(begin = begin + step)
-->
    
    
<c:forEach begin="1" end="10" step="1" var="i">
    <a href="#">${i}</a>
</c:forEach>


</body>
</html>

MVC模式

首先我們先來了解一下MVC:

  • MVC是一種分層開發的模式
  • M:Model,業務模型,處理業務
  • V:View,視圖,頁面展示
  • C:Controller,控制器,處理請求,調用模型和視圖

MVC優點:

  • 責任單一,互不影響
  • 有利於分工協作
  • 有利於組件重用

三層架構

我們對上面三層進行簡單的解釋:

  • 表現層:接受請求,封裝數據,調用業務邏輯層,響應數據
  • 業務邏輯層:對業務邏輯進行封裝,組合數據訪問層層中基本功能,形成複雜的業務邏輯功能
  • 數據訪問層:對數據庫的CRUD基本操作

結束語

好的,關於JSP和MVC三層架構我們就到這裡

附錄

該文章屬於學習內容,具體參考B站黑馬程序員陳老師的JavaWeb課程

這裡附上鏈接:01-JSP概述&快速入門&原理_嗶哩嗶哩_bilibili

Tags: