文章目錄
- 1.JSP介紹
- 2 JSP快速入門
- 3 JSP 腳本
- 3.1 JSP腳本案例
- 3.2 JSP缺點
- 4 EL表達式
- 4.1 快速入門案例
- 5. JSTL標簽
- 6. MVC模式和三層架構
- 6.1 MVC
- 6.2 三層架構
- 7. 案例-基于MVC和三層架構實現商品表的增刪改查
1.JSP介紹
概念
JSP(JavaServer Pages)是一種用于創建動態網頁的技術。
- 它是由Java代碼和HTML標記組成的文件,允許在HTML頁面中嵌入Java代碼,以實現動態內容的生成和交互。 JSP = HTML + Java
- 作用:簡化開發,避免在Servlet中直接輸出html標簽。
JSP原理
JSP本質就是一個Servlet。
JSP 的工作原理可以簡化為以下步驟:請求 -> JSP 編譯 -> Servlet 生成 -> 動態內容生成 -> 響應發送。
- JSP 編譯:當首次訪問一個 JSP 頁面時,Web服務器會將其編譯為一個 Servlet。這個過程只發生一次,生成的 Servlet 會被緩存以提高性能。
- Servlet 生成:在每次請求 JSP 頁面時,Web服務器會將請求轉發給相應的 Servlet。這個 Servlet 是由 JSP 頁面生成的,它負責處理請求并生成動態內容。
- 生成動態內容:在 Servlet 中,JSP 頁面中的靜態內容會被發送到客戶端瀏覽器,而嵌入在 <% %> 和 <%= %> 標記中的 Java
代碼會在服務器端執行。這些代碼可以用于訪問數據庫、處理表單數據、執行業務邏輯等。生成的動態內容將與靜態內容組合在一起,形成完整的響應。- 發送響應:最終生成的響應會被發送給客戶端瀏覽器,然后在瀏覽器中進行渲染和顯示。
2 JSP快速入門
步驟:
- 前提條件:安裝 Java 開發環境(JDK)和一個支持 JSP 的 Web 服務器,如 Apache Tomcat。
- 創建一個新的web項目,并在項目中創建一個JSP文件,文件保存到 Web 項目的合適位置,例如 webapp 目錄下。
- 在jsp文件中導入JSP標簽,使用 <% %> 標記來嵌入 Java 代碼,或使用 <%= %> 標記來輸出 Java 表達式的結果到頁面上。
- 啟動 Web 服務器,例如 Apache Tomcat。
- 使用 Web 瀏覽器訪問 JSP 頁面。在瀏覽器中輸入 JSP 頁面的 URL,例如 http://localhost:8080/your-web-app/your-jsp-file.jsp。
- 擴展 JSP 頁面,添加更多的 HTML 標記、Java 代碼和表達式,以實現更復雜的動態內容和交互邏輯。
導入jsp依賴塊
//scope: 指定依賴項的范圍。在這種情況下,provided 表示該庫將由部署的服務器提供,而不是由項目自身打包。
//它表示該依賴項在編譯和測試階段可用,但在運行時由部署的環境(例如應用服務器)提供。
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency>
<%--Created by IntelliJ IDEA.User: 11445Date: 2023/8/17Time: 18:59To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1> hello jsp 快速入門</h1><%System.out.println("此處是java代碼");
%>
</body>
</html>
啟動服務器,并在瀏覽器訪問該jsp文件
原理解釋:
- 瀏覽器第一次訪問
hello.jsp
頁面tomcat
會將hello.jsp
轉換為名為hello_jsp.java
的一個Servlet
tomcat
再將轉換的servlet
編譯成字節碼文件hello_jsp.class
tomcat
會執行該字節碼文件,向外提供服務
3 JSP 腳本
概念:
在 JSP 頁面中,JSP腳本用于在 JSP頁面內定義 Java代碼。可以使用腳本元素 <% %> 來嵌入 Java 代碼。
JSP 腳本有如下三個分類:
- <%…%>:內容會直接放到_jspService()方法之中
- <%=…%>:內容會放到out.print()中,作為out.print()的參數
- <%!…%>:內容會放到_jspService()方法之外,被類直接包含
1 <% … %>(腳本聲明): 這種形式的腳本元素中的代碼會被插入到生成的 Servlet 的 _jspService() 方法中。它用于在方法內部執行一段邏輯代碼,如條件判斷、循環等。
2. <%= … %>(腳本表達式): 這種形式的腳本元素用于將表達式的結果輸出到頁面上。
- 它會被轉換為 out.print(…) 形式并放置在生成的 Servlet 的 _jspService() 方法中。
3.<%! … %>(腳本片段): 這種形式的腳本元素中的代碼會被插入到生成的 Servlet 類中,而不是方法內部。它可以用于定義類成員變量、方法和構造函數,以供整個 Servlet 的生命周期使用。
<%!void show(){}String name = "zhangsan";
%>
3.1 JSP腳本案例
AIM:模擬從數據庫中導入品牌表
<%@ page import="com.itheima.pojo.Brand" %> // 導入 Brand 類
<%@ page import="java.util.List" %> // 導入 List 類
<%@ page import="java.util.ArrayList" %> // 導入 ArrayList 類
<%@ page contentType="text/html;charset=UTF-8" language="java" %> // 設置頁面的字符集為 UTF-8<%List<Brand> brands = new ArrayList<Brand>(); // 創建 Brand 類型的 List 集合 brandsbrands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1)); // 往 brands 中添加 Brand 對象brands.add(new Brand(2,"優衣庫","優衣庫",200,"優衣庫,服適人生",0)); // 往 brands 中添加 Brand 對象brands.add(new Brand(3,"小米","小米科技有限公司",1000,"為發燒而生",1)); // 往 brands 中添加 Brand 對象
%><!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); // 獲取 brands 集合中的 Brand 對象%><tr align="center"><td><%= brand.getId()%></td> // 輸出 Brand 對象的 id 屬性<td><%= brand.getBrandName()%></td> // 輸出 Brand 對象的 brandName 屬性<td><%= brand.getCompanyName()%></td> // 輸出 Brand 對象的 companyName 屬性<td><%= brand.getOrdered()%></td> // 輸出 Brand 對象的 ordered 屬性<td><%= brand.getDescription()%></td> // 輸出 Brand 對象的 description 屬性<td><%= brand.getStatus()%></td> // 輸出 Brand 對象的 status 屬性<td><a href="#">修改</a> <a href="#">刪除</a></td></tr><%}%></table></body>
</html>
3.2 JSP缺點
由于 JSP頁面內,既可以定義 HTML 標簽,又可以定義 Java代碼,造成了以下問題:
- 書寫麻煩:特別是復雜的頁面 既要寫 HTML 標簽,還要寫 Java 代碼
- 閱讀麻煩 上面案例的代碼,相信你后期再看這段代碼時還需要花費很長的時間去梳理
- 復雜度高:運行需要依賴于各種環境,JRE,JSP容器,JavaEE…
- 占內存和磁盤:JSP會自動生成.java和.class文件占磁盤,運行的是.class文件占內存
- 調試困難:出錯后,需要找到自動生成的.java文件進行調試
- 不利于團隊協作:前端人員不會 Java,后端人員不精 HTML 如果頁面布局發生變化,前端工程師對靜態頁面進行修改,然后再交給后端工程師,由后端工程師再將該頁面改為 JSP頁面。
4 EL表達式
概述
EL(全稱Expression Language )表達式語言: 用于簡化 JSP 頁面內的 Java 代碼(替換獲取數據的代碼)。
- 用于在JSP(JavaServer Pages)頁面中嵌入和處理表達式的語言。EL表達式提供了一種簡化和簡化JSP頁面中的表達式和數據訪問的方式。
EL表達式的語法類似于腳本語言,可以在JSP頁面中通過${…}語法來引用和操作變量、屬性和方法。
- EL 表達式的主要作用是 獲取數據。其實就是從域對象中獲取數據,然后將數據展示在頁面上。
- 而 EL 表達式的語法也比較簡單,${expression} 。例如:${brands} 就是獲取域中存儲的 key 為 brands 的數據
JAVAWeb四大域對象:
el 表達式獲取數據,會依次從這4個域中尋找,直到找到為止。
- page:當前頁面有效
- request:當前請求有效
- session:當前會話有效
- application:當前應用有效
4.1 快速入門案例
案例說明:
定義servlet,在 servlet 中封裝一些數據并存儲到 request 域對象中并轉發到el-demo.jsp
頁面
//定義Servlet用于封裝數據并把數據存儲到域中,并轉發到jsp頁面中@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 準備數據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));//2.存儲到request獄中req.setAttribute("brands",brands);//3.轉發到el-demo.jsp中req.getRequestDispatcher("/el-demo.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page isELIgnored="false" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${brands}
</body>
</html>
5. JSTL標簽
JSTL(JavaServer Pages Standard Tag Library,JSP標準標簽庫)
- 是一個JSP標簽集合,它封裝了JSP應用的通用核心功能。
- aim:使用標簽替換并取代JSP頁面上的java代碼
1. 導入坐標
<dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency>
2. 在JSP頁面上引入JSTL標簽庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3. 使用標簽
if 標簽
<c:if>
:相當于 if 判斷屬性:test,用于定義條件表達式
<c:if test="${flag == 1}">男
</c:if>
<c:if test="${flag == 2}">女
</c:if>
代碼演示:
-
定義一個
servlet
,在該servlet
中向 request 域對象中添加 鍵是status
,值為1
的數據@WebServlet("/demo2") public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 存儲數據到request域中request.setAttribute("status",1);//2. 轉發到 jstl-if.jsp數據request.getRequestDispatcher("/jstl-if.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }
-
定義
jstl-if.jsp
頁面,在該頁面使用<c:if>
標簽<%@ 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:if:來完成邏輯判斷,替換java if else--%><c:if test="${status ==1}">啟用</c:if><c:if test="${status ==0}">禁用</c:if> </body> </html>
6. MVC模式和三層架構
關于MVC和三層架構的理解:https://blog.csdn.net/weixin_43232955
關于三層架構與MVC的區別:https://blog.csdn.net/qq_52596258
https://blog.csdn.net/qq_42052589/article/details/106132293
三層架構和MVC的本質區別:同:三層架構和MVC是兩種常見的軟件架構設計模式
---------------------------------------------------------------------------------
三層架構是一種將軟件系統劃分為表示層、業務邏輯層和數據訪問層的架構模式。
它的目標是將系統的不同功能模塊分離,使得各個模塊可以獨立開發、測試和維護。
- 表示層負責用戶界面展示和交互
- 業務邏輯層處理具體的業務邏輯
- 數據訪問層負責與數據庫或其他數據存儲進行交互
這種分層結構有助于提高系統的可擴展性、可維護性和重用性。
---------------------------------------------------------------------------------
MVC是一種將應用程序劃分為M(模型)、V(視圖)和C(控制器)三個組成部分的架構模式。
- 模型負責處理數據和業務邏輯
- 視圖負責用戶界面的展示
- 控制器負責處理用戶輸入和調度模型與視圖之間的交互
MVC的主要目標是將應用程序的邏輯與界面分離,使得各個組件可以獨立開發和測試。這種分離可以提高代碼的可維護性、可測試性和重用性。
---------------------------------------------------------------------------------
本質上說,三層架構強調的是將系統按照功能模塊進行分層,更關注整個系統的結構和組織。
MVC強調的是將應用程序按照職責進行分離,關注應用程序內部的交互和邏輯。
6.1 MVC
MVC 是一種分層開發的模式
MVC(Model View Controller)是軟件工程中的一種軟件架構模式,它把軟件系統分為模型、視圖和控制器三個基本部分。
//最典型的MVC就是JSP+Servlet+JavaBean的模式。
M:Model,業務模型,處理業務
V:View,視圖,界面展示
C:Controller,控制器,處理請求,調用模型和視圖
- 控制器Controller 的作用就是將Model 與 View一一對應起來
MVC 好處:
職責單一,互不影響。每個角色做它自己的事,各司其職。
有利于分工協作。
有利于組件重用
6.2 三層架構
三層架構是將我們的項目分成了三個層面,分別是
表現層
、業務邏輯層
、數據訪問層
。
- 數據訪問層: 對
數據庫的CRUD
基本操作- 業務邏輯層: 對業務邏輯進行封裝,組合數據訪問層層中基本功能,形成復雜的業務邏輯功能。
例如注冊業務功能
,我們會先調用數據訪問層
的selectByName()
方法判斷該用戶名是否存在,如果不存在再調用數據訪問層
的insert()
方法進行數據的添加操作- 表現層: 接收請求,封裝數據,調用業務邏輯層,響應數據
整個流程
- 瀏覽器發送請求
- 表現層的Servlet接收請求并調用業務邏輯層的方法進行業務邏輯處理
- 業務邏輯層方法調用數據訪問層方法進行數據的操作,處理完成依次返回到serlvet
- 然后servlet將數據交由JSP 進行展示。