SpringMVC核心

請(qǐng)求轉(zhuǎn)發(fā)

forward : 請(qǐng)求
redirect: 重定向
在框架中都是關(guān)鍵字寞宫,有一個(gè)共同的特點(diǎn)幔睬,不和視圖解析器一起工作背亥。
語(yǔ)法: setViewName("forward:視圖完整路徑")般眉。
setViewName("redirect:視圖完整路徑") // 框架會(huì)把簡(jiǎn)單類型數(shù)據(jù)轉(zhuǎn)化為string放到url中我纪。此時(shí)用取數(shù)據(jù)要${request.getParameter("")}取數(shù)據(jù)慎宾。
并且重定向不能訪問(wèn)WEB-INF下的資源
mv.addObject("msg", "data");

   @RequestMapping(value = "/forward.do", method = RequestMethod.POST)
    public ModelAndView doForward(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "hhhhhhhhhh");
        modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
        return modelAndView;
    }

異常處理

  • 集中異常處理(aop設(shè)計(jì)思想,代理處理)
    springmvc采用統(tǒng)一浅悉,全局異常處理趟据。
    把controller中的所有異常都集中到一個(gè)地方。采用的是aop的思想术健,把業(yè)務(wù)邏輯和異常處理代碼分開(kāi)汹碱,解耦合。
  1. @ExceptionHandler
  2. @ControlerAdvice
  • 處理異常步驟:
  1. 新建maven 項(xiàng)目
  2. 加入依賴
  3. 自定義異常類
  4. 在controller拋出NameException荞估,AgeException
  5. 創(chuàng)建一個(gè)普通類咳促, 作用全局異常處理類
    在類上面載入@ControllerAdvice
    在類中定義方法稚新,方法上面加入@ExceptionHandler
  6. 創(chuàng)建處理異常的視圖頁(yè)面
  7. springmvc配置文件
    組件掃描器,掃描@Controller注解
    組件掃描器跪腹,掃描@ControllerAdvice所在包名
    聲明注解驅(qū)動(dòng)
//必須讓springmvc知道你在哪
// 聲明組件掃描器

@ControllerAdvice
public class GlobalExceptionHandler {
    // 定義方法褂删, 處理發(fā)生的異常
//    處理異常的方法和控制器方法定義地點(diǎn)一樣
//    @ExceptionHandler(異常的class)標(biāo)識(shí)發(fā)生此異常時(shí)用此方法處理
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception ex){
        // 通過(guò)形參獲取異常信息
        // 異常發(fā)生時(shí)的處理邏輯
        // 1. 需要把異常記錄下來(lái), 記錄到數(shù)據(jù)庫(kù)尺迂, 日志文件
//        記錄日志發(fā)生的時(shí)間笤妙,哪個(gè)方法發(fā)生的冒掌,異常錯(cuò)誤內(nèi)容
//        2. 發(fā)送通知噪裕,把一場(chǎng)信息通過(guò)郵件等等
//        3. 給用戶提示
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","姓名必須是zs");
        mv.addObject("ex", ex);
        mv.setViewName("nameError");
        return mv;
    }

    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception ex){
        // 通過(guò)形參獲取異常信息
        // 異常發(fā)生時(shí)的處理邏輯
        // 1. 需要把異常記錄下來(lái), 記錄到數(shù)據(jù)庫(kù)股毫, 日志文件
//        記錄日志發(fā)生的時(shí)間膳音,哪個(gè)方法發(fā)生的,異常錯(cuò)誤內(nèi)容
//        2. 發(fā)送通知铃诬,把一場(chǎng)信息通過(guò)郵件等等
//        3. 給用戶提示
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","年齡不能大于80");
        mv.addObject("ex", ex);
        mv.setViewName("ageError");
        return mv;
    }

    // 處理其他異常  NameException 祭陷,age  以外的異常
    // 不加value時(shí), 不是以上兩種時(shí) 趣席, 由此方法執(zhí)行
    @ExceptionHandler
    public ModelAndView doOtherException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","其他異常");
        mv.addObject("ex", ex);
        mv.setViewName("defaultError");
        return mv;
    }
}

