Spring Boot 項目中使用 JSP

文章目錄

  • Spring Boot 項目中使用 JSP
    • 項目結構
    • 引入依賴包
    • 編寫頁面和后臺
    • 運行
      • 方式一:Maven 命令運行
      • 方式二:在 IDEA 中運行
      • 方式三:打 war 包部署運行

Spring Boot 項目中使用 JSP

在 Spring Boot 項目中不是不可以使用 JSP 。想在 Spring Boot 中使用 JSP,需要滿足一些特殊要求。

項目結構

Spring Boot 項目想要支持 JSP,其項目結構必須如下:

spring-boot-jsp
├── pom.xml
└── src├── main│   ├── java│   ├── resouces│   └── webapp│       └── WEB-INF│           └── jsp│               └── welcome.jsp└── test

在配置文件 application.properties 中進行配置:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
  • spring.mvc.view.prefix 指明 jsp 文件在 webapp 下的哪個目錄

  • spring.mvc.view.suffix 指明 jsp 以什么樣的后綴結尾

引入依賴包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId>
</dependency>
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId>
</dependency>
  • spring-boot-starter-web 包依賴了 spring-boot-starter-tomcat,因此,后者不再需要單獨配置;

  • jstl 是一個 JSP 的 jstl 標簽庫;

  • tomcat-embed-jasper 主要用來支持 JSP 的解析和運行。

編寫頁面和后臺

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
Time: ${time}
<br>
Message: ${message}
</body>
</html>
@Controller
public class WelcomeController {@GetMapping("/")public String welcome(Model model) {model.addAttribute("time", new Date());model.addAttribute("message", "hello world");return "welcome";}}

運行

方式一:Maven 命令運行

cmd 進入項目根路徑下,執行:

mvn clean spring-boot:run

補充:IDEA 的 Maven 工具窗口中,有個 M 圖標,通過點擊它在彈出的窗口中可直接手動執行 maven 命令。

方式二:在 IDEA 中運行

如果像其他項目一樣,直接在 IDEA 中通過 main 方法來啟動項目,在訪問測試的時候會出現 404 not found

這是因為 Spring Boot JSP 項目需要額外進行一個設置:選擇 Edit Configurations 選項,打開 Configuration,為 Working directory 賦值為項目的根目錄。

springboot-jsp-1

方式三:打 war 包部署運行

  • step 1 :在 pom.xml 里設置打包格式為 war

    <packaging>war</packaging>
    
  • step 2:排除內嵌的 Tomcat 依賴,避免 jar 包沖突。

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除內置容器。導出成 war 包可以讓外部容器運行 spring-boot 項目 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
    </dependency>
    
  • step 3:添加 Servlet 的支持

    Spring Boot 項目必須實現 SpringBootServletInitializer 接口的 .configure() 方法才能讓外部容器運行 Spring Boot 項目。

    在啟動類同目錄下創建 ServletInitializer 類:

    public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(JspApplication.class);}}
    
  • step 4:maven 命令打包

    在項目根目錄下執行:

    mvn clean package
    
  • step 5:發布運行

    將項目 target 目錄下的 .war 包拷貝到 tomcat 的 webapps 目錄下,運行 tomcat 的 bin 目錄下的 startup.bat 啟動 tomcat 。

    在瀏覽器中訪問即可。

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

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

相關文章

【React】封裝一個好用方便的消息框(Hooks Bootstrap 實踐)

引言 以 Bootstrap 為例&#xff0c;使用模態框編寫一個簡單的消息框&#xff1a; import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…

打開C語言常用的內存函數大門(二)—— memmove()函數 (內含memmove的講解和模擬實現)

文章目錄 1. 前言2. memmove()函數2.1 memmove()函數與memcpy()函數的差異2.2 memmove()函數的原型2.3 memmove()函數的使用案例 3. memmove()函數的模擬實現4. 總結 1. 前言 在之前&#xff0c;我向大家介紹了C語言中的一個常用的內存函數memcpy函數。如果你還沒看的話&#…

碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組

代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組 文章目錄 代碼隨想錄算法訓練營Day 52 | 動態規劃part13 | 300.最長遞增子序列、674. 最長連續遞增序列 、718. 最長重復子數組300.最長遞增子序列一、一維DP…

12k Star!Continue:Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋!

原文鏈接&#xff1a;&#xff08;更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號&#xff01;&#xff09; 12k Star&#xff01;Continue&#xff1a;Github Copilot 開源本地版、開發效率和隱私保護兼得、豐富功能、LLM全覆蓋&#xff01; &…

Beamer中二階導、一階導數的顯示問題

