• Spring Boot 学习系列(10)—SpringBoot+JSP的使



    此文已由作者易国强授权网易云社区发布。

    欢迎访问网易云社区,了解更多网易技术产品运营经验。

    解决问题

    • 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架,方便在后续新项目中继续使用。

    • 本章主要介绍了如何采用Spring Boot改造传统的jsp项目。

    难点

    • 首先,Spring Boot + JSP的方式肯定是可以使用的。不过官方早就说过不推荐使用jsp来进行前端页面的开发,官方推荐的是Themeleaf,更加符合现在前后端分离的开发模式。

    • 使用Spring Boot + JSP 的方式,主要是注意一下配置上的变化,下面一起来看下。

    使用介绍

    • 既然我们选择Spring Boot的框架,还是比较推荐采用jar的形式进行打包部署,这样开发人员可以更方便的控制tomcat容器(内置默认容器)的参数配置,应用部署也更加简单。

    • 首先,项目pom.xml文件中的packaging类型确保是jar类型。示例如下:

    <groupId>com.netease.ms</groupId><artifactId>common-ms</artifactId><packaging>jar</packaging><version>1.0.0</version>
    • spring boot的版本可根据使用需求而定,这里我使用的是目前最新的稳定版本1.5.9.RELEASE。示例如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version></parent>
    • 然后,引入starter-web组件,这个组件中会包含内置的tomcat容器。示例如下:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId></dependency>
    • 此外,还需要加入内置tomcat对jsp文件解析的支持,如果有用到jstl标签的话,也一并加入相关的依赖。示例如下:

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId></dependency><dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>${jstl.version}</version></dependency>
    • 加入上述依赖后,注意在build插件中加入如下配置,需要注意的是,这里spring-boot-maven-plugin插件的版本指定的是1.4.2.RELEASE,自己有测试使用默认的1.5.9.RELEASE或其他1.5.x版本不行(IDEA直接运行启动没问题,打成jar包单独运行就会报404的错误,找不到相关的jsp页面),至于除1.4.2.RELEASE版本外其他版本是否可行,笔者并未尝试,有清楚原因的读者欢迎指教。另外一个比较关键的是,打成jar包后,实际上是识别不了webapp目录的,所以我们把webapp目录下的相关文件copy到META_INF/resources下面了。这样spring boot的fat jar在启动时是能够识别这个资源路径的。

        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.4.2.RELEASE</version>
                    <configuration>
                        <mainClass>test.Application</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <!-- spring热部署,非必须 -->
                        <dependency>
                            <groupId>org.springframework</groupId>
                            <artifactId>springloaded</artifactId>
                            <version>1.2.6.RELEASE</version>
                        </dependency>
                    </dependencies>
                </plugin>
                <!-- 忽略无web.xml警告 如果打包成war则需要-->
                <!--<plugin>-->
                    <!--<groupId>org.apache.maven.plugins</groupId>-->
                    <!--<artifactId>maven-war-plugin</artifactId>-->
                    <!--<configuration>-->
                        <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
                    <!--</configuration>-->
                <!--</plugin>-->
            </plugins>
            <resources>
                <!-- 打包时将jsp文件拷贝到META-INF目录下 -->
                <resource>
                    <!-- 指定resources插件处理哪个目录下的资源文件 -->
                    <directory>src/main/webapp</directory>
                    <!--注意必须要放在此目录下才能被访问到 -->
                    <targetPath>META-INF/resources</targetPath>
                    <includes>
                        <include>**/**</include>
                    </includes>
                </resource>
                 <!-- 其他资源的拷贝 -->
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/**</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    • 完成上述配置后,pom.xml文件的必要配置就ok了,接下来我们把项目中用到的静态资源由原来的webapp目录移到src/main/resources目录下,主要的目录结构如下图所示。

    image

    • 最后,我们在application.properties文件中配置上jsp的解析前缀和后缀,以及静态资源的映射路径,如下所示,这里因为我的jsp存放路径是WEB-INF/views,所以前缀加上了这个路径,如果你自己项目下并无此路径,做相应的修改即可,如spring.mvc.view.prefix=/

    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    #定义静态资源的映射路径
    spring.mvc.static-path-pattern=/resources/**
    • 另外传统的web项目中,肯定是有web.xml文件的,关于这个文件,我们主要是配置了一些servlet、filter以及listener,改成代码的方式配置也很简单,大家可以参照前面系列文章中介绍进行相应的改写即可,在此不再赘述。

    • 还有一个需要提下的地方,就是把我们传统的项目改造成spring boot 项目时,往往会觉得很麻烦,其原因主要是在于spring boot的去xml化,如果把已有的xml中的配置再一点点的改成java代码的实现方式,确实会令人崩溃。所以,对于已有项目的改造,尽可能的保留原有的xml配置方式,这样更简单方便。示例如下:

    @ImportResource("classpath:spring/application-context.xml")@SpringBootApplication(scanBasePackages = {"......"})public class CommonMsApplication {
        ......
    }

    最后

    • 改造完成后,发现其实spring boot + jsp的方式使用并不复杂,只是在改造传统项目时,相应的配置需要做些变更。当然,每个项目使用的组件不尽相同,也许在实际的改造过程中,会遇到这样或那样的问题,耐下心来一步步找到问题原因,相信也能很快解决的。

    • 不足之处,欢迎指正,谢谢~


    免费体验云安全(易盾)内容安全、验证码等服务

    更多网易技术、产品、运营经验分享请点击




    相关文章:
    【推荐】 一个小需求引发的思考

  • 相关阅读:
    [转]ARM平台下独占访问指令LDREX和STREX
    ARM MMU
    在字符串中查找子字符串并提取它
    获得字符串的长度
    连接字符串
    循环用于迭代数组中的项目
    循环的标准
    if ... else 语句
    添加一个图像切换器
    css 中的z-index
  • 原文地址:https://www.cnblogs.com/zyfd/p/9887337.html
Copyright © 2020-2023  润新知