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等,视图
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);
}