SpringMVC入門

一.SpringMVC是什么

Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架幔托,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦肉迫,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的

二.SpringMVC能幫我們做什么
  • 讓我們能非常簡單的設(shè)計出干凈的Web層和薄薄的Web層磷账;
  • 進行更簡潔的Web層的開發(fā);
  • 天生與Spring框架集成(如IoC容器贾虽、AOP等)逃糟;
  • 提供強大的約定大于配置的契約式編程支持;
  • 能簡單的進行Web層的單元測試蓬豁;
  • 支持靈活的URL到頁面控制器的映射绰咽;
  • 非常容易與其他視圖技術(shù)集成,如Velocity地粪、FreeMarker等等取募,因為模型數(shù)據(jù)不放在特定的API里,而是放在一個Model里(Map數(shù)據(jù)結(jié)構(gòu)實現(xiàn)蟆技,因此很容易被其他框架使用)玩敏;
  • 非常靈活的數(shù)據(jù)驗證、格式化和數(shù)據(jù)綁定機制质礼,能使用任何對象進行數(shù)據(jù)綁定旺聚,不必實現(xiàn)特定框架的API;
  • 提供一套強大的JSP標簽庫眶蕉,簡化JSP開發(fā)砰粹;
  • 支持靈活的本地化、主題等解析妻坝;
  • 更加簡單的異常處理伸眶;
  • 對靜態(tài)資源的支持;
  • 支持Restful風格刽宪。
三.Spring Web MVC架構(gòu)
  • SpringMVC處理請求的流程
處理流程

1厘贼、 首先用戶發(fā)送請求————>前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它圣拄,即以前的控制器的控制邏輯部分嘴秸;圖2-1中的1、2步驟;
2岳掐、 頁面控制器接收到請求后凭疮,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象串述,這個對象在Spring Web MVC中叫命令對象执解,并進行驗證,然后將命令對象委托給業(yè)務(wù)對象進行處理纲酗;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名)衰腌;圖2-1中的3、4觅赊、5步驟右蕊;
3、 前端控制器收回控制權(quán)吮螺,然后根據(jù)返回的邏輯視圖名饶囚,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染鸠补;圖2-1中的步驟6萝风、7;
4莫鸭、 前端控制器再次收回控制權(quán)闹丐,將響應(yīng)返回給用戶,圖2-1中的步驟8被因;至此整個結(jié)束

  • SpringMVC架構(gòu)
架構(gòu)

核心架構(gòu)的具體流程步驟如下:
1卿拴、 首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理梨与,而是委托給其他的解析器進行處理堕花,作為統(tǒng)一訪問點,進行全局的流程控制粥鞋;
2缘挽、 DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象呻粹、多個HandlerInterceptor攔截器)對象壕曼,通過這種策略模式,很容易添加新的映射策略等浊;
3腮郊、 DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器筹燕,從而支持多種類型的處理器轧飞,即適配器設(shè)計模式的應(yīng)用衅鹿,從而很容易支持很多類型的處理器;
4过咬、 HandlerAdapter——>處理器功能處理方法的調(diào)用大渤,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理掸绞;并返回一個ModelAndView對象(包含模型數(shù)據(jù)泵三、邏輯視圖名);
5集漾、 ModelAndView的邏輯視圖名——> ViewResolver切黔, ViewResolver將把邏輯視圖名解析為具體的View砸脊,通過這種策略模式具篇,很容易更換其他視圖技術(shù);
6凌埂、 View——>渲染驱显,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu)瞳抓,因此很容易支持其他視圖技術(shù)埃疫;
7、返回控制權(quán)給DispatcherServlet孩哑,由DispatcherServlet返回響應(yīng)給用戶栓霜,到此一個流程結(jié)束

  • SpringMVC優(yōu)勢
    1、清晰的角色劃分:前端控制器(DispatcherServlet)横蜒、請求到處理器映射(HandlerMapping)胳蛮、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)丛晌、處理器或頁面控制器(Controller)仅炊、驗證器( Validator)、命令對象(Command 請求參數(shù)綁定到的對象就叫命令對象)澎蛛、表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)抚垄。
    2、分工明確谋逻,而且擴展點相當靈活呆馁,可以很容易擴展,雖然幾乎不需要毁兆;
    3浙滤、由于命令對象就是一個POJO,無需繼承框架特定API荧恍,可以使用命令對象直接作為業(yè)務(wù)對象瓷叫;
    4屯吊、和Spring 其他框架無縫集成,是其它Web框架所不具備的摹菠;
    5盒卸、可適配,通過HandlerAdapter可以支持任意的類作為處理器次氨;
    6蔽介、可定制性,HandlerMapping煮寡、ViewResolver等能夠非常簡單的定制虹蓄;
    7、功能強大的數(shù)據(jù)驗證幸撕、格式化薇组、綁定機制;
    8坐儿、利用Spring提供的Mock對象能夠非常簡單的進行Web層單元測試律胀;
    9、本地化貌矿、主題的解析的支持炭菌,使我們更容易進行國際化和主題的切換。
    10逛漫、強大的JSP標簽庫黑低,使JSP編寫更容易