攔截器

  • 攔截器是springmvc中的一種兵志,需要實(shí)現(xiàn)HandlerInterceptor接口。
  • 攔截器和過(guò)濾器類似宣肚,功能方向側(cè)重點(diǎn)不同想罕,過(guò)濾器是用來(lái)過(guò)濾請(qǐng)求參數(shù),設(shè)置編碼集等工作霉涨。
    攔截器是攔截用戶請(qǐng)求按价, 做請(qǐng)求做判斷處理的
  • 攔截器是全局的,可以對(duì)多個(gè)Controller做攔截
    一個(gè)項(xiàng)目中可以有0個(gè)或者多個(gè)攔截器笙瑟,他們一起攔截用戶的請(qǐng)求楼镐。攔截器常用在:用戶登錄處理,權(quán)限檢查往枷,記錄日志框产。
  • 攔截器的使用步驟:
  1. 定義類實(shí)現(xiàn)HandlerInterceptor接口
    實(shí)現(xiàn)接口中的三個(gè)方法
  2. 在springmvc配置文件中,聲明攔截器错洁,讓框架知道攔截器的存在秉宿。
    組件掃描器掃描@Controller注解,聲明攔截器并指定攔截的請(qǐng)求uri地址
  • 攔截器執(zhí)行時(shí)間
    在請(qǐng)求處理之前墓臭,也就是controller類中的方法執(zhí)行之前先被攔截蘸鲸。
    在控制器方法執(zhí)行之后也會(huì)執(zhí)行攔截器
    在請(qǐng)求處理完成后也會(huì)執(zhí)行攔截器


  • 攔截器類

// 攔截器類 , 攔截用戶請(qǐng)求窿锉。

public class MyHandlerInterceptor implements HandlerInterceptor {
    Long bigtime ;
    Long etime ;
    /**
     * preHandle:預(yù)處理方法
     *      整個(gè)項(xiàng)目的入口
     *      true酌摇,false 表示是否通過(guò)
     * Object handler: 被攔截的控制器對(duì)象
     * 返回的boolean
     * 特點(diǎn)在: 方法在控制器MyController的dosome之前先執(zhí)行的
     * 在這個(gè)方法中可以獲取請(qǐng)求信息膝舅,驗(yàn)證請(qǐng)求是否符合要求。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        bigtime = System.currentTimeMillis();
        System.out.println("先處理方法");
//        request.getRequestDispatcher("/tips.jsp").forward(request,response);
        return true;
    }

    /**
     * modelAndView : 處理器方法的返回值
     * 特點(diǎn):
     *   1. 在處理器方法之后執(zhí)行的窑多。
     *   2. 能夠獲取處理器方法的返回值ModelAndView
     *   3. 主要是可以對(duì)原來(lái)的執(zhí)行結(jié)果做二次修正
     *
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
        etime = System.currentTimeMillis();
        System.out.println("postHandler");
        System.out.println(etime - bigtime);
        // 對(duì)原來(lái)的結(jié)果進(jìn)行調(diào)整
        if(mv != null){
            mv.addObject("mydate", new Date());
            mv.setViewName("other");
        }
    }

    /**
     *
     *  exL程序中發(fā)生的異常
     *
     *  特點(diǎn):
     *  在請(qǐng)求處理完成后執(zhí)行的仍稀,框架中規(guī)定當(dāng)你的視圖處理完成后,對(duì)視圖執(zhí)行了forward
     *  一般做資源回收工作的埂息,程序請(qǐng)求過(guò)程中創(chuàng)建了一些對(duì)象技潘, 在這里創(chuàng)建了一些對(duì)象,在理可以先刪除千康,把占用的內(nèi)存回收
     */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after");
    }
}
  • springmvc配置文件
    <mvc:interceptors>
        <mvc:interceptor>
<!--            請(qǐng)求攔截的uri地址
                ** : 標(biāo)識(shí)任意字符享幽,多級(jí)目錄和目錄中的文件
    -->
            <mvc:mapping path="/**"/>
<!--            聲明攔截器對(duì)象-->
            <bean class="com.lz.handler.MyHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 一個(gè)攔截器處理過(guò)程


  • 多個(gè)攔截器

配置文件中先聲明先執(zhí)行, 框架中保存多個(gè)攔截器是ArrayList拾弃, 按照聲明順序放入ArrayList中

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lz.handler.MyHandlerInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lz.handler.MyHandlerInter2"/>
        </mvc:interceptor>
    </mvc:interceptors>

執(zhí)行順序 preHandler1 --> preHandler2 ---> controller犯法---> postHandler2 --- > postHandler1 ----> after2 ----> after1

  • 攔截器執(zhí)行鏈



攔截器和過(guò)濾器的區(qū)別

  1. 過(guò)濾器是servlet中的對(duì)象值桩, 攔截器是框架中的對(duì)象。
  2. 過(guò)濾器實(shí)現(xiàn)Filter接口的對(duì)象豪椿,攔截器是實(shí)現(xiàn)HandlerInterceptor
  3. 過(guò)濾器是用來(lái)設(shè)置request奔坟,response參數(shù),屬性的搭盾,側(cè)重對(duì)數(shù)據(jù)過(guò)濾的咳秉。攔截器是用來(lái)驗(yàn)證請(qǐng)求的,能階段請(qǐng)求鸯隅。
  4. 過(guò)濾器是在攔截器之前先執(zhí)行的澜建。
  5. 過(guò)濾器是tomcat撫慰群毆?jiǎng)?chuàng)建的對(duì)象。
    攔截器是springmvc容器中創(chuàng)建的對(duì)象
  6. 過(guò)濾器是一個(gè)執(zhí)行時(shí)間點(diǎn)滋迈, 攔截器三個(gè)
  7. 過(guò)濾器可以處理jsp霎奢,js,html
    過(guò)濾器是側(cè)重?cái)r截對(duì)Controller的對(duì)象饼灿,如果你的請(qǐng)求不能被DispathcherServlet接受幕侠。
  8. 攔截器攔截普通類方法執(zhí)行,過(guò)濾器過(guò)濾servlet請(qǐng)求響應(yīng)碍彭。

