• Spring Boot 集成Jsp与生产环境部署


    一、简介

    提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下Spring Boot 怎么集成JSP开发,以及生产环境的详细部署方法。

    二、集成JSP

    开发环境

    • Spring Boot 2.0.4 RELEASE
    • Tomcat 9.0.10
    • IDEA(Intellij IDEA简称,下文统一使用)2018.2
    • Windows 10

    JSP集成步骤

    1. 创建JSP目录
    2. application.properties配置Jsp信息
    3. pom.xml添加依赖组件
    4. 编写Spring MVC代码
    5. 运行程序

    具体集成方法如下:

    1.创建JSP目录

    在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图:

    2.application.properties配置Jsp信息

    application.properties为全局配置文件,里面可以设置很多信息,比如设置日志、设置缓存、设置Spring、Spring SESSION等信息,我们本文只需要设置JSP的目录文件,以及文件后缀,代码如下:

    spring.mvc.view.prefix=/WEB-INF/jsp
    spring.mvc.view.suffix=.jsp

    更多application.properties设置信息,查看官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties

    3.pom.xml添加JSP配置

    在pom.xml需要添加3个组件:

    • spring-boot-starter-web (用于运行web项目)
    • jstl (JavaServer Pages Standard Tag Library,JSP标准标签库,用于程序中解析JSP)
    • tomcat-embed-jasper (内置tocat对Jsp支持的依赖,用于编译Jsp)

    具体代码如下:

    <!--web支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!--JavaServer Pages Standard Tag Library,JSP标准标签库-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    
    <!--内置tocat对Jsp支持的依赖,用于编译Jsp-->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

    注意:tomcat-embed-jasper的scope(作用域)值为provided,表示打包的时候不用打包进去,其他设备会提供,如果打包进去会和外部Tomcat提供的jar冲突,导致项目启动失败。

    scope(作用域)值列表代表含义解释如下:
    • compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去
    • test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
    • runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段
    • provided:打包不会包含进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
    • system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
    4.编写Spring MVC代码

    经过前3步的配置,项目配置部分已经完成的差不多了,接下来就是代码的编写了,代码的编写和Spring MVC一样,分为两部分Java类编写与标识注解,JSP模板创建与编写。为了更好的演示Spring Boot 的功能,我们会尽可能的简化业务逻辑,在这个示例中我们创建一个Cat类,设置标签hi="Hello Cat",在页面输出标签即可。

    a).Cat.java代码
    package com.hellospringboot.hellospringboot;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    @Controller
    @RequestMapping("/cat") //创建路由规则http://xxxx/cat
    public class Cat {
        /**
         * 默认路由方法
         *
         * @return
         */
        @RequestMapping("")
        public ModelAndView index() {
            ModelAndView modelAndView = new ModelAndView("/index"); //设置对应JSP的模板文件
            modelAndView.addObject("hi", "Hello,Cat"); //设置${hi}标签的值为Hello,Cat
            return modelAndView;
        }
    }

    Spring MVC注解解读

    • @Controller 标识在一个类上,标识的类就是Spring MVC的控制器类,分发处理器会扫描使用了该注解的类是否使用了@RequestMapping 注解,@Controller只是定义了一个控制器类,只用使用了@RequestMapping 注解,才是真正处理请求的处理器;
    • @RequestMapping 标识在类或者方法上,用来处理请求地址的注解,一共有6个属性:
      1. value 对应请求的实际地址
      2. method 请求的类型:get、post、put、delete 等,ex:@RequestMapping(value = "/test", method = RequestMethod.PUT)
      3. consumes 指定请求上的内容类型,比如application/json、text/html等
      4. produces 指定返回的数据类型,类型必须是Request Headers中accept包含的类型
      5. params 过滤请求,只有请求中包含某个参数,才会执行,比如@RequestMapping(value = "",params = "flag"),只有参数中包含flag才会执行,不然不能访问,http://localhost:8080/cat?true=flag这个地址是访问不到的,正确的地址是http://localhost:8080/cat?flag=true才可以正常访问
      6. headers 和params类似,只有请求headers里面包含某个key才可以访问方法
    b).JSP端代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>
        ${hi}
    </h1>
    </body>
    </html>

    这个jsp只做了一件事,把java类里面的${hi}标签的值显示出来。

    5.运行程序

    到此为止,如果您使用的是IDEA开发工具,那么现在就可以运行调试程序了,直接运行Index.jsp或者启动文件,或者启动文件(Application.java)即可,然后在浏览器输入:http://localhost:8080/cat 即可查看。

    三、生产环境部署

    部署步骤

    1. 下载安装Tomcat
    2. 入口类继承SpringBootServletInitializer重写configure方法
    3. 配置pom.xml
    4. IDEA生成war文件
    5. 配置Tomcat运行项目
    1.下载安装Tomcat

    下载地址:https://tomcat.apache.org/download-90.cgi

    如下图所示:

    Windows下载:64-bit Windows zip | Linux下载:tar.gz

    注意:如果是Windows版下载的免安装版如果放到C盘的话,注意给文件夹分配足够的权限,不然启动之后访问页面显示400或者505类似的问题。

    2.入口类继承SpringBootServletInitializer重写configure方法

    如果要进行生产环境部署,需要单独配置一下Spring Boot 的入口类,需要继承SpringBootServletInitializer类,重写configure方法,因为默认情况外部Tomcat不能读取到Spring Boot 入口类的main方法启动程序加载,使用需要继承,代码如下:

    package com.hellospringboot.hellospringboot;
    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 HelloSpringBootApplication  extends SpringBootServletInitializer{
        /**
         * 重写configure方法,加载启动类
         * @param application
         * @return
         */
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(HelloSpringBootApplication.class);
        }
        /**
         * Spring Boot 默认main方法
         * @param args
         */
        public static void main(String[] args) {
            SpringApplication.run(HelloSpringBootApplication.class, args);
        }
    }
    
    3.配置pom.xml

    需要配置一下pom.xml,排除一下内置tomcat的jar包,防止打包之后与外面Tomcat jar 包冲突,导致项目启动失败,配置如下:

    <!--排除内置tomcat jar包-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    主要的代码是provided,设置打包不会包含进去,由其他设施提供。

    4.IDEA生成war文件
    步骤一:修改生成jar为war格式

    找到:

    jar

    修改为:

    war

    为什么需要修改jar包格式为war,因为如果打包为jar包的时候,不会包含JSP文件,所以访问的时候回404,而打包为war的时候回包含JSP文件,所以需要把打包格式修改为war.

    jar和war的区别?

    • jar(java application archive)java应用程序库,通常为开发引用的通用类
    • war(web application archive)web应用程序

    所以从jar和war的区别来看,网页程序打包成war格式也是很合适的。

    如果需要修改生成文件的文件名称,可以设置build下的finalName属性,代码如下:

    <build>
        <finalName>name</finalName>
    </build> 
    步骤二:使用IDEA生成war包

    选择菜单栏Build => Build Artifacts.. => 点击Rebuild,即可生成war包,如图:

    生成完之后,在项目的target目录下找到生成war文件,如下图:

    5.配置Tomcat运行项目
    步骤一:把war文件复制到tomcat的webapps目录下
    步骤二:配置conf/server.xml

    在Host标签内添加Context设置,docBase属性填写war文件名称,配置如下:

    <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">    
        <Context path="" docBase="springbootjsp" debug="0" privileged="true" reloadable="true" />
        <!--
        其他代码
        -->
    </Host>
    步骤三:启动tomcat

    运行bin/shutdown.bat文件,启动tomcat

    输入地址:http://localhost:8080/cat 访问。

    到此项目部署成功,虽然本人部署到Windows服务器了,Linux也是一样的步骤。

    四、知识扩展:Spring Boot 模板推荐

    虽然上文我们详细介绍了JSP在Spring Boot 中使用,但是Spring Boot官方并不推荐使用JSP(原因见下文)。

    Spring Boot推荐模板引擎:

    • Thymeleaf
    • Freemarker
    • Mustache
    • Groovy Templates

    如下图所示:

    Spring为什么不推荐使用JSP?

    Spring官方不推荐使用JSP的原因有这么几个:

    1. 官方文档JSP没有Thymeleaf好;
    2. Thymeleaf健康的开源项目,几乎每个月都有更新,而JSP已经好几年没有实质性的进展;
    3. Thymeleaf有迅速响应的用户论坛。
  • 相关阅读:
    进程状态-top,ps
    怎么杀死进程?
    linux文件属性和类型
    文件管理的相关命令
    系统的目录结构
    linux基础_02
    linux基础_01
    python 01
    什么是NoSql
    为何不推荐子查询和join?
  • 原文地址:https://www.cnblogs.com/h-c-g/p/10834583.html
Copyright © 2020-2023  润新知