乐趣区

关于java:06SpringBoot工程下Spring-MVC技术的应用

06-SpringBoot 工程下 Spring MVC 技术的利用?

springboot

公布于 9 月 30 日

Spring MVC 简介

背景剖析

在大型软件系统设计时,业务个别会绝对简单,如果所有业务实现的代码都纠缠在一起,会呈现逻辑不清晰、可读性差,保护艰难,改变一处就牵一发而动全身等问题。为了更好解决这个问题就有了咱们当初常说的分层架构设计。

MVC 是什么

MVC 是一种软件架构设计思维, 基于 MVC 架构将咱们的应用软件进行分层设计和实现, 例如能够分为视图层(View), 管制层(Controller), 模型层(Model), 通过这样的分层设计让咱们程序具备更好的灵活性和可可扩展性. 因为这样能够将一个简单应用程序进行简化, 实现各司其职, 各尽所能. 比拟适宜一个大型利用的开发.

Spring MVC 概述

Spring MVC 是 MVC 设计思维在 Spring 框架中的一种实现,基于这样的思维 spring 框架设计了一些相干对象,用于更好的基于 MVC 架构解决申请和响应,其繁难架构如图所示:

其中:
1)DispatcherServlet 是客户端所有申请解决的入口, 负责申请转发。
2)RequestMapping 负责存储申请 url 到后端 handler 对象之间的映射。
3)Handler 用于解决 DispatcherServlet 对象转发过去的申请数据。
4)ViewResolver 负责解决所有 Handler 对象响应后果中的 view。

Spring MVC 疾速入门

筹备工作

第一步:创立我的项目 module,根本信息如图所示:

第二步:增加我的项目依赖(能够在 module 创立时,也能够创立后),代码如下:

Spring Web 依赖(提供了 spring mvc 反对并且会嵌入一个 tomcat)

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Thymeleaf 依赖(提供了以 html 作为页面模板进行解析和操作的相干对象)

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

第三步:启动我的项目检测控制台启动状态是否 OK

static 目录剖析及利用

static 目录为 springboot 工程创立时增加了 web 依赖当前主动创立的目录,此目录中能够存储 html、css、js、image,这些资源能够在启动服务器当前,间接在浏览器进行拜访。例如:
第一步:在 static 目录下创立一个 index.html 页面,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <h1>The First Html Page</h1>
</body>
</html>

第二步:启动服务器并间接进行拜访测试, 如图所示

templates 目录剖析及利用

templates 目录为 springboot 工程创立时增加了 thymeleaf 依赖当前主动创立的目录,此目录中要存储一些 html 模板,这个模板页面不能间接通过浏览器 url 进行拜访,须要基于后端控制器,在办法中定义页面响应,例如:

第一步:定义 TemplateController 及办法,代码如下:

package com.cy.pj.health.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TemplateController {@RequestMapping("doTemplateUI")
      public String doTemplateUI(){return "default";}
}

第二步:在 templates 目录中定义模板页面 default.html,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>The Default Template page</h1>
</body>
</html>

其中, 如果 default.html 要在放在 templates 子目录中, 则还须要在配置文件中配置 thymeleaf 的前缀, 例如:

spring.thymeleaf.prefix=classpath:/templates/module/

第三步:启动服务进行拜访测试,如图所示:

第四步:拜访过程中的 BUG 剖析

第五步:thymeleaf 页面缓存设置
如果咱们心愿在批改了页面内容当前,不重新启动服务,间接刷新即可看页面改变,能够执行如下操作:
批改配置文件内容,增加如下语句:

spring.thymeleaf.cache=false

批改 idea 默认配置,容许主动编译,如图所示:

SpringMVC 响应数据处理

ModelAndView 利用

咱们有一业务, 当初须要将响应数据封装到 ModelAndView 对象, 而后响应到客户端, 如何实现呢?

第一步: 定义 ModelViewController 以及办法, 代码如下:

package com.cy.pj.module.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ModelViewController {@RequestMapping("/doModelAndView")
    public String doModelAndView(Model model) {model.addAttribute("username", "jason");
        model.addAttribute("state", true);
        return "view";
    }
}

