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.mzph.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;多媒…