Springboot整合jsp、jsp与Thymeleaf共存分享

Springboot整合jsp分享

总结一下Springboot整合jsp的详细步骤
总结一下Springboot整合jsp和Thymeleaf共存的详细步骤

一、整合步骤

SpringBoot前端如果要使用jsp了话,需要在pom文件中加入以下依赖。
1、Springboot工程导入两个依赖

  <!-- 用于编译jsp springboot tomcat jsp 支持开启-->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<!--jstl的支持,c标签-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <scope>compile</scope>
</dependency>

2、视图解析器识别jsp(配置文件配置视图属性)

#Spring boot视图配置(文件所在路径和文件类型)
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

3、在main文件夹下创建webapp文件夹,
1)然后在src/main/webapp下创建WEB-INF文件夹,以后的jsp文件就放在WEB-INF下面。(也可自定义文件夹名称,要在配置文件中指明路径)
2)然后点击Modules,找到web选项。(没有则点击+新建一个)

2.1 点击右边的“-”,这是Spring boot项目,不需要web.xml文件,直接删除即可。(如果没有就不要管,跳过)

2.2 点击中间的+号,(如果有就先-掉,或者修改)点击+号后选中webapp的路径(main下的webapp路径),这一步多说一下,这一步是指向jsp文件的根目录,这一步设置之后你点击webapp文件夹右键创建的时候才会在上面出现jsp的创建选项

在这里插入图片描述
3)文件夹中间有个小点了,被识别出来了,就可以右键新建jsp文件了

在这里插入图片描述
4)然后就可以请求访问了
重点:main启动时访问不了页面的,需要通过maven启动
在这里插入图片描述

避坑:
注意:main启动或者debug启动,如果启动用一直报404,可以用maven命令 spring-boot:run 启动,为啥?
[1] 官网文档中说:在打包为jar后,大多数构建工具不会打包webapp目录,而SB项目都是打包为jar,官方文档也说尽量避免使用jsp。解决办法就是使用maven命令启动,不会对功能有任何影响
在这里插入图片描述

二、springboot整合jsp运行方式

以下三种方式均可正常运行。

1、spring-boot:run 启动
使用命令 maven clean spring-boot:run或者使用idea的maven插件运行均可。
在这里插入图片描述

2、打成war包
设置pom.xml文件packaging属性应该为war。

<groupId>org.landy</groupId>
<artifactId>spring-boot-lesson-4</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
执行打包命令 maven clean package
执行运行war包命令 java -jar war包名称

3、外部tomcat部署方法
确保provided 没有被注释。(provided表明该包只在编译和测试的时候用)

Spring Boot内嵌的Servlet API运行时由tomcat提供,需要在运行时剔除。
修改 SpringBootLesson4Application类,需要继承 org.springframework.boot.web.support.SpringBootServletInitializer,然后实现其configure方法,具体内容为return builder.sources(本类类名.class);(注意,这里不能是this,this是一个类的实例,而xxx.class是类的模板)。

外部容器部署的话,就不能依赖于Application的main方法启动了,而是要依赖于类似servlet的web.xml的方式来启动Spring的应用上下文了。此时需要继承SpringBootServletInitializer并实现configure方法。

打包:maven clean package

放在tomcat下的webapp目录,重命名即可。

三、SpringBoot中jsp页面和Thymeleaf页面共存

导入thymeleaf和jsp的依赖

 <!-- 用于编译jsp    springboot tomcat jsp 支持开启-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--jstl的支持,c标签-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <scope>compile</scope>
        </dependency>
        <!--thymeleaf整合JSP需要用到下面的依赖-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.11.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.11.RELEASE</version>
        </dependency>

1、在WEB-INF下新建两个文件夹存各自的页面
在这里插入图片描述
2、配置文件导入thymeleaf的配置,jsp的不用导入

spring:
  thymeleaf:
    cache: false
    suffix: .html
    prefix: /WEB-INF/html

3、自定义一个视图解析器

package com.example.demo.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;

/**
 * 主要配置多视图实现的视图解析器相关bean实例,将该视图解析器注册到容器中
 *
 * 其实关键点在于两个:
 * 1、配置order属性:视图解析器优先级问题(就是决定先使用哪个解析器来解析视图)
 * 2、配置viewnames属性(配置对应的视图解析器解析哪些格式的视图)
 */
@Configuration
public class ViewResolverConfiguration {
    
    
    @Configuration//用来定义 DispatcherServlet 应用上下文中的 bean
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    
        //jsp页面的视图解析器,解析到webapp下的jsp/目录下查找对应的jsp页面
        @Bean
        public ViewResolver viewResolver() {
    
    
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/jsp/");
            resolver.setSuffix(".jsp");
            resolver.setViewNames("*");//这里是设置该视图解析器所要匹配哪些格式的视图“*”代表匹配所有格式“
            resolver.setOrder(2);//优先级,Spring配置多个视图解析器,数字越小,优先级越高,越先匹配
            return resolver;
        }
        /**
         * 下面都是配置hymeleaf的视图解析器相关的内容
         *  对thymeleaf的视图解析器,解析到webapp下的html目录下查找对应的页面
         * @return
         */
        @Bean
        public ITemplateResolver templateResolver() {
    
    
            SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
            templateResolver.setTemplateMode("HTML5");
            templateResolver.setPrefix("WEB-INF/");
            templateResolver.setSuffix(".html");
            templateResolver.setCharacterEncoding("utf-8");
            templateResolver.setCacheable(false);
            return templateResolver;
        }
        @Bean
        public SpringTemplateEngine templateEngine() {
    
    
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver());
            // templateEngine
            return templateEngine;
        }
        @Bean
        public ThymeleafViewResolver viewResolverThymeLeaf() {
    
    
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setTemplateEngine(templateEngine());
            viewResolver.setCharacterEncoding("utf-8");
            viewResolver.setOrder(1);//设置该视图解析器优先级为1
            //下面是设置该视图解析器所要匹配哪些格式的视图"html/*", "vue/*","jsps/*","templates/*"代表匹配"html/*", "vue/*","jsps/*","templates/*"格式的所有视图
            viewResolver.setViewNames(new String[]{
    
    "html/*", "vue/*","jsps/*","templates/*"});
            return viewResolver;
        }
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    
    
            configurer.enable();
        }

        /**
         * 配置资源路径
         * @param registry
         */
//        @Override
//        public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
//            registry.addResourceHandler("/img/**").addResourceLocations("/img/");
//            registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/" + "/static/");
//        }
    }

}

4、编写一个controller访问请求

@Controller
public class indexController {
    
    
    @GetMapping("/jsp")
    public String jsp(){
    
    
        System.out.println("index");
        return "jsp";
    }

    @GetMapping("/thy")
    public String thy(){
    
    
        System.out.println("thy");
        //html文件夹下的thy页面
        return "html/thy";
    }


}

5、效果

在这里插入图片描述
在这里插入图片描述
注意:配置的路径和/不能错

猜你喜欢

转载自blog.csdn.net/weixin_45019350/article/details/121665842
今日推荐