亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Spring MVC:基于注解的MVC(下)

2019-11-10 17:30:04
字體:
來源:轉載
供稿:網友

本人轉自:http://www.cnblogs.com/xrq730/p/5343160.html

Model

上一篇文章SPRing MVC:基于注解的MVC(上),講了Spring MVC環境搭建、@RequestMapping以及參數綁定,這是Spring MVC中最基礎也是最重要的內容,本篇文章繼續講講Spring MVC中其余的知識點,先從Model開始。

前一篇文章比較詳細地解讀了數據從頁面請求到服務器后臺的一些細節,那么下一個要解決的問題就是數據如何從后臺再次傳回前臺,答案就是這里要說的Model,關于Model在寫例子之前我特別先說明三點:

1、Model本身是一個接口,其實現類為ExtendedModelMap,除了使用Model之外還可以使用ModelAndView、ModelMap這些,不過要是沒有特殊需求,使用Model比較簡單,我個人也比較喜歡使用Model

2、Model的生命周期是Request,也就是說要通過Model傳值只能使用轉發而不能使用重定向

3、為什么要使用Model而不是用Request,最主要的原因就是減少代碼的侵入性或者說代碼的耦合度也行。因為Model是Spring的組件,Request是J2EE的組件,使用Model而不去使用Request可以減少對J2EE的依賴,也便于調試

OK,接下來看例子,總體的代碼還是按照上一篇文章的來,先看后臺的代碼:

復制代碼
@Controller@RequestMapping(value = "/test")public class TestController{    @RequestMapping    public String dispatchTest(Test test, Model model)    {        model.addAttribute("modelKey", "modelValue");        return "test";    }}復制代碼

就往Model里面塞一個Key-Value,然后轉發到test.jsp下,test.jsp頁面要取Model的值,可以通過JSTL(EL表達式也可以)獲取,反正直接在jsp頁面上通過"<% ... %>"寫java腳本是行不通的。test.jsp頁面這么寫:

復制代碼
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>      <head>        <base href="<%=basePath%>">                <title>test頁面</title>                <meta http-equiv="pragma" content="no-cache">        <meta http-equiv="cache-control" content="no-cache">        <meta http-equiv="expires" content="0">            <meta http-equiv="keyWords" content="keyword1,keyword2,keyword3">        <meta http-equiv="description" content="This is my page">        <!--        <link rel="stylesheet" type="text/CSS" href="styles.css">        -->      </head>        <body>          <c:out value="${modelKey}" />      </body></html>復制代碼

OK,然后訪問一下"http://localhost:8080/SpringMVC/test"這個地址,頁面上"modelValue"這幾個字符就出來了。

之前說過了,Model的生命周期是Request,那么如果頁面是重定向到test.jsp上面去,肯定是取不到"modelValue"的,可以自己試一下,因此重定向過去的話,要在后臺把數據設置到session中。

test.jsp頁面不變,Controller可以這么改:

復制代碼
@Controller@RequestMapping(value = "/test")public class TestController{    @RequestMapping    public String dispatchTest(Test test, HttpSession session)    {        session.setAttribute("modelKey", "modelValue");        return "redirect:/test.jsp";        //return "test";    }}復制代碼

可以試一下,再訪問一下"http://localhost:8080/SpringMVC/test"這個地址,"modelValue"這幾個字符在頁面上就出來了。

在Spring MVC中,Request、Response、Session、InputStream、OutputStream這些對象是自動注入的,但是就像之前說的,為了減少代碼的侵入性與耦合度,能不使用盡量還是不使用這些J2EE的對象的好。

 

攔截器(Interceptor)

SpringMVC中的攔截器相當于J2EE中的過濾器,是非常重要和相當有用的,它的主要作用就是攔截用戶的請求并進行相應的處理的,比如通過它來進行權限驗證,或者是來判斷用戶是否登陸。

在SpringMVC中使用攔截器的方法比較簡單,首先實現HandlerInterceptor接口,實現afterCompletion、postHandle、preHandle三個抽象方法,這里定義兩個Interceptor:

復制代碼
public class TestInterceptor1 implements HandlerInterceptor{    public void afterCompletion(HttpServletRequest arg0,            HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception    {        System.out.println("TestInterceptor1.afterCompletion()");    }    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2, ModelAndView arg3) throws Exception    {        System.out.println("TestInterceptor1.postHandle()");    }    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2) throws Exception    {        System.out.println("TestInterceptor1.preHandle()");        return true;    }}復制代碼復制代碼
public class TestInterceptor2 implements HandlerInterceptor{    public void afterCompletion(HttpServletRequest arg0,            HttpServletResponse arg1, Object arg2, Exception arg3)            throws Exception    {        System.out.println("TestInterceptor2.afterCompletion()");    }    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2, ModelAndView arg3) throws Exception    {        System.out.println("TestInterceptor2.postHandle()");    }    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,            Object arg2) throws Exception    {        System.out.println("TestInterceptor2.preHandle()");        return true;    }}復制代碼

