MVC为何
顾名思义MVC是M(model) V(view) C(controller)是一种软件架构设计思想,将业务分层设计和实现。使程序具有更好的灵活性和可扩展性。
结合操作的简单实例来理解此图像,可以有更好的效果。
DispatcherServlet我们叫它中央控制器,他好比大脑进行整个业务的操控。DispatcherServlet不是由我们创建,而是由spring底层来创建。
在我们通过浏览器中输入url进行访问时
DispatcherServlet会把url传给RequestMapping,通过它内部存储url与handler之间的映射关系,用DispatcherServlet传来的url来寻找到对应handler并传回DispatcherServlet。同样RequestMapping也不是我们而是由底层创建的。
DispatcherMapping将request传给对应的Handler,这个Hanndler是需要要我们自己去实现。
package com.cy.pj.health.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //bean 对象
public class TemplateController {//在spring mvc中这个对象称之为handler(处理器)
@RequestMapping("doTemplateUI") // @RequestMapping用于定义url请求的映射
public String doTemplateUI(){
return "default";//view name (视图名)
}
}
@RequestMapper("abc")定义通过传入abc来调用此方法。
所返回的值便是view name,讲这个值返回给DispatcherServlet。
DispatcherServlet收到所返回的值后将其交给View Resovler
View Resovler同样是由底层负责创建,我们只需要在application.properties中添加我们所学需要的配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
View Resovler 增加前缀,后缀,数据。后返回DispatcherServlet。
Title
The defalut page of templates
再由DispatherSerlvet响应给用户
ModelAndView应用实例
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";
}
}
处理完用户请求后,直接将响应数据封装到model中,然后和
view一起封装成ModelAndView对象返回给DispatcherServlet。
ps.model是底层创建的并且是用map来存储数据。
界面显示代码如下
- username:[[${username}]]
- state:[[${state}]]
Json
但是上面的ModelAndView这将数据和页面绑定到一起了,如果我们只需要数据的话,那么就要用到Json了
@RestController
public class JsonObjectController {
@RequestMapping("/doConvertResponseToJson")
public ResponseResult doConvertResponseToJson(){
ResponseResult rs=new ResponseResult();
rs.setCode(200);
rs.setMessage("OK");
return rs;
}
我们使用自己创建的类去封装信息。
@RestController注解中包含
@Controller
@ResponseBody
使用这个注解以后,该类中的所有方法都不需要在额外的添加@ResponseBody注解
@ResponseBody注解作用在,将返回值转成Json格式字符串返回。
new ObjectMapper().writeValueAsString(rs);//自己将对象转换为json字符串时,使用的就是这行代码。
定义pojo对象,用于接受客户端请求参数时我们可以直接接收
或者自己创建一个pojo对象
//http://localhost/doParam01?name=mvc
@RestController
public class ParamObjectController {
//基于直接量参数来接收请求中的参数数据,我们定义的方法参数名应与请求中的参数名相同
@GetMapping("/doParam01")//这个注解描述的方法只能处理Get类型的请求
//@ResponseBody
//@RequestMapping(value="/doParam01",method = RequestMethod.GET)
public String doMethodParam(String name){
return "request params "+name;
}
@GetMapping("/doParam02")
public String doMethodParam(RequestParameter param){
//当使用pojo对象作为方法参数接收客户端参数数据时,pojo对象中应该提供与客户端参数名匹配的set方法
return "request params "+param.toString();
}
用map接收请求参数,必须使用@RequestParam对参数进行描述
@GetMapping("/doParam03")
public String doMethodParam(@RequestParam Map param){
//当方法参数是map类型,而且希望基于map接收客户端请求参数
//但是,使用map作为方法参数接收客户端请求数据不太严谨(客户端可以传递任意参数).
return "request params "+param.toString();
}