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

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

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

2019-11-10 20:03:02
字體:
來源:轉載
供稿:網友

本人轉自: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的方法里面。


上一篇:文章標題

下一篇:JVM運行數據環境

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成年无码av片在线| 国产精品h片在线播放| 国产精品h在线观看| 国产91免费观看| 欧美孕妇与黑人孕交| 色偷偷9999www| 亚洲精品一区二区在线| 国产精品日韩精品| 黑人巨大精品欧美一区二区免费| 亚洲精美色品网站| 国产一区二区三区在线观看视频| 久久久99久久精品女同性| 欧美精品videosex性欧美| 国产精品96久久久久久| 亚洲自拍中文字幕| 久久精品国产免费观看| 日韩视频精品在线| 丝袜情趣国产精品| 久久久久久久成人| 欧美成人免费播放| 欧美高清自拍一区| 久久成年人免费电影| 欧美成人在线网站| 欧美成人免费大片| 亚洲男人天堂九九视频| 久久人人看视频| 欧美最猛性xxxx| 永久免费精品影视网站| 国产成人涩涩涩视频在线观看| 日韩精品视频在线免费观看| 欧美精品www在线观看| 国产成人精品在线观看| 色哟哟亚洲精品一区二区| 色悠悠久久88| 久久999免费视频| 色妞色视频一区二区三区四区| 亚洲欧美中文日韩在线| 92国产精品久久久久首页| 国产精品美腿一区在线看| 欧美日韩国产丝袜另类| 国产欧美日韩最新| 亚洲第一区中文字幕| 97精品久久久中文字幕免费| 国模视频一区二区三区| 亚洲国产高清福利视频| 欧美日韩国产成人在线观看| 日韩亚洲综合在线| 亚洲天堂男人的天堂| 久久久久国产精品免费| 久久亚洲私人国产精品va| 日本久久久久久| 国内精品久久影院| 欧美日韩第一视频| 欧美亚洲国产日本| 午夜精品久久久久久久99热浪潮| 中文字幕少妇一区二区三区| 国产精品青草久久久久福利99| 69国产精品成人在线播放| 欧美精品videosex性欧美| 韩剧1988免费观看全集| 国产精品久久不能| 一本色道久久综合狠狠躁篇的优点| 欧美日韩国产丝袜另类| 久久久久久久激情视频| 亚洲系列中文字幕| 91精品久久久久久久久久另类| 欧美日韩999| 国产精品免费久久久| 欧美成人午夜激情视频| 久久久中精品2020中文| 日本91av在线播放| 91国内精品久久| 亚洲一区二区日本| 一区二区三区回区在观看免费视频| 日韩亚洲精品视频| 久久久久久久久网站| 亚洲国产精品一区二区久| 日韩一区二区三区xxxx| 国产精品美乳在线观看| 色综合久久中文字幕综合网小说| 俺也去精品视频在线观看| 精品久久久在线观看| 国产精品久久av| 久久久免费观看视频| 亚洲第一在线视频| 日本精品视频网站| 国产精品一区二区三区免费视频| 国产欧美一区二区三区久久| 97国产suv精品一区二区62| 日韩黄在线观看| 欧美午夜激情视频| 欧美激情精品久久久久久| 亚洲天堂日韩电影| 96pao国产成视频永久免费| 国产精品视频地址| 97在线精品国自产拍中文| 亚洲综合在线做性| 国产一区二区日韩| 国产精品欧美风情| 久久免费视频网站| 午夜精品福利电影| 国产精品午夜一区二区欲梦| 日韩国产激情在线| 国产成人精品在线视频| 日韩精品视频在线观看网址| 欧美成人午夜激情| 亚洲女人天堂视频| 中文字幕一区二区三区电影| 亚洲91精品在线| 亚洲精品国产综合区久久久久久久| 亚洲人成电影网站| 国产一区二区三区18| 久久久国产在线视频| 亚洲色图美腿丝袜| 日韩一区二区在线视频| 精品国产成人av| 亚洲第一网中文字幕| 一本色道久久综合狠狠躁篇怎么玩| 亚洲综合小说区| 亚洲国产美女精品久久久久∴| 国产精品久久97| 色婷婷综合久久久久中文字幕1| 国产视频精品一区二区三区| 成人性生交大片免费看小说| 国产精品免费福利| 欧美中文在线字幕| 精品久久久久久久久久| 国产精品久久一区| 日韩精品在线私人| 午夜精品久久久久久久男人的天堂| 久久久999国产精品| 青青青国产精品一区二区| 欧美日韩国产中文字幕| 精品国产电影一区| 亚洲国产欧美自拍| 色狠狠av一区二区三区香蕉蜜桃| 亚洲精品不卡在线| 欧美日韩免费区域视频在线观看| 亚洲精品久久久久久久久久久| 国产精品com| 国产丝袜一区二区三区| 最新的欧美黄色| 成人黄色av播放免费| 国产精品99一区| 91久久精品美女| 国产91精品久久久久久久| 成人性生交大片免费观看嘿嘿视频| 成人精品视频99在线观看免费| 亚洲美女喷白浆| 狠狠躁夜夜躁人人爽超碰91| 日韩av片免费在线观看| 国产欧美精品va在线观看| 亚洲精品国产免费| 日韩中文字幕精品视频| 欧美日韩精品中文字幕| 91精品国产九九九久久久亚洲| 亚洲成人激情视频| 日韩精品视频免费在线观看| 国产大片精品免费永久看nba| 97av在线视频| 亚洲第一精品电影| 亚洲精品视频在线观看视频| 亚洲福利视频久久| 国产日韩在线一区|