說明一下三個方法的作用:

1、afterCompletion:在整個視圖渲染完畢之后執行方法里面的內容,主要用于釋放一些資源

2、postHandle:在Controller執行之后,視圖渲染之前執行方法里面的內容,也就是說postHandle方法可以對Model進行操作

3、preHandle:在Controller執行之前,執行方法里面的內容,注意該方法是有返回值的,當方法返回false時整個請求就結束了

然后在springmvc-servlet.xml里面增加攔截器的配置:

復制代碼
<!-- 配置攔截器 --><mvc:interceptors>   <mvc:interceptor>       <mvc:mapping path="/test" />        <bean class="com.xrq.interceptor.TestInterceptor2" />    </mvc:interceptor>    <mvc:interceptor>        <mvc:mapping path="/test" />        <bean class="com.xrq.interceptor.TestInterceptor1" />    </mvc:interceptor></mvc:interceptors>復制代碼

假如有多個攔截器的話,"<mvc:interceptor>...</mvc:interceptor>"定義的順序就是攔截器執行的順序。

下面繼續訪問"http://localhost:8080/SpringMVC/test",代碼執行的結果是:

TestInterceptor2.preHandle()TestInterceptor1.preHandle()TestInterceptor1.postHandle()TestInterceptor2.postHandle()TestInterceptor1.afterCompletion()TestInterceptor2.afterCompletion()

也許有些朋友對這個執行結果不是很理解,我其實是懂的,但確實一下子也說不清楚。

