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;@Controllerpublic 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;@Controllerpublic 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;@RestControllerpublic 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;@RestControllerpublic 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中申请数据的获取和响应数据处理的一个根本过程.