Spring MVC

 

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

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

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

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

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

View--- DispacherServlet-(model)-Controllermvc

基本概念app

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文件。jsp


Mavenpost

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

相关文章
相关标签/搜索