Beamer中二階導、一階導數的顯示問題 在beamer中表示 f ′ f f′和 f ′ ′ f f′′時發現導數符號距離 f f f很近 \documentclass{beamer} \usepackage{amsmath,amssymb}\begin{document} \begin{frame}\frametitle{Derivative}Derivative:\[f^{\prime}(x) \quad f \quad…

C# 讀取txt大文件

1GB以下 using System.Text;namespace DotnetReadTxt;class Program {static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 Encoding.GetEncoding("GB2312");int index 0;using (StreamReader sr ne…

conda與pip的鏡像源與代理設置

conda與pip的鏡像源與代理設置 一、前言二、conda鏡像源設置2.1conda默認鏡像源介紹2.2通過終端設置鏡像源2.3通過配置文件設置鏡像源 三、pip鏡像源設置3.1pip默認鏡像源介紹3.2通過終端臨時設置鏡像源3.3通過配置文件設置一個或多個鏡像源 四、conda代理設置4.1通過終端設置代…

數據結構與算法筆記:基礎篇 - 棧:如何實現瀏覽器的前進和后退功能?

概述 瀏覽器的前進、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 當依次訪問完一串頁面 a-b-c 之后&#xff0c;點擊瀏覽器的后退按鈕&#xff0c;就可以查看之前瀏覽過的頁面 b 和 a。當后退到頁面 a&#xff0c;點擊前進按鈕&#xff0c;就可以重新查看頁面 b 和 c。但…

放開了去的 ulimit

放開了去的 ulimit 放開了去的 ulimitulimit簡介臨時修改打開文件數目永久修改系統總打開句柄限制更多信息 放開了去的 ulimit ulimit簡介 對于高并發或者頻繁讀寫文件的應用程序而言&#xff0c;有時可能需要修改系統能夠打開的最多文件句柄數&#xff0c;否則就可能會出現t…

HTTPS 原理技術

HTTPS原理技術 背景簡介原理總結 背景 隨著年齡的增長&#xff0c;很多曾經爛熟于心的技術原理已被歲月摩擦得愈發模糊起來&#xff0c;技術出身的人總是很難放下一些執念&#xff0c;遂將這些知識整理成文&#xff0c;以紀念曾經努力學習奮斗的日子。本文內容并非完全原創&am…

Element-ui使用上傳時彈框選擇文件類型

實現效果 1&#xff0c;點擊上傳&#xff0c;上傳文件&#xff1b; 2&#xff0c;選擇文件&#xff1b; 3&#xff0c;彈框選擇文件類型&#xff1b; 4&#xff0c;選擇類型后確定上傳&#xff1b; 一&#xff0c;上傳 跳過&#xff1b; 二&#xff0c;定義彈框下拉框…

Coolmuster Android Assistant: 手機數據管理的全能助手

在數字化時代&#xff0c;智能手機不僅是通訊工具&#xff0c;更是個人數據的中心。隨著數據量的不斷增加&#xff0c;如何有效管理和保護這些數據成為了一個重要議題。Coolmuster Android Assistant應運而生&#xff0c;它是一款專為安卓用戶設計的綜合數據管理軟件&#xff0…

EXCEL數據透視圖中的日期字段,怎樣自動分出年、季度、月的功能?

在excel里&#xff0c;這個果然是有個設置的地方&#xff0c;修改后就好了。 點擊文件選項卡&#xff0c;選項&#xff0c;在高級里&#xff0c;將圖示選項的勾選給取消&#xff0c;然后再創建數據透視表或透視圖&#xff0c;日期就不會自動組合了&#xff1a; 這個選項只對新…

遙感圖像的深度學習的任務類型

在遙感圖像的深度學習任務中&#xff0c;利用深度學習技術處理和分析遙感圖像已經成為一個重要的研究方向。遙感圖像來自衛星、無人機等設備&#xff0c;包含了豐富的地球表面信息。以下是遙感圖像深度學習中的主要任務類型&#xff1a; 1. 圖像分類&#xff08;Image Classif…

Flutter 中的 SliverPrototypeExtentList 小部件:全面指南

Flutter 中的 SliverPrototypeExtentList 小部件&#xff1a;全面指南 Flutter 是一個功能強大的 UI 框架&#xff0c;由 Google 開發&#xff0c;允許開發者使用 Dart 語言構建跨平臺的移動、Web 和桌面應用。在 Flutter 的豐富組件庫中&#xff0c;SliverPrototypeExtentLis…

山東理工大學第十六屆ACM程序設計競賽(同步賽)

山東理工大學第十六屆ACM程序設計競賽&#xff08;同步賽&#xff09; B、Q的網課 1、創建一個結構體&#xff0c;來保存我們要輸入的網課名和學時&#xff0c;并且對學時初始化為-1 2、然后w次輸入網課名&#xff0c;對每次輸入減去原先網課名對應學時&#xff0c;統計網課剩余…

關于torch.size和tensor的維度筆記

torch.Size([200, 1])和torch.Size([200])的區別是什么? torch.Size([200, 1]) 和 torch.Size([200]) 是兩個不同形狀的張量 (tensor) 大小。它們的區別如下&#xff1a; torch.Size([200, 1]): 這是一個2D張量&#xff0c;形狀是200行1列。這種形狀通常用來表示一個列向量或…

suffix-tree教程(個人總結)

背景 在計算機科學和生物信息學中&#xff0c;字符串處理是一個非常重要的領域。無論是搜索引擎、基因序列分析&#xff0c;還是壓縮算法&#xff0c;都離不開高效的字符串處理。傳統的字符串匹配算法&#xff0c;如暴力搜索、Knuth-Morris-Pratt (KMP) 算法和 Boyer-Moore 算…

Android14 WMS-IWindow介紹

IWindow是很重要的&#xff0c;官方介紹是API back to a client window that the Window Manager uses to inform it of interesting things happening. 也就是說是是用于WMS回調客戶端的&#xff0c;當窗口有一些改變時&#xff0c;WMS及時調用客戶端接口&#xff0c;讓客戶端…

Ubuntu22.04之解決:忘記登錄密碼(二百三十二)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…