Spring MVC

 

Model-View-Controller 开发web的通用框架

MVC的核心思想是业务数据抽取同业务数据呈现相分离

View:视图层
为用户提供UI重点关注数据的呈现

Model:模型层
业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合。

Controller:控制层
调用业务逻辑产生合适的数据(model),传递数据给视图层用于呈现。

View--- DispacherServlet-(model)-Controller

基本概念

DispacherServlet
HandlerAdapter(适配器)
HandlerInterceptor(拦截器):给在前端控制器调用Controller方法之前、之后提供操作方法:preHandle()、postHandle()、afterCompletion()
HandlerMapping(前段控制器与Controller之间的映射关系、wrap controller with HandlerInterceptor
HandlerExecutionChain
preHandle -->Controller method-->postHandle-->afterCompletion(使用了java的反射机制)
ModelAndView(Model\Map):Model的具体表现
ViewResolver(视图解析器):告诉DispacherServlet要用哪一个视图来进行视图的呈现
View:jstl、jsp、tiles等,视图

 Spring MVC的工作原理是怎样的?
答:Spring MVC的工作原理如下图所示:
这里写图片描述
① 客户端的所有请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其他模块来真正处理用户的请求。
② DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler(任何一个对象都可以作为请求的Handler)。
③在这个地方Spring会通过HandlerAdapter对该处理器进行封装。
④ HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。
⑤ Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。
⑥ ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。
⑦ 当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。
⑧ 客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件。


Maven

POM(Project Object Model)pom.xml文件
Dependency
Coordinates(坐标):groupId、artifactId、version、packaging四个属性确定唯一坐标

DispacherServlet 上下文

启用Spring基于annotation的DI,使用户可以在spring MVC中使用Spring的强大功能。
激活@Required @Autowired,等标注
<context:annotation-config/>

<context:component-scan>

扩充了注解驱动,可以请求参数绑定到控制器参数
<mvc:annotation-driven/>

静态资源处理
<mvc:resource mapping="" location=""/>

有关文件上传的配置,添加如下bean:
org.springframework.web.multipart.commons.CommonsMultipartResolver

ContentNegotiationViewResolver:设置不同的视图呈现

jetty
mvn jetty:run

@RequestMapping 设置url

Controller中的三种方式获得参数

(1)@RequestParam

@RequestMapping(value="abc",method=RequestMethod.GET)
public String method(@RequestParam("param")String param,Model model){
logger.info("param:{}",param);
model.addAttribute("param","param");
return "show";
}
//该Controller的访问路径:/root/abc?param=123

(2)@PathVariable

@RequestMapping(value="/abc/{param}",method=RequestMethod.GET)
public String method(@PathVariable String param,Map<String,Object> model){
logger.info("param:{}"+param);
model.put("param","param");
return "show";
}
//该Controller的访问路径:/root/abc/param

(3)HttpSeverletRequest

@RequestMapping(value="abc",method=RequestMethod.GET)
public String method(HttpSeverletRequest request){
String param = request.getParameter("param");
logger.info("param:{}"+param);
request.setAttribute("param","param");
return "redirect:show";//重定向or请求转发
}
//该Controller的访问路径:/root/abc?param=123

redirect请求重定向

ReflectionToStringBuilder.toString(Object)//可打印出一个类

文件上传的jsp部分
<form method="post" action="/root/doUpload" enctype="multipart/form-data">
<input type="file" name"file"/>
<inpute type="submit"/>
</form>
Controller部分
@RequestMapping(value="doUpload",method=RequestMethod.post)
public String doUpload(@RequestParam("file")MultipartFile file){
if(!file.isEmpty()){
FileUtils.copyInputStreamToFile(file.getInputStream(), new File("/Users/macbookair/Desktop"+System.currentTimeMillis()+file.getOriginalFilename()));
}
return "success";
}


jspView\jsonView

让页面以Json格式呈现的方法
(1)给方法的返回类型前加注解@ResponseBody
(2)让方法的返回类型设置为ResponseEntity<Object> //Object为返回的类(实际模型数据)

@RequestMapping(value="/abc/{courseId}",method=RequestMethod.GET)
public ResponseEntity<Course> getCourseInJson(@PathVariable Integer courseId){
Course course = courseService.getCoursebyId(courseId);
return new ResponseEntity<Course>(course,HttpStatus.OK);
}

 

posted @ 2018-04-06 16:58  Rage_Leila  阅读(99)  评论(0编辑  收藏  举报