如果不是很理解的朋友,可以去看一下Java設計模式里面的責任鏈模式,攔截器的這種調用方法實際上是一種鏈式的調用法,TestInterceptor2調用TestInterceptor1,TestInterceptor1方法走了才會回到TestInterceptor2的方法里面。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69久久夜色精品国产69| 欧美激情综合亚洲一二区| 岛国av一区二区三区| 亚洲国产成人精品久久| 一区二区三区无码高清视频| 欧美精品www| 亚洲欧美国内爽妇网| 久久精品国产成人| 精品国模在线视频| 久久免费高清视频| 日韩风俗一区 二区| 精品一区二区三区电影| 中文字幕精品影院| 精品视频一区在线视频| 国产成人精品日本亚洲| 欧美大片va欧美在线播放| 亚洲国产精品久久久久秋霞蜜臀| 国内精品久久久久影院优| 日韩国产在线播放| 日本免费一区二区三区视频观看| 亚洲精品女av网站| 日韩精品亚洲元码| 成人免费在线视频网址| 在线观看成人黄色| 色999日韩欧美国产| 国外日韩电影在线观看| 色综合五月天导航| 91大神福利视频在线| 97精品国产97久久久久久| 亚洲黄色av网站| 懂色av影视一区二区三区| 久久在精品线影院精品国产| 91精品在线一区| 全亚洲最色的网站在线观看| 亚洲国产一区自拍| 国产亚洲美女久久| 成人网在线观看| 国产精品久久久久久久7电影| 亚洲加勒比久久88色综合| 大胆人体色综合| 中文字幕欧美精品在线| 日韩精品久久久久久久玫瑰园| 精品伊人久久97| 成人免费视频网址| 日韩有码在线观看| 国产精品久久久久av| 国产精品自拍网| 日韩成人小视频| 亚洲精品在线不卡| 尤物yw午夜国产精品视频明星| 欧美韩国理论所午夜片917电影| 国产精品视频不卡| 久久99精品久久久久久青青91| 久久视频在线观看免费| 5566日本婷婷色中文字幕97| 国语自产精品视频在线看| 热99在线视频| 91高清在线免费观看| 韩国三级日本三级少妇99| 亚洲精品国产品国语在线| 久久精品91久久香蕉加勒比| 日韩高清人体午夜| 亚洲精品久久久一区二区三区| 久久韩国免费视频| 成人乱人伦精品视频在线观看| 成人日韩av在线| 91精品在线国产| 国产欧美精品在线播放| 91社区国产高清| 色婷婷av一区二区三区在线观看| 日韩在线视频二区| 欧美伊久线香蕉线新在线| 欧美黑人巨大xxx极品| 亚洲精品mp4| 欧美一性一乱一交一视频| 欧美日韩国产在线播放| 九九综合九九综合| 色偷偷噜噜噜亚洲男人的天堂| 国产精品爽爽爽| 国外成人在线直播| 日韩高清不卡av| 久久天天躁狠狠躁老女人| 91香蕉嫩草神马影院在线观看| 国产盗摄xxxx视频xxx69| 91麻豆国产精品| 精品国产区一区二区三区在线观看| 久久露脸国产精品| 久久久久久久久亚洲| 日韩中文在线中文网在线观看| 国产精品久久久久av| 国产91精品青草社区| 国产成人精品在线观看| 国产日韩欧美中文在线播放| 欧美日韩午夜剧场| 国产精品美女无圣光视频| 一本一本久久a久久精品综合小说| 日韩在线播放一区| 成人写真视频福利网| 成人写真福利网| 欧美不卡视频一区发布| 日韩成人在线视频观看| 91国内揄拍国内精品对白| 亚洲一区二区免费| 日韩精品视频在线观看免费| 日本久久久a级免费| 久久精品99无色码中文字幕| 九九九久久国产免费| 亚洲一区二区中文字幕| 精品日本美女福利在线观看| 亚洲成人久久电影| 国产精品久久77777| 欧美精品做受xxx性少妇| 国产成人精品一区二区三区| 亚洲欧美另类自拍| 丝袜一区二区三区| 国产成人高潮免费观看精品| 国产精品久久久久免费a∨大胸| 亚洲精品综合精品自拍| 国产成人精品午夜| 国产不卡一区二区在线播放| 日韩免费观看高清| 91超碰中文字幕久久精品| 在线观看视频亚洲| 久久婷婷国产麻豆91天堂| 久久久精品国产网站| 亚洲最大的网站| 色偷偷偷综合中文字幕;dd| 国产福利成人在线| 91精品国产精品| 琪琪第一精品导航| 成人在线精品视频| 久久久久久国产精品| 在线观看中文字幕亚洲| 欧美电影第一页| 欧美日韩中文字幕综合视频| 国产女人精品视频| 一区二区三区美女xx视频| 亚洲国产成人在线播放| 国产在线98福利播放视频| 国产精品久久久久久久久影视| 欧美日韩国产成人高清视频| 精品久久久久久亚洲国产300| 91探花福利精品国产自产在线| 欧美极品少妇xxxxⅹ喷水| 深夜福利亚洲导航| 一本色道久久88精品综合| 亚洲综合中文字幕在线观看| 91国产精品视频在线| 黑人欧美xxxx| 国产精品美女午夜av| 日韩激情片免费| 欧美成人免费在线观看| 亚洲最大av在线| 麻豆一区二区在线观看| 高清欧美电影在线| 精品中文字幕在线| 欧美专区中文字幕| 在线精品国产成人综合| 亚洲va久久久噜噜噜久久天堂| 欧美激情欧美狂野欧美精品| 色婷婷综合成人av| 亚洲精品欧美极品| 久久久av亚洲男天堂| 国产精品成人v|