四.Hello World入門
  • web.xm配置 加入SpringMVC配置
<!-- 加入SpringMVC配置 begin-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- end -->
  • dispatcher-servlet.xml 配置
   <!-- 注解主持 -->
    <mvc:annotation-driven>
        <!-- 配置防止亂碼 -->
         <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
              <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
            </bean>
       </mvc:message-converters>
     </mvc:annotation-driven>
     
     <!-- 注解掃描 -->
    <context:component-scan base-package="com.zlb.controller" />
     
     <!-- 定義首頁 -->
    <mvc:view-controller path="/" view-name="redirect:/user/login"/>
    
    <!-- 靜態(tài)資源映射 -->
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
    <mvc:resources mapping="/images/**" location="/WEB-INF/images/" />
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/"/>

    <!-- 視圖前綴與后綴 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- SpringMVC上傳文件時,需要配置MultipartResolver處理器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 指定所上傳文件的總大小不能超過50MB酌毡。注意maxUploadSize屬性的限制不是針對單個文件克握,而是所有文件的容量之和 -->
        <property name="defaultEncoding" value="UTF-8" />
        <property name="maxUploadSize" value="50000000" />
        <property name="maxInMemorySize" value="40960" />
    </bean>
  • UserController
@Controller("userController")
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping(value = "/login")
    public String login(User user, ModelMap model) {
        return "login";
    }
    
    @RequestMapping(value = "/doLogin",method=RequestMethod.POST)
    public String doLogin(User user,ModelMap model){
        if(!user.getUserName().equals("admin") || user.getUserName() == null){
            model.addAttribute("error", "用戶名錯誤");
            return "login";
        }
        if(!user.getUserPass().equals("123") || user.getUserPass() == null){
            model.addAttribute("error", "用戶密碼錯誤");
            return "login";
        }
        model.addAttribute("user", user);
        return "success";
    }
}
  • 視圖資源 按照dispatcher-servlet.xml 配置


    視圖資源

此文章摘抄自:<a > [濤哥]</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阔馋,隨后出現(xiàn)的幾起案子玛荞,更是在濱河造成了極大的恐慌,老刑警劉巖呕寝,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勋眯,死亡現(xiàn)場離奇詭異,居然都是意外死亡下梢,警方通過查閱死者的電腦和手機客蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孽江,“玉大人讶坯,你說我怎么就攤上這事「谄粒” “怎么了辆琅?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵漱办,是天一觀的道長。 經(jīng)常有香客問我婉烟,道長娩井,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任似袁,我火速辦了婚禮洞辣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昙衅。我一直安慰自己扬霜,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布而涉。 她就那樣靜靜地躺著著瓶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婴谱。 梳的紋絲不亂的頭發(fā)上蟹但,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音谭羔,去河邊找鬼。 笑死麦向,一個胖子當著我的面吹牛瘟裸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诵竭,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼话告,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卵慰?” 一聲冷哼從身側(cè)響起沙郭,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裳朋,沒想到半個月后病线,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鲤嫡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年送挑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暖眼。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惕耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫肠,到底是詐尸還是另有隱情司澎,我是刑警寧澤欺缘,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挤安,受9級特大地震影響浪南,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漱受,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一络凿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂羡,春花似錦絮记、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛹批,卻和暖如春撰洗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腐芍。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工差导, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猪勇。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓设褐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泣刹。 傳聞我的和親對象是個殘疾皇子助析,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容