• SpringBoot使用JSP(官网Demo)


    最开始接触java的时候,前端页面基本都是用jsp来写,最近公司项目要使用SpringBoot重构,查看SpringBoot文档,发现SpringBoot不建议使用JSP,因为jsp在使用内嵌servlet容器时会有一些限制

    虽然以后项目中也会将jsp替换成Template Engines,而且这都是前端的事情,其实与后端并无比较大的联系,但比较好奇Springboot中对jsp的使用,故根据官方文档进行了简单测试验证

    如果使用JSP,则需要将项目打包成war包,jar包不支持JSP。

    打开JSP sample,这是一个github上的项目,点击Code标签页,clone or download下载源码,这里下载的代码中包含有很多个springboot项目,其中spring-boot-samples中包含有我们需要的spring-boot-sample-web-jsp

    解压下载的文件,spring-boot-samples下项目很多,我们根据需要在eclipse中只导入spring-boot-sample-web-jsp项目,导入时可能出现以下异常

    点击finish -- ok,pom.xml文件中出现异常

     选择Mark goal validate as ignored in pom.xml忽略掉该信息

    点击OK

    此时若项目上还有红色的叉号,则在项目名称上右键 -- Maven -- Update Project -- OK。

    项目结构

    包sample.jsp下有两个类

    控制器WelcomeController

    package sample.jsp;
    
    import java.util.Date;
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class WelcomeController {
    
        @Value("${application.message:Hello World}")
        private String message = "Hello World";
    
        @GetMapping("/")
        public String welcome(Map<String, Object> model) {
            model.put("time", new Date());
            model.put("message", this.message);
            return "welcome";
        }
    
        @RequestMapping("/foo")
        public String foo(Map<String, Object> model) {
            throw new RuntimeException("Foo");
        }
    }

    启动类SampleWebJspApplication.java

    package sample.jsp;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    public class SampleWebJspApplication extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(SampleWebJspApplication.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(SampleWebJspApplication.class, args);
        }
    }

     两个jsp页面

    welcome.jsp

    <!DOCTYPE html>
    
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    
    <html lang="en">
    
    <body>
        <c:url value="/resources/text.txt" var="url"/>
        <spring:url value="/resources/text.txt" htmlEscape="true" var="springUrl" />
        Spring URL: ${springUrl} at ${time}
        <br>
        JSTL URL: ${url}
        <br>
        Message: ${message}
    </body>
    
    </html>

    error.jsp

    <!DOCTYPE html>
    <html lang="en">
    <body>
    Something went wrong: ${status} ${error}
    </body>
    </html>

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <!-- Your own application should inherit from spring-boot-starter-parent -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-samples</artifactId>
            <version>${revision}</version>
        </parent>
        <artifactId>spring-boot-sample-web-jsp</artifactId>
        <packaging>war</packaging>
        <name>Spring Boot Web JSP Sample</name>
        <description>Spring Boot Web JSP Sample</description>
        <properties>
            <main.basedir>${basedir}/../..</main.basedir>
            <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
        </properties>
        <dependencies>
            <!-- Compile -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
            <!-- Provided -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>
            <!-- Test -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <useSystemClassLoader>false</useSystemClassLoader>
                    </configuration>
                </plugin>
            </plugins>
            <pluginManagement>
                <plugins>
                    <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
                    <plugin>
                        <groupId>org.eclipse.m2e</groupId>
                        <artifactId>lifecycle-mapping</artifactId>
                        <version>1.0.0</version>
                        <configuration>
                            <lifecycleMappingMetadata>
                                <pluginExecutions>
                                    <pluginExecution>
                                        <pluginExecutionFilter>
                                            <groupId>
                                                io.spring.javaformat
                                            </groupId>
                                            <artifactId>
                                                spring-javaformat-maven-plugin
                                            </artifactId>
                                            <versionRange>
                                                [0.0.6,)
                                            </versionRange>
                                            <goals>
                                                <goal>validate</goal>
                                            </goals>
                                        </pluginExecutionFilter>
                                        <action>
                                            <ignore></ignore>
                                        </action>
                                    </pluginExecution>
                                </pluginExecutions>
                            </lifecycleMappingMetadata>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    View Code

    以上为该Demo官网pom文件,但其中内容个人觉得有多余,spring-boot-starter-tomcat和tomcat-embed-jasper在spring-boot-starter-web中已经有引用,所以可以去掉

    启动主函数

    页面访问:http://localhost:8080/

    页面访问:http://localhost:8080/foo

    一、本例中启动类继承了SpringBootServletInitializer,重写了configure方法,如果去掉该类的集成,能不能正常运行程序,其实是可以的(添加server.port=8081端口,与8080区分,测试)

    二、SpringBootServletInitializer是做什么用处的?

    springboot官方文档中 “91.1 Create a Deployable War File”有对该类的具体描述

    三、按照当前pom.xml中配置,打包(eclipse中执行package),出现以下异常

    [ERROR] Failed to execute goal io.spring.javaformat:spring-javaformat-maven-plugin:0.0.6:validate (default) on project spring-boot-sample-web-jsp: Formatting violations found in the following files:

    日志中也给出了建议,使用:spring-javaformat:apply修复该问题

    spring-javaformat:apply执行结束后,再次执行package,打包成功,打包过程中,会有很多的jar包下载。

    进入到target目录,执行:java -jar .spring-boot-sample-web-jsp-2.1.2.RELEASE.war,程序启动后,页面访问正常。

    四、上面官方文档已经讲,打成可执行jar包,不支持JSP,下面尝试一下,是否如此,首先去掉主函数中集成SpringBootServletInitializer类,去掉重写的方法,pom.xml中war改为jar

      1、运行主函数,jsp可正常访问

      2、执行clean package打包,打包时出现异常,也许此异常与JSP无关,但此处就不在进行处理重新打包,毕竟官网也已经声明可执行jar不支持JSP

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) on project spring-boot-sample-web-jsp: You have 2 Checkstyle violations. -> [Help 1]

    五、以上demo跑通后,也需要自己新建一个使用jsp的web项目,来运行测试下。

  • 相关阅读:
    女程序员这么少是因为怕秃头?如果你这样想,那就错了...
    使用简单的c#示例的坚实的架构原则
    第1部分设计模式FAQ(培训)
    为什么微软部分类和Java不?
    现实世界四部分类和部分方法的使用
    回到基础:n层ASP的异常管理设计指南。网络应用
    学习c#(第9天):理解c#中的事件(一种见解)
    EventBroker:同步和异步通知组件,松散耦合的事件处理
    潜水在OOP(第一天):多态和继承(早期绑定/编译时多态)
    学习c#(第8天):c#中的索引器(一种实用方法)
  • 原文地址:https://www.cnblogs.com/qq931399960/p/10295784.html
Copyright © 2020-2023  润新知