MVC是一种软件架构设计思想,基于MVC架构将咱们的应用软件进行分层设计和实现,例如能够分为视图层(View),控制层(Controller),模型层(Model),经过这样的分层设计让咱们程序具有更好的灵活性和可可扩展性.由于这样能够将一个复杂应用程序进行简化,实现各司其职,各尽所能.比较适合一个大型应用的开发.css
Spring MVC是MVC设计思想在Spring框架中的一种实现,基于这样的思想spring框架设计了一些相关对象,用于更好的基于MVC架构处理请求和响应,其简易架构如图所示:
其中:
1)DispatcherServlet是客户端全部请求处理的入口,负责请求转发。
2)RequestMapping负责存储请求url到后端handler对象之间的映射。
3)Handler 用于处理DispatcherServlet对象转发过来的请求数据。
4)ViewResolver负责处理全部Handler对象响应结果中的view。html
第一步:建立项目module,基本信息如图所示:java
第二步:添加项目依赖(能够在module建立时,也能够建立后),代码以下:web
Spring Web 依赖(提供了spring mvc支持而且会嵌入一个tomcat)spring
<!--添加spring web模块依赖支持(这个依赖中默认会嵌套一个tomcat服务器)--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Thymeleaf 依赖(提供了以html做为页面模板进行解析和操做的相关对象)数据库
<!--spring boot 中默认支持的一个模板引擎,这个引擎能够以html做为模板, 咱们能够在模板上添加thymeleaf自定义的标签属性,而后基于属性操做数据, 这种引擎主要是用于取代jsp技术--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
第三步:启动项目检测控制台启动状态是否OKjson
static 目录为springboot工程建立时添加了web依赖之后自动建立的目录,此目录中能够存储html、css、js、image,这些资源能够在启动服务器之后,直接在浏览器进行访问。例如:
第一步:在static目录下建立一个index.html页面,代码以下:segmentfault
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>The First Html Page</h1> </body> </html>
第二步:启动服务器并直接进行访问测试,如图所示后端
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/ 默认前缀 spring.thymeleaf.prefix=classpath:/templates/module/
第三步:启动服务进行访问测试,如图所示:
第四步:访问过程当中的BUG分析
第五步:thymeleaf页面缓存设置
假如咱们但愿在修改了页面内容之后,不从新启动服务,直接刷新便可看页面改动,能够执行以下操做:
修改配置文件内容,添加以下语句:
咱们有一业务,如今须要将响应数据封装到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>
第三步:启动项目进行访问测试,并检测输出结果,例如:
小结:
png](https://image-static.segmentf...
第四步:运行过程当中的结果分析
咱们有一业务不须要页面,只须要将响应数据转换为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); } }
第三步:启动服务器分别进行访问测试,代码以下:
小结:
当对象把响应结果转换成json格式字符串时,底层会调用对象中的get方法,此时页面中关键字code和 message 与 pojo对象中get方法名有关(规则:将“get”去掉后的首字母改小写),而与属性名无关,本例中即与方法名“getCode”、“getMessage”有关,而与pojo对象中属性名“code”、“message”无关。
第四步:启动或访问过程当中的问题分析
形成此问题缘由通常是POJO对象中的get方法名后面的的关键字段与客户端访问时录入的关键字段名不匹配形成的。
咱们在执行业务的过程当中一般会将一些请求参数传递到服务端,服务端如何获取参数并注入给咱们的方法参数的呢?
定义一个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对象,用于接受客户端请求参数,例如:
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(); }
另一个问题场景分析:
假如未来咱们在向数据库插入某个数据时,如"insert into table () values (#{name},{message}) ",页面上也输入了数据,可是数据库当中仍是提示数据为空,这里就要求pojo对象中需提供与参数名相匹配的set方法。(能够经过在上图中第25行打断点查看param参数有没有值,或将param值打印输出看看有没有值)
启动服务进行访问测试,能够这样传参,例如:
http://localhost/doParam02?name=beijing
有时候咱们不想使用pojo对象接收请求参数,咱们能够使用map对象来接收,又该如何实现呢?
定义Controller方法,基于map对象接收请求参数,例如:
@GetMapping("/doParam03") public String doMethodParam(@RequestParam Map<String,Object> param){ return "request params "+param.toString(); }
因map做为方法参数能够接受任意类型的请求数据,通常只用做一些外包项目,非外包性质、不赶工期的项目仍是尽可能别用,不太严谨!
其中,map接收请求参数,spring默认map是用来接收响应结果集(responseResult)用的,因此这里必须使用@RequestParam对map类型的参数做用进行描述.
启动服务进行访问测试,能够这样传参,例如:
http://localhost/doParam03?name=beijing
本章节对springboot工程下spring mvc技术的应用作了一个入门实现,并结合实际项目中的业务应用,讲解了MVC中请求数据的获取和响应数据处理的一个基本过程.~~~~