当前位置:   article > 正文

Spring Boot 的Web开发

Spring Boot 的Web开发

Spring Boot 的Web开发

 

 

 

一、 静态资源映射规则

 总结:

只要静态资源放在类路径下: called /static (or /public or /resources or /METAINF/resources

访问 : 当前项目根路径/ + 静态资源名

二、 enjoy模板引擎

        Enjoy模板引擎是一个轻量级的 Java 模板引擎,主要用于生成动态 HTML 内容。它的设计目标是简化 Java Web 应用中的页面渲染过程,同时保持高效和灵活。Enjoy模板引擎使用一种简单的语法,适用于 Java 开发者,用于创建和渲染模板。

(1)将页面保存在templates目录下

  1. <!DOCTYPE html>
  2. <html lang="cn" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>springMVC控制器方法参数作用:接受用户请求中的数据</h1>
  8. <hr/>
  9. <h3>基本类型和 String 类型作为参数</h3>
  10. <a href="/one/show1?msg1=9527">发送请求1</a>
  11. <a href="/one/show2?msg1=jdk&msg2=9527">发送请求2</a>
  12. <h3>POJO 类型作为参数</h3>
  13. <a href="/one/show3?eid=7&ename=钟无艳&esex=女">发送请求3</a>
  14. <form action="/one/show4" method="post">
  15. 员工编号:<input type="text" name="eid" ><br/>
  16. 员工姓名:<input type="text" name="ename" ><br/>
  17. 员工性别:<input type="text" name="esex" ><br/>
  18. 部门编号:<input type="text" name="dept.did" ><br/>
  19. 部门名称:<input type="text" name="dept.dname" ><br/>
  20. <input type="submit" value="发送请求4"/>
  21. </form>
  22. <form action="/one/map" method="post">
  23. 员工编号:<input type="text" name="eids"><br/>
  24. 员工姓名:<input type="text" name="enames"><br/>
  25. 员工性别:<input type="text" name="esexs"><br/>
  26. <input type="submit" value="发送请求4(map)"/>
  27. </form>
  28. <h3>POJO 类中包含集合类型参数</h3>
  29. <form action="/one/show5" method="post">
  30. 部门编号:<input type="text" name="did" ><br/>
  31. 部门名称:<input type="text" name="dname" ><br/>
  32. 员工编号1:<input type="text" name="mylist[0].eid" ><br/>
  33. 员工姓名1:<input type="text" name="mylist[0].ename" ><br/>
  34. 员工性别1:<input type="text" name="mylist[0].esex" ><br/>
  35. 员工编号2:<input type="text" name="mylist[1].eid" ><br/>
  36. 员工姓名2:<input type="text" name="mylist[1].ename" ><br/>
  37. 员工性别2:<input type="text" name="mylist[1].esex" ><br/>
  38. 员工编号3:<input type="text" name="myMap['one'].eid" ><br/>
  39. 员工姓名3:<input type="text" name="myMap['one'].ename" ><br/>
  40. 员工性别3:<input type="text" name="myMap['one'].esex" ><br/>
  41. 员工编号4:<input type="text" name="myMap['two'].eid" ><br/>
  42. 员工姓名4:<input type="text" name="myMap['two'].ename" ><br/>
  43. 员工性别4:<input type="text" name="myMap['two'].esex" ><br/>
  44. <input type="submit" value="发送请求5"/>
  45. </form>
  46. <a href="/one/show6?nums=123&nums=456&nums=789">发送请求6</a>
  47. <h3>使用 ServletAPI 对象作为方法参数</h3>
  48. <a href="/one/show7">发送请求7</a>
  49. </body>
  50. </html>
  1. <!DOCTYPE html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>spring成功页面</h1>
  8. </body>
  9. </html>

(2)添加坐标

  1. <dependency>
  2. <groupId>com.jfinal</groupId>
  3. <artifactId>enjoy</artifactId>
  4. <version>5.0.3</version>
  5. </dependency>

(3)开启配置

在代码中配置 Enjoy 模板引擎,例如设置模板目录和引擎名称。一般来说,可以在应用程序的启动类中进行配置:

  1. package com.apesource.springboot_web_02.config;
  2. import com.jfinal.template.Engine;
  3. import com.jfinal.template.ext.spring.JFinalViewResolver;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * @version 1.0
  8. * @Author 王老师
  9. * @since 2023/4/11
  10. */
  11. @Configuration
  12. public class SpringBootConfig {
  13. @Bean(name = "jfinalViewResolver")
  14. public JFinalViewResolver getJFinalViewResolver() {
  15. // 创建用于整合 spring boot 的 ViewResolver 扩展对象
  16. JFinalViewResolver jfr = new JFinalViewResolver();
  17. // 对 spring boot 进行配置
  18. jfr.setSuffix(".html");
  19. jfr.setContentType("text/html;charset=UTF-8");
  20. jfr.setOrder(0);
  21. // 设置在模板中可通过 #(session.value) 访问 session 中的数据
  22. jfr.setSessionInView(true);
  23. // 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样
  24. Engine engine = JFinalViewResolver.engine;
  25. // 热加载配置能对后续配置产生影响,需要放在最前面
  26. engine.setDevMode(true);
  27. // 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件
  28. engine.setToClassPathSourceFactory();
  29. // 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath
  30. // 代替 jfr.setPrefix("/view/")
  31. engine.setBaseTemplatePath("/templates/");
  32. // 更多配置与前面章节完全一样
  33. // engine.addDirective(...)
  34. // engine.addSharedMethod(...);
  35. return jfr;
  36. }
  37. }

(4)编写代码

三、 springMVC

(1)请求处理

在 Spring MVC 中,请求处理一般由控制器(Controller)来完成。你可以通过 @RequestMapping 注解定义请求的 URL 映射。

  1. @Controller
  2. @RequestMapping("/one")
  3. public class OneController {
  4. /**
  5. * 进入one.html页面
  6. * */
  7. @RequestMapping("/show")
  8. public String show(){
  9. return "one";
  10. }
  11. }

(2)参数绑定

Spring MVC 允许你将请求参数绑定到方法的参数中,例如 Java 对象、基本数据类型或集合。

  1. @Controller
  2. @RequestMapping("/one")
  3. public class OneController {
  4. /**
  5. * 进入one.html页面
  6. * */
  7. @RequestMapping("/show")
  8. public String show(){
  9. return "one";
  10. }
  11. /***********************基本类型和 String 类型作为参数*********************************/
  12. @RequestMapping("/show1")
  13. public String show1(String msg1){
  14. System.out.println("=====接受到用户发送数据为:"+msg1+"=======");
  15. return "success";
  16. }
  17. @RequestMapping("/show2")
  18. public String show2(String msg1,int msg2){
  19. System.out.println("=====接受到用户发送数据为:"+msg1+"=======");
  20. System.out.println("=====接受到用户发送数据为:"+msg2+"=======");
  21. return "success";
  22. }
  23. }
2.POJO类型参数:
                 包括实体类,以及关联的实体类
3.数组和集合类型参数:
                  包括 List 结构和 Map 结构的集合(包括数组)
 4.使用 ServletAPI 对象作为方法参数
          HttpServletRequest
         HttpServletResponse
        HttpSession
          java.security.Principal
          Locale
          InputStream
          OutputStream
          Reader
          Writer
  二.使用要求
     1.发送请求中携带数据的key与方法参数的name必须一致
     2.数据类型合法
  1. /***********************POJO 类型作为参数*********************************/
  2. //单一对象
  3. @RequestMapping("/show3")
  4. public String show3(Emp emp){
  5. System.out.println("=====接受到用户发送数据为:"+emp+"=======");
  6. return "success";
  7. }
  8. //对象嵌套
  9. @RequestMapping("/show4")
  10. public String show4(Emp emp){
  11. System.out.println("=====接受到用户发送数据为:"+emp+"=======");
  12. return "success";
  13. }
  14. //@RequestParam
  15. @RequestMapping("/map")
  16. public String map(@RequestParam Map map){
  17. System.out.println(map);
  18. return "success";
  19. }
  20. /*********************POJO 类中包含集合类型参数*********************************/
  21. @RequestMapping("/show5")
  22. public String show5(Dep dep){
  23. System.out.println("=====接受到用户发送数据为:"+dep+"=======");
  24. return "success";
  25. }
  26. @RequestMapping("/show6")
  27. public String show8(int[] nums){
  28. System.out.println("=====接受到用户发送数据为:"+ Arrays.toString(nums) +"=======");
  29. return "success";
  30. }
  31. /*********************使用 ServletAPI 对象作为方法参数*********************************/
  32. @RequestMapping("/show7")
  33. public String show7(HttpServletRequest request, HttpServletResponse response){
  34. // request.setCharacterEncoding("UTF-8");
  35. // response.setCharacterEncoding("UTF-8");
  36. System.out.println(request);
  37. System.out.println(response);
  38. request.getParameter("msg1");
  39. HttpSession session = request.getSession();
  40. System.out.println(session);
  41. session.setAttribute("","");
  42. try {
  43. response.sendRedirect("重定向");
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. ServletContext applaction = session.getServletContext();
  48. return "success";
  49. }

(3)常用注解

在 Spring MVC 中,有一些常用注解可以帮助简化开发过程:

  • @Controller:标记一个类为控制器。
  • @RequestMapping:映射 HTTP 请求到特定方法。
  • @GetMapping@PostMapping:分别用于处理 GET 和 POST 请求的快捷方式。
  • @RequestParam:将请求参数绑定到方法参数。
  • @PathVariable:从 URI 模板中提取变量并绑定到方法参数。
  • @RequestBody:将请求体的内容绑定到对象。
  • @ResponseBody:将方法返回的对象直接写入 HTTP 响应体。
  • @ModelAttribute:将请求参数绑定到模型对象。

一.@RequestParam
      作用:
          把请求中指定名称的参数给控制器中的形参赋值。
          如果页面标签名称和方法参数名称不一致,可以使用此注解实现
      属性:
          name属性:设置参数名称
          defaultValue属性:设置默认值
          required属性:设置是否为必传

  1. /**
  2. * @RequestParam("名称必须与页面标签或者url地址key名称一致")
  3. * */
  4. @RequestMapping("/show1")
  5. public String show1(@RequestParam(name="msg1") String msg){
  6. System.out.println("=====接受到用户发送数据为:"+msg+"=======");
  7. return "success";
  8. }
  9. @RequestMapping("/show2")
  10. public String show2(@RequestParam("msg1") String msg, @RequestParam("msg2") int num){
  11. System.out.println("=====接受到用户发送数据为:"+msg+"=======");
  12. System.out.println("=====接受到用户发送数据为:"+num+"=======");
  13. return "success";
  14. }
  15. @RequestMapping("/show3")
  16. public String show4(@RequestParam(name = "uname",defaultValue = "暂无用户") String name){
  17. System.out.println("账号:"+name);
  18. return "success";
  19. }

 二.@RequestBody
      作用:
          用于获取"请求体"内容。直接使用得到是 key=value&key=value...
          结构的数据,并可以转换为对象
      属性:
          required:是否必须有请求体。默认值是:true。

  1. /**
  2. * 前后端分离
  3. * @RequestBody可以将json ===》 javaBean
  4. * 注意:
  5. * 1.前端不能使用GET方式提交数据,GET方式无请求体
  6. * {
  7. * "eid":101,
  8. * "ename":"詹姆斯邦德",
  9. * "esex":"绅士"
  10. * }
  11. *
  12. * * */
  13. @RequestMapping("/show4")
  14. public String show4(@RequestBody Emp emp){
  15. System.out.println("=========="+emp+"==========");
  16. return "success";
  17. }

 三.@PathVaribale
      作用:
          用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},
          这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之
          后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志
      属性:
          value:用于指定 url 中占位符名称。
          required:是否必须提供占位符。

  1. @PostMapping("/show5/{uname}/{pwd}")
  2. public String show5(@PathVariable("uname") String msg1, @PathVariable("pwd") String msg2){
  3. System.out.println(msg1);
  4. System.out.println(msg2);
  5. return "success";
  6. }
  7. @PostMapping("/show6/{uname}/{pwd}")
  8. public String show6(@PathVariable String uname, @PathVariable String pwd){
  9. System.out.println(uname);
  10. System.out.println(pwd);
  11. return "success";
  12. }

  Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
  主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,
  更易于实现缓存机制等。

  Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
       GET:用于获取资源
       POST:用于新建资源
       PUT:用于更新资源
       DELETE:用于删除资源
例如:
新增   POST    http://localhost:8080/user/用户名/用户密码/用户性别
查询   GET     http://localhost:8080/user/用户ID
删除   delete  http://localhost:8080/user/用户ID
修改   put     http://localhost:8080/user/用户ID/用户名/用户密码/用户性别

localhost:8080/login?uname=王老师&upwd=123
localhost:8080/login/王老师/123

(4)数据传递

在 Spring MVC 中,你可以通过模型对象来传递数据到视图。通常用 Model 或 ModelAndView 类。

 1.页面跳转重定向
  • redirect:表示浏览器执行重定向,会改变浏览器地址栏的URL。

  • forward:表示请求转发,URL不改变,还是原来的URL。

  • 返回的字符串值(如"index""success_String")通常会对应于Spring MVC的视图解析器配置,决定最终渲染的视图。

根据需要的行为选择使用重定向或转发,合适的设计将有助于提升用户体验和应用性能。

  1. package com.xn.springboot_web_04.controller;
  2. import com.xn.springboot_web_04.pojo.Emp;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import javax.servlet.http.HttpServletRequest;
  6. /**
  7. * 返回值为:字符串
  8. * */
  9. @Controller
  10. @RequestMapping("/string")
  11. public class StringController_01 {
  12. /**
  13. * 进入首页
  14. * */
  15. @RequestMapping("/show")
  16. public String show(){
  17. return "index";
  18. }
  19. /*
  20. * 充当试图的逻辑名称,默认页面跳转为请求转发方式
  21. * */
  22. @RequestMapping("/show1")
  23. public String show1(){
  24. System.out.println("=========show1=========");
  25. return "success_String";
  26. }
  27. /*
  28. * 作充当一次请求转发或重定向
  29. * */
  30. @RequestMapping("/show2")
  31. public String show2(){
  32. System.out.println("=========show2=========");
  33. return "redirect:show1";
  34. }
  35. @RequestMapping("/show3")
  36. public String show3(){
  37. System.out.println("=========show3=========");
  38. return "forward:show1";
  39. }
  40. @RequestMapping("/show4")
  41. public String show4(HttpServletRequest request){
  42. System.out.println("=========show4=========");
  43. //1.查询数据库(模拟)
  44. Emp emp = new Emp(1,"张毅老师","男");
  45. //2.获取session
  46. request.getSession().setAttribute("emp",emp);
  47. return "success_String";
  48. }
  49. }
 2、 json格式转换

@RestController 是一个在 Spring Framework 中常用的注解,主要用于简化 RESTful Web 服务的开发。它结合了 @Controller 和 @ResponseBody 的作用。以下是 @RestController 的一些关键点和特点:

1. 意义与用途

  • @RestController 注解用于定义一个控制器,处理 HTTP 请求并返回 JSON/XML 格式的响应体。这在构建 RESTful API 时非常有用。

  • 当一个类被标注为 @RestController,这个类中的每个方法默认为返回 JSON 或 XML 响应,而不是渲染视图。

  1. @Controller
  2. @RequestMapping("/json")
  3. public class JsonController_02 {
  4. /**
  5. *
  6. * @ResponseBody 对象====>json
  7. * 位置:1.类
  8. * 2.方法
  9. *
  10. *
  11. * @RequestBody json====>对象
  12. * 位置:方法参数
  13. *
  14. * @RestController = @Controller + @ResponseBody
  15. *
  16. * */
  17. @RequestMapping("/show1")
  18. @ResponseBody
  19. public List<Emp> show1(){
  20. //1模拟数据库
  21. Emp emp1 = new Emp(1,"张毅老师","男");
  22. Emp emp2 = new Emp(2,"张毅老师","男");
  23. Emp emp3 = new Emp(3,"张毅老师","男");
  24. List<Emp> list = new ArrayList<>();
  25. list.add(emp1);
  26. list.add(emp2);
  27. list.add(emp3);
  28. return list;
  29. }
  30. @RequestMapping("/show2")
  31. @ResponseBody
  32. public String show2(){
  33. return "helloWorld";
  34. }
  35. }

自动响应
  • 方法返回的对象会自动转换为 JSON(或 XML,取决于请求的 Accept 头)并写入 HTTP 响应体中,而不需要显式使用 @ResponseBody 注解。

(5)文件上传

方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
  1. <!-- 文件上传 -->
  2. <dependency>
  3. <groupId>commons-io</groupId>
  4. <artifactId>commons-io</artifactId>
  5. <version>2.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>commons-fileupload</groupId>
  9. <artifactId>commons-fileupload</artifactId>
  10. <version>1.3.3</version>
  11. </dependency>
  1. @Controller
  2. public class UserController {
  3. //进入测试页面
  4. @RequestMapping("/show")
  5. public String show(){
  6. return "index";
  7. }
  8. //文件上传
  9. @RequestMapping("/fileupload")
  10. public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){
  11. System.out.println("用户名:"+uname);
  12. System.out.println(upic);
  13. System.out.println(upic.getOriginalFilename());
  14. System.out.println(upic.getName());
  15. }
  16. }
 方式2.文件服务器(七牛云)
  1. <!-- 导入七牛云需要坐标 -->
  2. <dependency>
  3. <groupId>com.qiniu</groupId>
  4. <artifactId>qiniu-java-sdk</artifactId>
  5. <version>7.2.25</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.squareup.okhttp3</groupId>
  9. <artifactId>okhttp</artifactId>
  10. <version>3.14.2</version>
  11. <scope>compile</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.google.code.gson</groupId>
  15. <artifactId>gson</artifactId>
  16. <version>2.8.5</version>
  17. <scope>compile</scope>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.qiniu</groupId>
  21. <artifactId>happy-dns-java</artifactId>
  22. <version>0.1.6</version>
  23. <scope>test</scope>
  24. </dependency>
  25. <!-- 文件上传 -->
  26. <dependency>
  27. <groupId>commons-io</groupId>
  28. <artifactId>commons-io</artifactId>
  29. <version>2.6</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>commons-fileupload</groupId>
  33. <artifactId>commons-fileupload</artifactId>
  34. <version>1.3.3</version>
  35. </dependency>
  1. @Controller
  2. public class UserController {
  3. //进入测试页面
  4. @RequestMapping("/show")
  5. public String show(){
  6. return "index";
  7. }
  8. //文件上传
  9. @RequestMapping("/fileupload")
  10. public String fileupload(String uname, MultipartFile upic, HttpServletRequest request){
  11. System.out.println("用户名:"+uname);
  12. System.out.println(upic);
  13. System.out.println(upic.getOriginalFilename());
  14. System.out.println(upic.getName());
  15. //方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
  16. //方式2.文件服务器(七牛云)
  17. //构造一个带指定 Region 对象的配置类
  18. Configuration cfg = new Configuration(Region.autoRegion());
  19. //...其他参数参考类注释
  20. UploadManager uploadManager = new UploadManager(cfg);
  21. //...生成上传凭证,然后准备上传
  22. String accessKey = "Lo5tVZ7DcrNNVMWCaq4wPosNdrAbRv5aKGldQ__l";
  23. String secretKey = "N2wIAm84WQXAz63RVI82AFa81j03afQnmg4ekZMz";
  24. String bucket = "xiaobainn";
  25. //默认不指定key的情况下,以文件内容的hash值作为文件名
  26. String key = "2024/2.jpg";
  27. String name = null;
  28. try {
  29. byte[] uploadBytes = upic.getBytes();
  30. Auth auth = Auth.create(accessKey, secretKey);
  31. String upToken = auth.uploadToken(bucket);
  32. try {
  33. Response response = uploadManager.put(uploadBytes, key, upToken);
  34. //解析上传成功的结果
  35. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
  36. System.out.println(putRet.key);//获取文件名
  37. System.out.println(putRet.hash);//获取文件hash值
  38. name = putRet.key;
  39. } catch (QiniuException ex) {
  40. Response r = ex.response;
  41. System.err.println(r.toString());
  42. try {
  43. System.err.println(r.bodyString());
  44. } catch (QiniuException ex2) {
  45. //ignore
  46. }
  47. }
  48. } catch (Exception ex) {
  49. //ignore
  50. }
  51. request.getSession().setAttribute("picname",name);
  52. return "success";
  53. }
  54. }

 

