javascript
java mvc模式工作流程_SpringMVC的简介和工作流程
一、簡(jiǎn)介
Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面。Spring 框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊。SpringMVC是一種web層的mvc框架,用于替代servlet(處理響應(yīng)請(qǐng)求,獲取表單參數(shù),表單驗(yàn)證等)
二、工作流程
image.png
用戶發(fā)送請(qǐng)求至前端控制器DispatcherServlet。
DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找),生成處理器對(duì)象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
HandlerAdapter經(jīng)過適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
Controller執(zhí)行完成返回ModelAndView。
HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。
DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
ViewReslover解析后返回具體View
DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
DispatcherServlet響應(yīng)用戶。
三、理解
1、為什么要使用springMVC?
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦。基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化日常Web開發(fā)。(處理業(yè)務(wù)數(shù)據(jù)的對(duì)象和顯示業(yè)務(wù)數(shù)據(jù)的視圖之間存在緊密耦合)
2、什么是MVC設(shè)計(jì)模式?
MVC即Model-View-Controller,將應(yīng)用按照Model(模型)、View(視圖)、Controller(控制)這樣的方式分離。
視圖(View):代表用戶交互界面,對(duì)于Web應(yīng)用來說,可以是HTML,也可能是jsp、XML和Applet等。一個(gè)應(yīng)用可能有很多不同的視圖,MVC設(shè)計(jì)模式對(duì)于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請(qǐng)求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。
模型(Model):是業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)則的制定。模型接受視圖請(qǐng)求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計(jì)是MVC最主要的核心。MVC設(shè)計(jì)模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,抽象與具體不能隔得太遠(yuǎn),也不能太近。MVC并沒有提供模型的設(shè)計(jì)方法,而只是組織管理這些模型,以便于模型的重構(gòu)和提高重用性。
控制(Controller):可以理解為從用戶接收請(qǐng)求, 將模型與視圖匹配在一起,共同完成用戶的請(qǐng)求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個(gè)分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請(qǐng)求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。
3、SpringMVC的特點(diǎn)
清晰的角色劃分:控制器(controller)、驗(yàn)證器(validator)、 命令對(duì)象(command object)、表單對(duì)象(formobject)、模型對(duì)象(model object)、 Servlet分發(fā)器(DispatcherServlet)、處理器映射(handler mapping)、視圖解析器(view resolver)等。每一個(gè)角色都可以由一個(gè)專門的對(duì)象來實(shí)現(xiàn)。
強(qiáng)大而直接的配置方式:將框架類和應(yīng)用程序類都能作為JavaBean配置,支持跨多個(gè)context的引用,例如,在web控制器中對(duì)業(yè)務(wù)對(duì)象和驗(yàn)證器(validator)的引用。
可適配、非侵入:可以根據(jù)不同的應(yīng)用場(chǎng)景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。
可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對(duì)象作為命令或表單對(duì)象,而不需要去擴(kuò)展某個(gè)特定框架的基類。
可定制的綁定(binding) 和驗(yàn)證(validation):比如將類型不匹配作為應(yīng)用級(jí)的驗(yàn)證錯(cuò)誤, 這可以保存錯(cuò)誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框架中,你只能使用字符串表單對(duì)象,需要手動(dòng)解析它并轉(zhuǎn)換到業(yè)務(wù)對(duì)象。
可定制的handlermapping和view resolution:Spring提供從最簡(jiǎn)單的URL映射, 到復(fù)雜的、專用的定制策略。與某些webMVC框架強(qiáng)制開發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。
靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map的 鍵/值對(duì)來達(dá)到輕易地與各種視圖技術(shù)的集成。
可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標(biāo)簽庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。
簡(jiǎn)單而強(qiáng)大的JSP標(biāo)簽庫(SpringTag Library):支持包括諸如數(shù)據(jù)綁定和主題(theme) 之類的許多功能。
JSP表單標(biāo)簽庫:在Spring2.0中引入的表單標(biāo)簽庫,使得在JSP中編寫 表單更加容易。
Spring Bean的生命周期可以被限制在當(dāng)前的HTTP Request或者HTTP Session。
4、SpringMVC的優(yōu)點(diǎn)
讓我們能非常簡(jiǎn)單的設(shè)計(jì)出干凈的Web層和薄薄的Web層
進(jìn)行更簡(jiǎn)潔的Web層的開發(fā)
天生與Spring框架集成(如IoC容器、AOP等)
提供強(qiáng)大的約定大于配置的契約式編程支持
非常靈活的數(shù)據(jù)驗(yàn)證、格式化和數(shù)據(jù)綁定機(jī)制
支持Restful風(fēng)格
5、SpringMVC的入門程序
web.xml
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.do
springmvc.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
自定義處理器(適配器方式一)實(shí)現(xiàn)Controller接口
public class MyController implements Controller{
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
ModelAndView mv = new ModelAndView();
//設(shè)置頁面回顯數(shù)據(jù)
mv.addObject("hello", "歡迎學(xué)習(xí)springmvc!");
//返回物理視圖
//mv.setViewName("/WEB-INF/jsps/index.jsp");
//返回邏輯視圖
mv.setViewName("index");
return mv;
}
}
自定義處理器(適配器方式二)實(shí)現(xiàn)HttpRequestHandler 接口
public class UserController2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//保存消息
HttpSession session = request.getSession();
session.setAttribute("message", "恭喜你成功訪問第一個(gè)springMVC環(huán)境成功了!--實(shí)現(xiàn)方式為:HttpRequestHandlerAdapter");
//頁面跳轉(zhuǎn)(使用重定向,保存消息那里,我們要用 ? request session application pageContext )
response.sendRedirect(request.getContextPath()+"/main.jsp");
}
}
SpringMVC注解方式處理器適配器、映射器
注解映射器
在spring3.1版本之前,系統(tǒng)默認(rèn)加載DispatcherServlet.properoties文件中的org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器,3.1版本之后要使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping這個(gè)注解映射器。在springmvc.xml中進(jìn)行RequestMappingHandlerMapping的配置:
使用RequestMappingHandlerMapping需要在Handler 中使用@controller標(biāo)識(shí)此類是一個(gè)控制器,使用@requestMapping指定Handler方法所對(duì)應(yīng)的url。
注解適配器
Spring3.1之前默認(rèn)加載DispatcherServlet.properoties中的注解適配器是
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1版本之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter這個(gè)注解適配器。在springmvc.xml中進(jìn)行如下配置:
RequestMappingHandlerAdapter,不要求Handler實(shí)現(xiàn)任何接口,它需要和RequestMappingHandlerMapping注解映射器配對(duì)使用,主要解析Handler方法中的形參。
也可以使用使用 標(biāo)簽來配置,它是一種簡(jiǎn)寫模式,它會(huì)自動(dòng)注冊(cè)處理器適配器,配置方式如下:
自定義控制器
//使用Controller來標(biāo)識(shí)它是一個(gè)控制器
@Controller
public class TestControllerTest{
@RequestMapping("/testurl")
public ModelAndView testurl() throws Exception{
//邏輯代碼
}
}
然后在springmvc.xml中對(duì)該Handler進(jìn)行配置:
上面我們通過對(duì)單個(gè)注解Handler的配置,也可以使用組件掃描對(duì)整個(gè)包下的Handler進(jìn)行配置。
6、SpringMVC常用注解及其作用
@Controller:標(biāo)識(shí)這個(gè)類是一個(gè)控制器
@RequestMapping:給控制器方法綁定一個(gè)uri
@ResponseBody:將java對(duì)象轉(zhuǎn)成json,并且發(fā)送給客戶端
@RequestBody:將客戶端請(qǐng)求過來的json轉(zhuǎn)成java對(duì)象
@RequestParam:當(dāng)表單參數(shù)和方法形參名字不一致時(shí),做一個(gè)名字映射
@PathVarible:用于獲取uri中的參數(shù),比如user/1中1的值
Rest風(fēng)格的新api
@RestController相當(dāng)于@Controller+ @ResponseBody
@GetMapping@DeleteMapping@PostMapping@PutMapping
其他注解
@SessionAttribute:聲明將什么模型數(shù)據(jù)存入session
@CookieValue:獲取cookie值
@ModelAttribute:將方法返回值存入model中
@HeaderValue:獲取請(qǐng)求頭中的值
7、SpringMVC和Struts2的對(duì)比
框架機(jī)制:SpringMVC的入口是servlet,而Struts2是filter。
Filter在容器啟動(dòng)后就初始化,服務(wù)停止后銷毀,晚于Servlet;Servlet是在調(diào)用之后初始化并且先于Filter調(diào)用,服務(wù)停止后銷毀。
調(diào)用順序:filter的調(diào)用順序:
按照web.xml中的映射配置順序按照配置條件從后向前調(diào)用
層次調(diào)用doFilter()方法中FilterChain.doFilter()之前的內(nèi)容(filter-mapping的name先調(diào)用doFilter方法,但是每個(gè)dofilter方法的內(nèi)部存在chain.dofilter會(huì)調(diào)用下一個(gè)filter-mapping,一直到不存在下一個(gè)filter后在返回,執(zhí)行chain.dofilter()后面的代碼)(相當(dāng)于遞歸調(diào)用)
調(diào)用Servlet中的service()方法
service方法執(zhí)行完畢后,層次調(diào)用doFilter()中FilterChain.doFilter()之后的方法,順序與之前的相反
例如:
filter和servlet同時(shí)存在,且容器初始化都要加載,則先加載filter再加載servlet的init方法。
如果請(qǐng)求的url既匹配filter又匹配servlet,并且servlet的init方法沒有在容器初始化加載,則先加載匹配的servlet的最后一個(gè)servlet的init方法,再按順序執(zhí)行filter方法,最后再執(zhí)行匹配的最后一個(gè)servlet方法
攔截機(jī)制:
Struts2:
Struts2框架是類級(jí)別的攔截,每次請(qǐng)求就會(huì)創(chuàng)建一個(gè)Action,和Spring整合時(shí)Struts2的ActionBean注入作用域是原型模式prototype(否則會(huì)出現(xiàn)線程并發(fā)問題),然后通過setter,getter吧request數(shù)據(jù)注入到屬性;
一個(gè)Action對(duì)應(yīng)一個(gè)request,response上下文,在接收參數(shù)時(shí),可以通過屬性接收,說明屬性參數(shù)是讓多個(gè)方法共享的;
Action的一個(gè)方法可以對(duì)應(yīng)一個(gè)url,而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標(biāo)識(shí)其所屬方法了。
SpringMVC:
SpringMVC是方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)Request上下文,所以方法直接基本上是獨(dú)立的,獨(dú)享request,response數(shù)據(jù)。而每個(gè)方法同時(shí)又何一個(gè)url對(duì)應(yīng),參數(shù)的傳遞是直接注入到方法中的,是方法所獨(dú)有的。處理結(jié)果通過ModeMap返回給框架;
在Spring整合時(shí),SpringMVC的Controller Bean默認(rèn)單例模式Singleton,所以默認(rèn)對(duì)所有的請(qǐng)求,只會(huì)創(chuàng)建一個(gè)Controller,有應(yīng)為沒有共享的屬性,所以是線程安全的,如果要改變默認(rèn)的作用域,需要添加@Scope注解修改;
Struts2有自己的攔截Interceptor機(jī)制,SpringMVC這是用的是獨(dú)立的Aop方式,這樣導(dǎo)致Struts2的配置文件量還是比SpringMVC大。
性能方面:SpringMVC實(shí)現(xiàn)了零配置,由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入。而Struts2是類級(jí)別的攔截,每次請(qǐng)求對(duì)應(yīng)實(shí)例一個(gè)新的Action,需要加載所有的屬性值注入,所以,SpringMVC開發(fā)效率和性能高于Struts2。
配置方面:spring MVC和Spring是無縫的。從這個(gè)項(xiàng)目的管理和安全上也比Struts2高(當(dāng)然Struts2也可以通過不同的目錄結(jié)構(gòu)和相關(guān)配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少);
SpringMVC可以認(rèn)為已經(jīng)100%零配置。
設(shè)計(jì)思想:Struts2更加符合OOP的編程思想, SpringMVC就比較謹(jǐn)慎,在servlet上擴(kuò)展。
集成方面:SpringMVC集成了Ajax。
注意:springmvc是單例模式的框架,但它是線程安全的,因?yàn)閟pringmvc沒有成員變量,所有參數(shù)的封裝都是基于方法的,屬于當(dāng)前線程的私有變量. 因此是線程安全的框架。所以效率高。
struts action是多例的。所以可以使用成員變量獲取參數(shù)。所以效率低。
總結(jié)
以上是生活随笔為你收集整理的java mvc模式工作流程_SpringMVC的简介和工作流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么xml文件解析_Java对X
- 下一篇: 格力cmv中央空调同stall