為開發(fā)團(tuán)隊(duì)選擇一款優(yōu)秀的MVC框架是件難事兒孵户,在眾多可行的方案中決擇需要很高的經(jīng)驗(yàn)和水平萧朝。你的一個(gè)決定會影響團(tuán)隊(duì)未來的幾年。要考慮方面太多:
1夏哭、簡單易用检柬,以提高開發(fā)效率。使小部分的精力在框架上竖配,大部分的精力放在業(yè)務(wù)上何址。
2、性能優(yōu)秀械念,這是一個(gè)最能吸引眼球的話題头朱。
3、盡量使用大眾的框架(避免使用小眾的龄减、私有的框架)项钮,新招聘來的開發(fā)人員有一些這方面技術(shù)積累,減低人員流動再適應(yīng)的影響希停。
?如果你還在為這件事件發(fā)愁烁巫,本文最適合你了。選擇Spring MVC吧宠能。
Spring MVC是當(dāng)前最優(yōu)秀的MVC框架亚隙,自從Spring 2.5版本發(fā)布后,由于支持注解配置违崇,易用性有了大幅度的提高阿弃。Spring 3.0更加完善,實(shí)現(xiàn)了對Struts 2的超越⌒哐樱現(xiàn)在越來越多的開發(fā)團(tuán)隊(duì)選擇了Spring MVC渣淳。
Struts2也是非常優(yōu)秀的MVC構(gòu)架,優(yōu)點(diǎn)非常多比如良好的結(jié)構(gòu)伴箩,攔截器的思想入愧,豐富的功能。但這里想說的是缺點(diǎn),Struts2由于采用了值棧棺蛛、OGNL表達(dá)式怔蚌、struts2標(biāo)簽庫等,會導(dǎo)致應(yīng)用的性能下降旁赊,應(yīng)避免使用這些功能桦踊。而Struts2的多層攔截器、多實(shí)例action性能都很好终畅。
首先钞钙,看一下Spring的最基本使用方式,直接看代碼
概括的描述一下Spring背后的操作声离,解析applicationgContext.xml,將xml中定義的bean(如loginService和loginResource)解析成Spring內(nèi)部的BeanDefinition瘫怜,并以beanName(如loginService)為key术徊,BeanDefinition(如loginService相應(yīng)的BeanDefinition)為value存儲到DefaultListableBeanFactory中的beanDefinitionMap(其實(shí)就是一個(gè)ConcurrentHashMap)中,同時(shí)將beanName存入beanDefinitionNames(List類型)中鲸湃,然后遍歷beanDefinitionNames中的beanName赠涮,進(jìn)行bean的實(shí)例化并填充屬性,在實(shí)例化的過程中暗挑,如果有依賴沒有被實(shí)例化將先實(shí)例化其依賴笋除,然后實(shí)例化本身,實(shí)例化完成后將實(shí)例存入單例bean的緩存中炸裆,當(dāng)調(diào)用getBean方法時(shí)垃它,到單例bean的緩存中查找,如果找到并經(jīng)過轉(zhuǎn)換后返回這個(gè)實(shí)例(如LoginResource的實(shí)例)烹看,之后就可以直接使用了国拇。
使用Spring MVC
配置DispatcherServlet是第一步。 DispatcherServlet是一個(gè)Servlet,所以可以配置多個(gè)DispatcherServlet惯殊。
DispatcherServlet是前置控制器酱吝,配置在web.xml文件中的。攔截匹配的請求土思,Servlet攔截匹配規(guī)則要自已定義务热,把攔截下來的請求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller(我們寫的Action)來處理己儒。有問題想問我的可以加我的交流群:582100479
?“某某規(guī)則”:是根據(jù)你使用了哪個(gè)HandlerMapping接口的實(shí)現(xiàn)類的不同而不同崎岂。 先來看第一個(gè)例子:
1是啟動順序,讓這個(gè)Servlet隨Servletp容器一起啟動址愿。
*.form會攔截*.form結(jié)尾的請求该镣。
example這個(gè)Servlet的名字是example,可以有多個(gè)DispatcherServlet,是通過名字來區(qū)分的损合。每一個(gè)DispatcherServlet有自己的WebApplicationContext上下文對象省艳。同時(shí)保存的ServletContext中和Request對象中,關(guān)于key嫁审,以后說明跋炕。
在DispatcherServlet的初始化過程中,框架會在web應(yīng)用的 WEB-INF文件夾下尋找名為[servlet-name]-servlet.xml 的配置文件律适,生成文件中定義的bean辐烂。
第二個(gè)例子:
指明了配置文件的文件名,不使用默認(rèn)配置文件名捂贿,而使用springMVC.xml配置文件纠修。
其中**.xml這里可以使用多種寫法
1、不寫,使用默認(rèn)值:/WEB-INF/-servlet.xml
2厂僧、/WEB-INF/classes/springMVC.xml
3扣草、classpath*:springMVC-mvc.xml
4、多個(gè)值用逗號分隔
Spring會創(chuàng)建一個(gè)WebApplicationContext上下文颜屠,稱為父上下文(父容器) 辰妙,保存在 ServletContext中,key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE的值甫窟。
可以使用Spring提供的工具類取出上下文對象:WebApplicationContextUtils.getWebApplicationContext(ServletContext);
DispatcherServlet是一個(gè)Servlet,可以同時(shí)配置多個(gè)密浑,每個(gè) DispatcherServlet有一個(gè)自己的上下文對象(WebApplicationContext),稱為子上下文(子容器)粗井,子上下文可以訪問父上下文中的內(nèi)容尔破,但父上下文不能訪問子上下文中的內(nèi)容。 它也保存在 ServletContext中浇衬,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱呆瞻。當(dāng)一個(gè)Request對象產(chǎn)生時(shí),會把這個(gè)子上下文對象(WebApplicationContext)保存在Request對象中径玖,key是DispatcherServlet.class.getName() + ".CONTEXT"痴脾。
可以使用工具類取出上下文對象:RequestContextUtils.getWebApplicationContext(request);
說明 :Spring 并沒有限制我們,必須使用父子上下文梳星。我們可以自己決定如何使用赞赖。
Java--大項(xiàng)目能做好--按傳統(tǒng)方式做,規(guī)規(guī)矩矩的做冤灾,好擴(kuò)展前域,好維護(hù)。
Java--小項(xiàng)目能做快--按激進(jìn)方式做韵吨,一周時(shí)間就可以出一個(gè)版本匿垄,先上線接受市場(用戶)的反饋,再改進(jìn),再反饋椿疗,時(shí)間就是生命(成本)漏峰。
針對上面的問題我特意整理了一下,有很多技術(shù)不是靠幾句話能講清楚届榄,所以干脆找朋友錄制了一些視頻浅乔,很多問題其實(shí)答案很簡單,但是背后的思考和邏輯不簡單铝条,要做到知其然還要知其所以然靖苇。如果想學(xué)習(xí)Java工程化、高性能及分布式班缰、深入淺出贤壁。微服務(wù)、Spring埠忘,MyBatis芯砸,Netty源碼分析的朋友可以加我的Java交流群:582100479,群里有阿里大牛直播講解技術(shù)给梅,以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。