第二步: 在 templates 相干目录下定义 view.html,并在页面中增加出现数据的代码, 例如:

 <div>
    <ul>
        <li>username:[[${username}]]</li>
        <li>state:[[${state}]]</li>
    </ul>
</div>

第三步: 启动我的项目进行拜访测试, 并检测输入后果, 例如:

第四步: 运行过程中的后果剖析

JSON 数据响应

咱们有一业务不须要页面, 只须要将响应数据转换为 json, 而后响应到客户端, 如何实现呢?
第一步: 定义 ResponseResult 对象用于封装响应数据, 例如:

package com.cy.pj.module.pojo;
public class ResponseResult {
    private Integer code;
    private String message;
    public Integer getCode() {return code;}
    public void setCode(Integer code) {this.code = code;}
    public String getMessage() {return message;}
    public void setMessage(String message) {this.message = message;}
}

第二步: 定义 JsonObjectController 以及办法, 代码如下:

package com.cy.pj.module.controller;

@RestController
public class JsonObjectController {@RequestMapping("/doConvertResponseToJson")
    public ResponseResult doConvertResponseToJson(){ResponseResult rs=new ResponseResult();
        rs.setCode(200);
        rs.setMessage("OK");
        return rs;
    }
    
    @RequestMapping("/doConvertMapToJson")
    public Map<String,Object> doConvertMapToJson(){Map<String,Object> map=new HashMap<>();
        map.put("username","刘德华");
        map.put("state",true);
        return map;
    }
    
    @RequestMapping("/doPrintJSON")
    public void doPrint(HttpServletResponse response)throws Exception{Map<String,Object> map=new HashMap<>();
        map.put("username","刘德华");
        map.put("state",true);
        // 将 map 中的数据转换为 json 格局字符串
        ObjectMapper om=new ObjectMapper();
        String jsonStr=om.writeValueAsString(map);
        System.out.println("jsonStr="+jsonStr);
        // 将字符串响应到客户端
        // 设置响应数据的编码
        response.setCharacterEncoding("utf-8");
        // 通知客户端, 要向它响应的数据类型为 text/html, 编码为 utf-8. 请以这种编码进行数据出现
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw=response.getWriter();
        pw.println(jsonStr);
    }
    
} 

第三步: 启动服务器别离进行拜访测试, 代码如下:

第四步: 启动或拜访过程中的问题剖析

SpingMVC 申请参数数据处理

咱们在执行业务的过程中通常会将一些申请参数传递到服务端, 服务端如何获取参数并注入给咱们的办法参数的呢?

筹备工作

定义一个 controller 对象, 用户解决客户端申请, 例如:

package com.cy.pj.module.controller;
import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
public class ParamObjectController {}

间接量形式

在 ParamObjectController 中增加办法, 基于间接量形式承受客户端申请参数, 例如:

@GetMapping("/doParam01")
public String doMethodParam(String name){return "request params"+name;}

拜访时, 能够这样传参, 例如:

http://localhost/doParam01?name=beijing

POJO 对象形式

定义 pojo 对象, 用于承受客户端申请参数, 例如:

package com.cy.pj.module.pojo;
public class RequestParameter {
    private String name;
    //......
 public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    @Override
 public String toString() {
        return "RequestParam{" +
                "name='" + name + '''+'}';
    }
}

定义 Controller 办法, 办法中应用 pojo 对象接管办法参数, 例如:

@RequestMapping("/doParam02")
public String doMethodParam(RequestParameter param){//pojo 对象接管申请参数,pojo 对象中需提供与参数名相匹配的 set 办法
 return "request params"+param.toString();} 

启动服务进行拜访测试, 能够这样传参, 例如:

http://localhost/doParam02?name=beijing

Map 对象形式

有时候咱们不想应用 pojo 对象接管申请参数, 咱们能够应用 map 对象来接管, 又该如何实现呢?

定义 Controller 办法, 基于 map 对象接管申请参数, 例如:

@GetMapping("/doParam03")
public String doMethodParam(@RequestParam Map<String,Object> param){return "request params"+param.toString();
}

其中,map 接管申请参数, 必须应用 @RequestParam 对参数进行形容.

启动服务进行拜访测试, 能够这样传参, 例如:

http://localhost/doParam03?name=beijing
退出移动版