六、注册Servlet三大组件 Servlet/Filter/Listener

而由于 Spring Boot 默认是以 jar 包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件, Spring提供以下Bean来注册三大组件

ServletRegistrationBean                 注册自定义

Servlet FilterRegistrationBean        注册自定义Filter

ServletListenerRegistrationBean    注册自定义Listener

  1. @WebFilter(urlPatterns = {"/*"})
  2. public class MyFilter implements Filter{
  3. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  4. throws IOException, ServletException {
  5. System.out.println("============请求过滤");
  6. request.setCharacterEncoding("utf-8");
  7. //分水岭
  8. chain.doFilter(request, response);
  9. response.setCharacterEncoding("utf-8");
  10. System.out.println("============响应过滤");
  11. }
  12. }
  1. @WebServlet("/myServlet")
  2. public class MyServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException {
  4. System.out.println("进入servlet");
  5. resp.getWriter().println("<h1>hello world</h1>");
  6. };
  7. @Override
  8. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  9. this.doPost(req, resp);
  10. }
  11. }
  1. @WebListener
  2. public class MyListener implements ServletContextListener {
  3. @Override
  4. public void contextInitialized(ServletContextEvent sce) {
  5. ServletContextListener.super.contextInitialized(sce);
  6. System.out.println("-------------MyListener inited !");
  7. }
  8. @Override
  9. public void contextDestroyed(ServletContextEvent sce) {
  10. ServletContextListener.super.contextDestroyed(sce);
  11. System.out.println("----------------MyListener Destroy !");
  12. }
  13. }

如果使用传统

@WebFilter...实现注册也可以

条件:

        1.一定是自定义组件

        2.启动类添加@ServletComponentScan

七、切换为其他嵌入式Servlet容器

SpringBoot 默认针对Servlet容器提供以下支持:

Tomcat(默认使用)

Jetty :支持长连接项目(如:聊天页面)[ˈdʒeti]

Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器[ˈʌndətəʊ]

默认Tomcat容器

 切换 Jetty 容器

  1. package com.apesource.springboot04web04;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.web.servlet.ServletComponentScan;
  5. @SpringBootApplication
  6. @ServletComponentScan
  7. public class SpringBoot04Web04Application {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SpringBoot04Web04Application.class, args);
  10. }
  11. }

 使用外置Servlet容器Tomcat9.x

嵌入式Servlet容器:运行启动类就可启动,或将项目打成可执行的 jar 包

        优点:简单、快捷;

        缺点:默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道 每个功能 的底层原理

外置Servlet容器:配置 Tomcat, 将项目部署到Tomcat中运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/974694
推荐阅读
相关标签
  

闽ICP备14008679号