开发者学堂课程【SpringBoot快速掌握 - 核心技术:使用外部 Servlet 容器&JSP 支持】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9263
使用外部 Servlet 容器&JSP 支持
内容介绍
一、使用外部Servlet容器
二、错误分析
三、总结使用外置servlet容器步骤
一、使用外部Servlet容器
使用嵌入式 servlet 容器:应用打成可执行的jar
优点:简单、便携;
缺点:默认不支持 JSP、优化定制比较复杂;
优化和定制可以写定制器进行简单定制,要做到深度优化定制还需要知道每一个servlet 容器里的工作原理,有两种办法:
1、使用定制器【
ServerProperties
】
、自定义
【
EmbeddedServletContainerCustomizer】
就是以前说的两种方式,这是以前使用定制器,当然也可以用更高级的方式。
2、自己编写嵌入式 servlet 容器的创建工厂【
EmbeddedServletContainerFactory]
这样就没有局限性了,但在后来开发的时候很多应用都是需要开发 JSP 的,所以也需要让它支持 JSP,使用外置的 servlrt 容器。
外置的 servlrt 容器:外面安装 tomcat,这个应用是以 war 包的方式打包;
用 war 包的方式也非常简单,直接创建一个新的项目,在这个项目里还是要 spring初始化器,将项目打成 jar 包,方便支持 JSP。
但是注意有一个 packaging 方式改成 war,然后下一步,还是选择 web 应用,注意用spring
boot
1.5.10
,把项目创建出来。
创建出来后自动将项目下载出来,在 s rc 找到 main、java、com、点击springboot,可以看到 springboot 的主程序,而且在列表中看到多了一个类:servletlnitializer。
现在这个项目是 war 形式,那么在 src、main 下除了有 java 和 resources 还应该有 web.app 文件夹而现在还没有,所以生成一下:
有两种办法,可以手动创建,但是注意在右上角 porject structure 按钮,点击进入modules 里,这个项目除了是 spring 项目外还有 web 应用,web 应 用下有 web resource directories 资源目录,双击,发现默认就是给当前项目放东西,只不过这个文件夹目录还没有生成,点击ok 提示是不是要自动生成这个文件夹,点击yes文件夹就自动创建了。
但注意还有一个 deployment descriptors 部署描述符,点击加号可以生成web.xml文件,就生成在当前目录src下main下的webapp文件夹主要是有一个WEB-INF文件夹里的 web.xml 点击ok,就会给指定位置生成 web.xml 并且生成相关 web 目录结构。
点击应用,点击 OK,在目录中可以找到刚才创建的 web.xml 那就没问题,web目录结构就生成了。
应用启动就可以打成 war 包的方式放在服务器上,也可以把服务器整合进来,启动就更方便了,怎么把服务器整合进来呢?
在运行窗口编辑配置,点开是 springboot 应用,点击+号,加入服务器,表中没有列举,但有一个32 items more 点开其中就有 tomcat server 选择 local 加入本地服务器。
首先指定位置,根据安装情况进行选择。但是要运行项目,找到 deployment 添加要部署的哪个项目,点击+号选择 artifacts 选中要部署的项目后点击ok应用就可以了。
这样就配置好了,点击运行就启动了在控制台中可以查看启动输出,在这过程中 springboo t 也被带起来了,这样就启动正确了。
二、错误分析
第一个显示一个错误页面,这是由于没有写首页,为了测 JSP 就在 webapp 下直接创建 JSP,写入:
<htm1>
<head>
<title>Title</tit1e>
< / head>
<body>
<h1>Hello JSP</h1>
</body>
</htm
l
>
写完后关掉重启服务器,看能不能访问到JSP,启动后访问:
localhost:8081/hello.jsp
发现这个页面是可以使用的,包括和spring src结合,比如在这个页面发一个请求abc超链接请求。
首先来到一个success页面,在WEB-INF中创建success文件夹写入:
<html><head>
<title>Title</title>
</ head>
<body>
<h1>
success
/h1>< / body>
</ html>
然后再 springboot 里创建 controller.Hellcontroller 文件夹,它来处理请求:
package com.atguigu. springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping( "/abc")
public String hello(){
return "";
}
Return 返回的页面是 s uccess.jsp,以前要经常向 WEB-INF 面返回一个页面,比如以前配过视图解析器,有前缀、后缀、拼串,这里也可以配:
在 application.properties中写入:
spring.mvc.view.prefix=/wEB-INF/
spring.mvc.view.suffix=.jsp
这样只要是给 WEB-INF 下找 jsp 只需要写页面的名字就可以了,也可以放一些数据在页面里:
@Controller
public class HelloController {
@GetMapping(" /abc")
public string hello(Model model){
model.addAttribute( attributeName: "msg" , attributeValue: "你好");
return "success" ;
}
}
在 success.jsp 中写入:
3>
$
{msg}<
h
3>
重启服务器,重新访问看能不能访问到 success 页面:
刷新页面点击 abc 超链接访问到 success 页面,也取出了 你好 消息。
三、总结使用外置 servlet 容器步骤
1、必须创建一个 war 项目;(利用idea创建好目录结构)
如果用 spring 初始化向导器,war 项目一创建都已经好了,但是有一些变化。
war 文件创建后,如果要自己写那么:
2、将嵌入式的 Tomcat 指定为 provided ;
org.springframework.boot
spring-boot-starter-tomcat
provided
< / dependency>
有两个重要的东西 servletinitializer 这个必须写没有它是启动不了的。
而且他的类名随意,但必须继承于springbootservletinitializer。
3、必须编写一个 SpringBootServletInitializer 的子类,并调用 configure 方法
public class ServletInitializer extends
SpringBootServletInitializer{
@override
protected SpringApplicationBuilder
configure(SpringApplicationBuilder application){
//出阿奴 springboot应用的主程序
return application.sources(SpringBoot04web3spApplication.class);
}
编写这个子类的目的是调用 configure 方法,configure 方法里这是固定写法。
application 是 SpringApplicationBuilder 的构建器,调用 sources 方法传入springboot 的主程序。
4、启动服务器就可以使用了
主要的核心就是 tomcat 文件里将 tomcat 引用变为 provided,以及写一个
SpringBootServletInitializer 的子类传入 springboot 的主程序。
如果直接启动 springboot 的主程序,这是错误的是没法启动的。