




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、前言Spring3MVC了。Spring3MVC結(jié)構(gòu)簡(jiǎn)單,應(yīng)了那句話簡(jiǎn)單就是美,而且他 (本文使用是的Spring3.0.5版Struts2也是比較優(yōu)秀的MVC構(gòu)架,優(yōu)點(diǎn)非常多比如良好的結(jié)構(gòu)。但這里想說(shuō)的是缺點(diǎn),Struts2由于采用了值棧、OGNL表達(dá)式、struts2標(biāo)簽庫(kù)等,會(huì)導(dǎo)致應(yīng)用的性能下降。Struts2的多層攔截器、多實(shí)例action性能都很好??梢詤⒖嘉覍懙囊黄P(guān)于SpringMVC與Struts2與Servlet比較的文章http:/ Spring3MVC1、Spring3MVCStruts2,Struts2用不上的多余功能太多。呵呵,當(dāng)然這不2、Spring3MVC很容易就可以寫出性能優(yōu)秀的程序,Struts2要處處小心才可以寫出性能優(yōu)秀的程序(MVC部分)3、Spring3MVC的靈活是你無(wú)法想像的,Spring的擴(kuò)展性有口皆碑,Spring3MVC當(dāng)然也MVC框架而感到有任何的限制。 (呵呵,是不是不公平二、核心類與接口 --HandlerMapping--HandlerMapping 通過(guò)配置文件,把一個(gè)URL映射到Controller 通過(guò)注解,把一個(gè)URL映射到Controller類上HandlerAdapter--AnnotationMethodHandlerAdapterURLControllerController--由于我們使用了@Controller注解,添加了@Controller注解注解的類就可以擔(dān)任控制器HandlerInterceptor接口--UrlBasedViewResolverViewInternalResourceViewResolverJSTLLocalResolverHandlerExceptionResolver--異常處理SimpleMappingExceptionResolver實(shí)現(xiàn)類三、核心流程四、DispatcherServlet說(shuō)SpringMVC,DispatcherServletDispatcherServletweb.xml文件中的。攔截匹配的請(qǐng)求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來(lái)的請(qǐng)求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller(我們寫的Xml代碼 </web-<load-on-startup>1</load-on-startup>ServletServletp<url-pattern>*.form</url-pattern>會(huì)攔截*.form<servlet-name>example</servlet-name這個(gè)Servlet的名字是example,可以有多個(gè)DispatcherServletDispatcherServletWebApplicationContextServletContextRequest對(duì)象中,關(guān)于DispatcherServletwebWEB-INF[servlet-name]-servlet.xmlbeanXml代碼<servlet-</servlet-springMVC.xml其中<param-value>**.xml</param-value>Servlet攔截匹配規(guī)則可以自已定義,Servlet攔截哪URL合適?1、攔截*.do,例如:/user/add.dourl都要以.do結(jié)尾。不會(huì)影響訪問(wèn)靜態(tài)文2、攔截/app/*/app/user/addurl都要包含/app4、攔截/*Actionjspjsp五、雙親上下文的說(shuō)listenerStruts+Spring+HibernatelistenerSpring會(huì)創(chuàng)建一個(gè)全局的WebApplicationContext根上下文ServletContext值。可以使用工具類取出上下文:DispatcherServlet是一個(gè)Servlet,可以同時(shí)配置多個(gè),每個(gè)DispatcherServlet有一個(gè)自己的WebApplicationContext上下文,這個(gè)上下文繼承了根上下文中所有東西。保存在ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+ServletRequest對(duì)象產(chǎn)生時(shí),會(huì)把這個(gè)WebApplicationContextRequest對(duì)象中,key是DispatcherServlet.class.getName()+".CONTEXT"??梢允褂霉ぞ哳惾〕錾舷挛模篠pringApplicationContext實(shí)例可以被限制在不同的作用域(scope)在webMVC框架中,每個(gè)DispatcherServlet有它自己的WebApplicationContextcontextWebApplicationContextbean(overrideservlet實(shí)例自己使用的屬性。listenerspringDispatcherServletspring的DispatcherServlet,事情就簡(jiǎn)單了,什么麻煩事兒也沒(méi)六、springMVC-mvc.xml配置文件片段講解(未使用默認(rèn)配置文件名Xml代碼<!--自動(dòng)掃描的包名<.core,JUnit4"<!--<mvc:annotation-driven<!--<propertyname="prefix"value="/WEB-<propertyname="suffix"value=".jsp"/><!--可為空,擴(kuò)展名來(lái)選擇視圖解釋類的邏輯<!--攔截器<!--對(duì)靜態(tài)資源文件的訪問(wèn)方案一(二選一)<!--對(duì)靜態(tài)資源文件的訪問(wèn)方案二(二選一) ponent-scan/>@ControllerAction 聲明Service組件 @Repository聲明Dao組件 泛指組件,當(dāng)不好歸類時(shí) 用于注入,j2ee)默認(rèn)按名稱裝配,@Resource(name="beanName")@Autowired用于注入,(srping提供的)默認(rèn)按類型裝配@Transactional(rollbackFor={Exception.class}) bean<mvc:annotation-driven/>是一種簡(jiǎn)寫形式,完全可以手動(dòng)配置替代這種簡(jiǎn)寫形式,簡(jiǎn)寫形式可以讓初學(xué)都快速應(yīng)用默認(rèn)配置方案。<mvc:annotation-driven/>會(huì)自動(dòng)注冊(cè)DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapterbean,springMVC為@Controllers分發(fā)請(qǐng)求所必須的。XML的支持(JAXBJSON的支持(Jacksonajaxjson后面,對(duì)action寫JUnit單元測(cè)試時(shí),要從springIOC容器中取DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapterbean,來(lái)完成測(cè)試,取的時(shí)候要知道是<mvc:annotation-driven/>bean。<mvc:intercptors/>是一種簡(jiǎn)寫形式。通過(guò)看前面的大圖,知道,我們可以配置多個(gè)derMappng<mv:interceptors/>derMappinerMppng<mvc:default-servlet-handler/>Servlet<mvc:resourcesmapping="/images/**"location="/images/"cache-period="31556926"/>匹配 URLSpringhttp七、如何訪問(wèn)到靜態(tài)的文件,如如何你的DispatcherServlet攔截*.do這樣的URL,就不存在訪問(wèn)不到靜態(tài)資源問(wèn)題。如果你的DispatcherServlet攔截“/”,攔截了所有的請(qǐng)求,同時(shí)對(duì)*.js,*.jpg方案一:激活TomcatdefaultServlet來(lái)處理靜態(tài)文件Xml代碼<servlet-</servlet-<servlet-</servlet-<servlet-</servlet-要寫在DispatcherServlet的前面,讓defaultServlet先攔截,這個(gè)就不會(huì)進(jìn)Spring了,我想性能是最好的吧Tomcat,Jetty,JBoss,andGlassFish 默認(rèn)Servlet的名字default"GoogleAppEngine默認(rèn)Servlet的名字--"_ah_default"Resin默認(rèn)Servlet的名字--"resin-file"WebLogic默認(rèn)Servlet的名字"FileServlet" 默認(rèn)Servlet的名字方案二spring3.0.4以后版本提供了mvc:resourcesmvc:resources的使用方法:Xml代碼<!--對(duì)靜態(tài)資源文件的訪問(wèn)<mvc:resourcesmapping="/images/**"location="/images/"壓縮到j(luò)ar包中。cache-period可以使得靜態(tài)資源webcache如果出現(xiàn)下面的錯(cuò)誤,可能是沒(méi)有配置<mvc:annotation-driven/>的原因WARNING:NomappingfoundforHTTPrequestwithURI[/mvc/user/findUser/lisi/770]inDispatcherServletwithname'springMVC'使用<mvc:resources/>元素,把mapping的URI注冊(cè)到SimpleUrlHandlerMappingurlMap中keymappingURIpattern值,valueHandlerMappingResourceHttpRequestHandler處理并返回,所以就classpath目錄,jar包內(nèi)靜另外需要注意的一點(diǎn)是,不要對(duì)SimpleUrlHandlerMapping設(shè)置因?yàn)閷?duì)staticuridefaultHandler就是否則無(wú)法處理staticresources<mvc:default-servlet-Xml代碼<mvc:default-servlet-會(huì)把"/**"url,注冊(cè)到SimpleUrlHandlerMapping的urlMap中,把對(duì)靜態(tài)資源的訪問(wèn)由 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler處理并返回.DefaultServletHttpRequestHandlerServletHandlerMappingDefaultAnnotationHandlerMappingorder<mvc:resources/自動(dòng)注冊(cè)的SimpleUrlHandlerMapping的order屬性值是:<mvc:default-servlet-handler/>自動(dòng)注冊(cè)的SimpleUrlHandlerMapping的屬性值是:spring會(huì)先執(zhí)行order值比較小的。當(dāng)訪問(wèn)一個(gè)a.jpg圖片文件時(shí),先通過(guò)DefaultAnnotationHandlerMapping來(lái)找處理器,一定是找不到的,我們沒(méi)有叫a.jpgActionorder值升序找由于最后一個(gè)SimpleUrlHandlerMapping匹配"/**"的,所以一定會(huì)匹配上,再響應(yīng)圖Apache比一八、請(qǐng)求如何映射到具體的Action中的方法方案一:基于 配置映射,可以利用SimpleUrlHandlerMappingBeanNameUrlHandlerMappingUrl映射和攔截請(qǐng)求。Xml代碼 但前面我們配置了<mvc:annotation-driven/>bean,就不須要我們顯示的bean了。我們使用第2springMVC并在action類上使用九、Spring中的攔截器Spring為我們提供了org.springframework.web.servlet.HandlerInterceptor接口,有以下三個(gè)方法Action之前執(zhí)行publicbooleanpreHandle(HttpServletRequest生成視圖之前執(zhí)publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView);最后執(zhí)行,可用于釋放資publicvoid pletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)preHandle中,可以進(jìn)行編碼、安全控制等處理;postHandle中,有機(jī)會(huì)修改ModelAndView; 參數(shù)中的Objecthandler是下一個(gè)攔截十、如何使用攔截器自定義一個(gè)攔截器,要實(shí)現(xiàn)HandlerInterceptor接口publicclassMyInteceptorimplementsHandlerInterceptor SpringMVC并沒(méi)有總的攔截器,不能對(duì)所有的請(qǐng)求進(jìn)行前后攔SpringMVC的攔截器HandlerMapping級(jí)別的以有多個(gè)HandlerMapping,每個(gè)HandlerMapping可以有自己的攔截當(dāng)一個(gè)請(qǐng)求按Order值從小HandlerMapping接口的實(shí)現(xiàn)類時(shí),哪一個(gè)先有返回,那就可以結(jié)束了,后面的HandlerMapping就不走了,本道攔截器會(huì)在什么時(shí)候執(zhí)行個(gè)請(qǐng)求交給HandlerMapping時(shí),這個(gè)HandlerMapping先找有沒(méi)有處理器來(lái)處理這個(gè)請(qǐng)求,如何找到了,就執(zhí)行攔如果沒(méi)有找到處理器,那么這個(gè)攔截器就不會(huì)被執(zhí)行springMVC的配置文件中配置有三種方法:方案一(近似)總攔截器,攔截所有url <beanclass="com.app.mvc.MyInteceptor"為什么叫“近似”,前面說(shuō)了,Spring沒(méi)有總的攔截器HandlerMapping是可以找到處理器的,最多也只找到一個(gè)處理器,所以這個(gè)方案二,(近似)總攔截器,攔截匹配的URLXml代碼<mvc:interceptors <mvc:mappingpath="/user/*"/><!-- <bean就是比方案一多了一個(gè)URL匹配方案三,HandlerMappint上的攔截Xml代碼 <property <bean 如果使用了<mvc:annotation-driven/>,它會(huì)自動(dòng)注冊(cè)DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter這兩bean,所以就沒(méi)有機(jī)會(huì)再給它注入interceptors屬性,就無(wú)法指定攔截器。當(dāng)然我們可以通過(guò)人工配置上面的兩個(gè)Bean,不使用<mvc:annotation-/>,就可以interceptors屬性注入攔截器了其實(shí)我也不建議使用<mvc:annotation-driven/>,而建議手動(dòng)寫配置文件,來(lái)替<mvc:annotation-driven/>,這就控制力就強(qiáng)了十一、如何實(shí)現(xiàn)全局的異常處理Xml代碼<!--總錯(cuò)誤處理<property<property<property這里主要的類是 類,和他的父HandlerExceptionResolver類具體可以配置哪些屬性,我是通過(guò)查看源碼知道的你也可以實(shí)現(xiàn)HandlerExceptionResolver接口,寫一個(gè)自己的異常處spring的擴(kuò)展性是很好的SimpleMappingExceptionResolver我們可以將不同的異常映射到不同jsp頁(yè)面(通過(guò)exceptionMappings屬性的配置同時(shí)我們也可以為所有的異常指定一個(gè)默認(rèn)的異常提示頁(yè)面(通過(guò)defaultErrorView屬性的配置,如果所拋出的異exceptionMappings中沒(méi)有對(duì)應(yīng)的映射,則Spring將用此默認(rèn)配置顯示異常信息。viewResolver中指定。如/error/error表示/error/error.jsp顯示錯(cuò)jspHtml代碼<%@pagelanguage="java"contentType="text/html; <%@page<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"<title>錯(cuò)誤頁(yè)面<h1>出錯(cuò)了Exceptione=其中一句:request.getAttribute("exceptionkey是exception,也是在 十二、如何把全局異常記錄到日志中在前的配置中,其中有一個(gè)屬性 warnLogCategory,值是 類的全限定名”。我是在SimpleMappingExceptionResolver類父類 HandlerExceptionResolver類中找到這個(gè)屬性的。查看源碼后得知:如果warnLogCategory不為空,spring就會(huì)使用apache的 級(jí)別是warn。 ..mgR”“SimpleMappingExceptionResolver類的全限定名”這個(gè)值不是隨便寫的。因 esolver=WARN,保證這個(gè)級(jí)別是warn的日志一定會(huì)被記錄,即使log4j日志級(jí)別是ERROR十三、如何給spring3MVCActionJUnit單元測(cè)試使用了spring3MVC后,給action做單元測(cè)試也很方便,我以前從來(lái)不action寫單元測(cè)試的,再在不同了,方便了,所以一定要寫JUnitActionBase類是所有JUnit的測(cè)試類的父packageimportimportimportimportimportimportimportimportimport*JUnitaction* *@version創(chuàng)建時(shí)間:2011-2-2下午publicclassJUnitActionBase privatestaticHandlerMapping privatestaticHandlerAdapter *spring3MVC publicstaticvoidsetUp() if(handlerMapping==null) String[]configs={"file:src/springConfig/springMVC.xml" MockServletContextmsc=new ATTRIBUTE, handlerMapping=(HandlerMapping) *request *@param *@param * *@throws HttpServletResponsethrowsException finalModelAndViewmodel= return 這是個(gè)JUnit測(cè)試類,我們可以newRequest對(duì)象,來(lái)參與測(cè)試,太方便了。request指定訪URL,就可以請(qǐng)求目標(biāo)Action了。importimportimportimportimportimport*OrderAction* *@version創(chuàng)建時(shí)間:2011-2-2下午publicclassTestOrderActionextendsJUnitActionBase publicvoidtestAdd()throwsException MockHttpServletRequestrequest=new //URIfinalModelAndViewm
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 用于公開(kāi)演講或會(huì)議發(fā)言的文本
- 2025年池州貨物運(yùn)輸駕駛員從業(yè)資格考試系統(tǒng)
- 勞務(wù)施工總承包合同
- 故宮博物館放票規(guī)則
- 建筑裝飾植筋工程勞務(wù)分包合同
- 公共廁所裝飾裝修施工合同
- 業(yè)務(wù)合同登記表格
- 環(huán)境監(jiān)測(cè)技術(shù)操作規(guī)范及標(biāo)準(zhǔn)解讀
- 整體櫥柜合同
- 建筑勞務(wù)派遣工合同
- 保護(hù)野生動(dòng)物
- 統(tǒng)編版五年級(jí)下冊(cè)道德與法治全冊(cè)優(yōu)秀課件
- 湘雅五醫(yī)院-建筑方案設(shè)計(jì)課件
- 《教育管理學(xué)》課件
- 凈水設(shè)備技術(shù)參數(shù)要求
- 《M公司員工忠誠(chéng)度分析案例報(bào)告》
- 工程計(jì)量報(bào)審表
- 腦血管造影護(hù)理課件
- 被執(zhí)行人財(cái)產(chǎn)申報(bào)表
- 課題申報(bào)講座課件
- 系統(tǒng)科學(xué)與系統(tǒng)工程的理論基礎(chǔ)
評(píng)論
0/150
提交評(píng)論