JSP-學習筆記

文章目錄

      • 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 生成 -> 動態內容生成 -> 響應發送。

  1. JSP 編譯:當首次訪問一個 JSP 頁面時,Web服務器會將其編譯為一個 Servlet。這個過程只發生一次,生成的 Servlet 會被緩存以提高性能。
  2. Servlet 生成:在每次請求 JSP 頁面時,Web服務器會將請求轉發給相應的 Servlet。這個 Servlet 是由 JSP 頁面生成的,它負責處理請求并生成動態內容。
  3. 生成動態內容:在 Servlet 中,JSP 頁面中的靜態內容會被發送到客戶端瀏覽器,而嵌入在 <% %> 和 <%= %> 標記中的 Java
    代碼會在服務器端執行。這些代碼可以用于訪問數據庫、處理表單數據、執行業務邏輯等。生成的動態內容將與靜態內容組合在一起,形成完整的響應。
  4. 發送響應:最終生成的響應會被發送給客戶端瀏覽器,然后在瀏覽器中進行渲染和顯示。

在這里插入圖片描述

2 JSP快速入門

步驟:

  1. 前提條件:安裝 Java 開發環境(JDK)和一個支持 JSP 的 Web 服務器,如 Apache Tomcat。
  2. 創建一個新的web項目,并在項目中創建一個JSP文件,文件保存到 Web 項目的合適位置,例如 webapp 目錄下。
  3. 在jsp文件中導入JSP標簽,使用 <% %> 標記來嵌入 Java 代碼,或使用 <%= %> 標記來輸出 Java 表達式的結果到頁面上。
  4. 啟動 Web 服務器,例如 Apache Tomcat。
  5. 使用 Web 瀏覽器訪問 JSP 頁面。在瀏覽器中輸入 JSP 頁面的 URL,例如 http://localhost:8080/your-web-app/your-jsp-file.jsp。
  6. 擴展 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文件
在這里插入圖片描述

原理解釋:

  1. 瀏覽器第一次訪問 hello.jsp 頁面
  2. tomcat 會將 hello.jsp 轉換為名為 hello_jsp.java 的一個 Servlet
  3. tomcat 再將轉換的 servlet 編譯成字節碼文件 hello_jsp.class
  4. 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()
    方法進行數據的添加操作
  • 表現層: 接收請求,封裝數據,調用業務邏輯層,響應數據

整個流程

  1. 瀏覽器發送請求
  2. 表現層的Servlet接收請求并調用業務邏輯層的方法進行業務邏輯處理
  3. 業務邏輯層方法調用數據訪問層方法進行數據的操作,處理完成依次返回到serlvet
  4. 然后servlet將數據交由JSP 進行展示。

在這里插入圖片描述

7. 案例-基于MVC和三層架構實現商品表的增刪改查

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Azure存儲賬戶

存儲賬戶的概念 Azure存儲賬戶是Azure提供的一種云存儲解決方案&#xff0c;用于存儲和訪問各種類型的數據&#xff0c;包括文件、磁盤、隊列、表格和Blob&#xff08;二進制大對象&#xff09;數據。存儲賬戶可以基于訪問模式和冗余需求來選擇不同的類型&#xff0c;以滿足應…

【MySQL--->表的操作】