攔截器實(shí)現(xiàn)登錄驗(yàn)證

步驟

  1. 創(chuàng)建maven
  2. 修改web.xml 注冊(cè)中央調(diào)度器
  3. 創(chuàng)建jsp發(fā)起請(qǐng)求
  4. 創(chuàng)建controller處理請(qǐng)求
  5. 創(chuàng)建結(jié)果show.jsp
  6. 創(chuàng)建login.jsp,模擬登陸(把用戶信息放到session)
    創(chuàng)建jsp晤硕,loginout.jsp模擬退出(從session中刪除)
  7. 創(chuàng)建攔截器,從session中獲取用戶登錄數(shù)據(jù)庇忌,驗(yàn)證能否訪問(wèn)系統(tǒng)舞箍。
  8. 創(chuàng)建一個(gè)驗(yàn)證的jsp,如果驗(yàn)證視圖皆疹,給出提示
  9. 創(chuàng)建springmvc配置文件
    組件掃描器疏橄, 聲明攔截器。

springmvc執(zhí)行流程

  1. 用戶發(fā)起請(qǐng)求
  2. DispatcherServlet 接收請(qǐng)求some.do, 把請(qǐng)求轉(zhuǎn)交給處理器映射器捎迫。
  3. 框架把找到的處理器對(duì)象放到一個(gè)叫處理器對(duì)象的處理器執(zhí)行鏈的類保存晃酒。
    HandlerExecutionChain: 保存著 處理器對(duì)象(controller), 項(xiàng)目中所有攔截器對(duì)象
  4. HandlerExecutionChain返回個(gè)中央調(diào)度器窄绒,中央調(diào)度器把HandlerExecutionChain交給處理器適配器(HandlerAdapter)贝次, 處理器適配器執(zhí)行放法,然后返回視圖給中央調(diào)度器
  5. 中央調(diào)度器在將視圖交給視圖解析器(InternalResourceViewResolver)彰导,
    實(shí)現(xiàn)了ViewResolver接口蛔翅,
    視圖解析器作用: 組成視圖完整路徑,使用前綴后綴位谋,并創(chuàng)建view對(duì)象山析。返回給中央調(diào)度器
  6. DispatcherServlet把view對(duì)象獲取到后,調(diào)用view方法倔幼,把model數(shù)據(jù)放大request作用域中盖腿,執(zhí)行對(duì)象視圖的forward,請(qǐng)求結(jié)束损同。

處理器映射器(應(yīng)該用RequestMappingHandlerMapping)

作用:處理器映射器: springmvc框架中的一種對(duì)象, 框架把實(shí)現(xiàn)了HandlerMapping接口的類叫做映射器(多個(gè))鸟款。
根據(jù)請(qǐng)求膏燃,從springmvc容器對(duì)象中獲取處理器對(duì)象。

完結(jié)何什。组哩。。处渣。伶贰。。罐栈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黍衙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荠诬,更是在濱河造成了極大的恐慌琅翻,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑贞,死亡現(xiàn)場(chǎng)離奇詭異方椎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钧嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門棠众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人有决,你說(shuō)我怎么就攤上這事闸拿〗瘟粒” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵胸墙,是天一觀的道長(zhǎng)我注。 經(jīng)常有香客問(wèn)我约计,道長(zhǎng)捆姜,這世上最難降的妖魔是什么盼忌? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任贤斜,我火速辦了婚禮诉字,結(jié)果婚禮上献烦,老公的妹妹穿的比我還像新娘蜻底。我一直安慰自己氮块,他們只是感情好吼野,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布校哎。 她就那樣靜靜地躺著,像睡著了一般瞳步。 火紅的嫁衣襯著肌膚如雪闷哆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天单起,我揣著相機(jī)與錄音抱怔,去河邊找鬼。 笑死嘀倒,一個(gè)胖子當(dāng)著我的面吹牛屈留,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测蘑,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灌危,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了碳胳?” 一聲冷哼從身側(cè)響起勇蝙,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎固逗,沒(méi)想到半個(gè)月后浅蚪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烫罩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惜傲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贝攒。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盗誊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哈踱,我是刑警寧澤荒适,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站开镣,受9級(jí)特大地震影響刀诬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邪财,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一陕壹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧树埠,春花似錦糠馆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绊袋,卻和暖如春毕匀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愤炸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工期揪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人规个。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像姓建,于是被迫代替她去往敵國(guó)和親诞仓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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