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

相關文章
相關標籤/搜索