文章目錄 [TOC](文章目錄) 一、創建表二、查看表三、修改表四、刪除表drop table 表名; ![在這里插入圖片描述](https://img-blog.csdnimg.cn/15227b8335364d41bd01b4b4dd83ee55.png) 一、創建表 語句格式:create table 表名(列名 類型,…)字符集 校驗規則 存儲引擎;字符集和校…

我還不知道?Android組件化插件化模塊化

Android組件化、插件化和模塊化是針對Android應用程序開發的一種架構設計思想和開發方式。 組件化&#xff08;Componentization&#xff09;&#xff1a; 組件化是將一個大型的Android應用程序拆分成多個獨立的組件&#xff08;Module&#xff09;&#xff0c;每個組件可以獨…

python使用裝飾器記錄方法耗時

思路 python使用修飾器記錄方法耗時&#xff0c;目的是每當方法執行完后&#xff0c;可以記錄該方法耗時&#xff0c;而不需要在每個方法的執行前后&#xff0c;去創建一個臨時變量&#xff0c;來記錄耗時。 方式一&#xff08;不推薦&#xff09;&#xff1a; 在每個方法的…

source insight 添加宏-文件頭加注釋

source insight 3.5 自帶的一些宏&#xff0c;在安裝目錄下的 utils.em 文件中&#xff0c;用戶也可以自己寫文件&#xff0c;命令為xxx.em &#xff0c;然后把這個文件添加到項目中即可&#xff0c;添加后在菜單欄 Options -> Key Assignments 里輸入macro 就能顯示新添加的…

第一個ArkTS項目實踐-鴻蒙ArkTS

第一個ArkTS項目實踐-ArkTS 第一個ArkTS項目實踐-ArkTS自定義組件的組成配置屬性與布局配置屬性布局 改變組件狀態循環渲染列表數據代碼ToDoItem組件ToDoList頁面 效果參考資料 第一個ArkTS項目實踐-ArkTS 本篇文章是官網上視頻對ArkTS開發實踐的第一個視頻&#xff0c;主要是引…

Matplotlib數據可視化(三)

目錄 1.繪圖的填充 1.1 曲線下方區域的填充 1.2 填充部分區域 1.3 兩條曲線之間的區域填充 1.4 直接使用fill進行填充 1.繪圖的填充 繪圖的填充可以調用fill_between()或fill()進行填充。 1.1 曲線下方區域的填充 x np.linspace(0,1,500) y np.sin(3*np.pi*x)*np.exp…

【C語言】每日一題(找到所有數組中消失的數字)

找到所有數組中消失的數字&#xff0c;鏈接奉上。 這里簡單說一下&#xff0c;因為還沒有接觸到動態內存&#xff0c;數據結構&#xff0c;所以知識有限&#xff0c;也是盡力而為&#xff0c;結合題庫的評論區找到了適合我的解法&#xff0c;以后有機會&#xff0c;會補上各種…

如何在HTML中使用React

突發奇想 查了查真的可以,官方文檔: 在網站中添加 React – React 開始 引入js <!-- 開發環境使用 --><script src"https://unpkg.com/react18/umd/react.development.js"></script><script src"https://unpkg.com/react-dom18/umd/reac…

穿越數字奇境:探尋元宇宙中的科技奇跡

隨著科技的迅速發展&#xff0c;元宇宙正逐漸成為一個備受關注的話題&#xff0c;它不僅是虛擬現實的延伸&#xff0c;更是將現實世界與數字世界融合的未來典范。在這個神秘而充滿活力的數字奇境中&#xff0c;涉及了眾多領域和技術&#xff0c;為我們呈現出了一個無限的創新和…

創建Azure資源鎖

鎖的介紹 在Azure中&#xff0c;資源鎖是一種用于保護訂閱、資源組或者單個資源的機制。它可以防止對受鎖定的資源進行刪除或修改操作&#xff0c;幫助確保資源的連續可用性和安全性。 Azure中的資源鎖可以分為兩種類型&#xff1a; 刪除鎖&#xff08;CanNotDelete&#xf…

elementUI遇到的問題記錄

一、 組件&#xff1a;el-table 問題&#xff1a;使用動態數據創建多級表頭后&#xff0c;刷新頁面時&#xff0c;table行會串行&#xff0c;某些列丟失&#xff0c;圖片列未顯示圖片 解決方案&#xff1a;給el-table增加key <el-table :key"${Matn.random()}${ite…

javaScript:模板字符串讓你忘記字符串拼接

目錄 一.前言 二.模板字符串的使用 1.介紹 2.模板字符串 支持換行 模板字符串更適合元素寫入 innerHTML模板字符串寫法 3.模板字符串中&#xff0c;可以運行表達式 4.模板字符串中可以運行函數 三.總結 語法&#xff1a; 多行字符串&#xff1a; 變量插值&#xff1a; …

μCOS-Ⅲ_簡介

μCOS-Ⅲ簡介 文章目錄 μCOS-Ⅲ簡介前言一、什么是 C/OS-III&#xff1f;二、C/OS-III的特點三、C/OS-III的版本和參考資料1、C/OS-III版本2、C/OS-III源碼獲取3、C/OS-III參考資料 四、C/OS-III源碼簡介總結 前言 μcos-III是一個可以基于ROM運行的、可裁剪的、搶占式、實時…

uniapp Vue 使用 sip.js進行語音通話視頻通話

下載或者安裝 sip.js 到 uniapp 項目&#xff0c;APP 端在 menifest.json 中配置麥克風權限 menifest.json 中 app 權限配置選中&#xff1a; android.permission.RECORD_AUDIO android.permission.MODIFY_AUDIO_SETTINGS sip.js 低版本 如 V0.13.0 版本的寫法 <template&…

latex 筆記:cs論文需要的排版格式

主要針對英文文獻 1 基本環境 連字符 不同長度的"-"表示不同含義。 一個"-"長度的連字符用于詞中兩個"-"長度的連字符常用于制定范圍三個"-"長度的連字符是破折號數學中的負數要用數學環境下的-得到 強調 在正式文章中, 通常不…

神經網絡基礎-神經網絡補充概念-48-rmsprop

概念## 標題 RMSProp&#xff08;Root Mean Square Propagation&#xff09;是一種優化算法&#xff0c;用于在訓練神經網絡等機器學習模型時自適應地調整學習率&#xff0c;以加速收斂并提高性能。RMSProp可以有效地處理不同特征尺度和梯度變化&#xff0c;對于處理稀疏數據和…

Open3D點云數據處理(二十):最小二乘直線擬合(三維)

文章目錄 1 最小二乘三維直線擬合原理2 代碼實現3 直線擬合的評估指標4 計算擬合的評估指標5 np.linalg.lstsq() 函數詳解專欄目錄:Open3D點云數據處理(Python) 1 最小二乘三維直線擬合原理 最小二乘三維直線擬合的原理是通過最小化數據點到直線距離的平方和,找到最優的直…

ARM64 程序調用標準

ARM64 程序調用標準 1 Machine Registers1.1 General-purpose Registers1.2 SIMD and Floating-Point Registers 2 Processes, Memory and the Stack2.1 Memory Addresses2.2 The Stack2.2.1 Universal stack constraints2.2.2 Stack constraints at a public interface 2.3 Th…

【C語言】字符串和內存函數的介紹 -- 詳解

重點介紹處理字符和字符串的庫函數的使用和注意事項。 C語言中對字符和字符串的處理很是頻繁&#xff0c;但是C語言本身是沒有字符串類型的&#xff0c;字符串通常放在常量字符串中或者字符數組中。字符串常量適用于那些對它不做修改的字符串函數。 一、求字符串長度?strlen …