• 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有迅速响应的用户论坛。

    更多详情,点击查看:https://spring.io/blog/2012/10/30/spring-mvc-from-jsp-and-tiles-to-thymeleaf

    总结:按照官方的说法,如果你有数百个JSP页面,我们并不建议您应该立即抛弃它们,重新使用Thymeleaf,但是,如果您开始开发一个新项目,强烈鼓励您比较其他模板引擎和JSP,以确认哪一个更适合您。

    五、参考资料

    开发Web应用之JSP篇:http://tengj.top/2017/03/13/springboot5/

    欢迎扫码,加入圈子讨论交流

  • 相关阅读:
    随机森林算法参数调优
    BAYES和朴素BAYES
    阿里云 金融接口 token PHP
    PHP mysql 按时间分组 表格table 跨度 rowspan
    MySql按周,按月,按日分组统计数据
    PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
    thinkphp5 tp5 会话控制 session 登录 退出 检查检验登录 判断是否应该跳转到上次url
    微信 模板消息
    php 腾讯 地图 api 计算 坐标 两点 距离 微信 网页 WebService API
    php添加http头禁止浏览器缓存
  • 原文地址:https://www.cnblogs.com/vipstone/p/9540325.html
Copyright © 2020-2023  润新知