美文网首页
SpringBoot工程下Spring MVC技术的应用

SpringBoot工程下Spring MVC技术的应用

作者: Java旺 | 来源:发表于2020-10-24 21:30 被阅读0次

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!
    GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

    Spring MVC 简介

    背景分析

    在大型软件系统设计时,业务一般会相对复杂,假如所有业务实现的代码都纠缠在一起,会出现逻辑不清晰、可读性差,维护困难,改动一处就牵一发而动全身等问题。为了更好解决这个问题就有了我们现在常说的分层架构设计。

    MVC 是什么

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

    Spring MVC 概述

    Spring MVC是MVC设计思想在Spring框架中的一种实现,基于这样的思想spring框架设计了一些相关对象,用于更好的基于MVC架构处理请求和响应,其简易架构如图所示:

    SpringBoot工程下Spring MVC技术的应用

    其中:

    1)DispatcherServlet是客户端所有请求处理的入口,负责请求转发。

    2)RequestMapping负责存储请求url到后端handler对象之间的映射。

    3)Handler 用于处理DispatcherServlet对象转发过来的请求数据。

    4)ViewResolver负责处理所有Handler对象响应结果中的view。

    Spring MVC 快速入门

    准备工作

    第一步:创建项目module,基本信息如图所示:

    SpringBoot工程下Spring MVC技术的应用

    第二步:添加项目依赖(可以在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

    statics 目录分析及应用

    statics 目录为springboot工程创建时添加了web依赖以后自动创建的目录,此目录中可以存储html、css、js、html等相关资源,这些资源可以在启动服务器以后,直接在浏览器进行访问。例如:

    第一步:在statics目录下创建一个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>
    

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

    SpringBoot工程下Spring MVC技术的应用

    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/
    

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

    SpringBoot工程下Spring MVC技术的应用

    SpringMVC 响应数据处理

    ModelAndView 应用

    我们有一业务,现在需要将响应数据封装到ModelAndView对象,然后响应到客户端,如何实现呢?

    第一步:定义### ModelAndViewontroller以及方法,返回页面和数据形式:

    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 "default";
        }
    }
    

    返回页面形式代码:

    package com.cy.pj.health.controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    @Controller
    public class PageController {
        //返回页面
     @RequestMapping("/getview")
        public String doHealthUI(){
            return "default";
        }
    }
    

    第三步:启动项目进行访问测试,并检测输出结果,例如:

    SpringBoot工程下Spring MVC技术的应用

    JSON数据响应

    我们有一业务不需要页面,只需要将响应数据转换为json,然后响应到客户端,如何实现呢?

    第一步:定义ReponseResult对象用于封装响应数据,例如:

    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;
        }
    }
    

    第二步:定义JsonObjctController以及方法,代码如下:

    package com.cy.pj.module.controller;
    
    @RestController
    //@RestController=@Controller+@ponseBody
    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);
        }
    
    }
    

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

    SpringBoot工程下Spring MVC技术的应用

    异常分析:

    请求资源不存在,页面显示404

    SpringBoot工程下Spring MVC技术的应用 SpringBoot工程下Spring MVC技术的应用

    模板解析不正确或不存在页面显示500

    SpringBoot工程下Spring MVC技术的应用 SpringBoot工程下Spring MVC技术的应用

    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
    

    总结(Summary)

    本章节对springboot工程下spring mvc技术的应用做了一个入门实现,并结合实际项目中的业务应用,讲解了MVC中请求数据的获取和响应数据处理的一个基本过程.

    来源:https://www.tuicool.com/articles/aqYvaav

    相关文章

      网友评论

          本文标题:SpringBoot工程下Spring MVC技术的应用

          本文链接:https://www.haomeiwen.com/subject/gzvwmktx.html