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

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

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

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

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


上一篇:ROS仿真

下一篇:demo

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2021国产精品视频| 欧美有码在线视频| 欧美日韩视频在线| 91九色综合久久| 黄色成人av在线| 狠狠色狠狠色综合日日五| 精品性高朝久久久久久久| 欧美日韩福利在线观看| 少妇高潮 亚洲精品| 亚洲第一精品久久忘忧草社区| 在线看日韩欧美| 91大神在线播放精品| 国产精品最新在线观看| 中文字幕在线国产精品| 欧美一级大片在线观看| 欧美激情免费观看| 精品国产区一区二区三区在线观看| 91社影院在线观看| 国产午夜精品理论片a级探花| 亚洲最大中文字幕| 中文.日本.精品| 国产精品综合不卡av| 成人a免费视频| 欧洲成人性视频| 久久精品视频播放| 2020国产精品视频| 欧美天天综合色影久久精品| 黑人巨大精品欧美一区免费视频| 亚洲高清在线观看| 精品国产自在精品国产浪潮| 日韩一区二区三区国产| 国产成人在线亚洲欧美| 欧美亚洲视频一区二区| 成人黄色生活片| 成人网在线观看| 欧美成人精品h版在线观看| 97国产在线观看| 中文字幕精品在线视频| 91精品国产自产在线观看永久| 国产91在线高潮白浆在线观看| 在线日韩欧美视频| 国产亚洲视频中文字幕视频| 一本大道香蕉久在线播放29| 久久亚洲电影天堂| 亚洲视频一区二区| 亚洲精品自拍偷拍| 亚洲美腿欧美激情另类| 国产精品海角社区在线观看| 欧美性猛交xxxx乱大交极品| 国产亚洲福利一区| 亚洲久久久久久久久久| 福利视频一区二区| 欧美黑人一级爽快片淫片高清| 欧美国产高跟鞋裸体秀xxxhd| 国产视频在线观看一区二区| 97精品国产91久久久久久| 成人a在线视频| 亚洲视频在线看| 亚洲综合成人婷婷小说| 91精品国产91久久久久久吃药| 深夜精品寂寞黄网站在线观看| 欧美精品在线第一页| 国产精品免费久久久| 久久免费视频观看| 日韩av在线播放资源| 91欧美精品成人综合在线观看| 欧美激情一区二区三区成人| 亚洲精品国产免费| 中文字幕日韩欧美| 欧美成aaa人片在线观看蜜臀| 欧美第一黄网免费网站| 欧美极品xxxx| 久久久久久九九九| 久久影院中文字幕| 欧美高清在线观看| 91久久国产婷婷一区二区| 日韩免费黄色av| 激情成人中文字幕| 欧美一级电影在线| 国产精品久久久久久av福利软件| 亚洲乱码一区av黑人高潮| 日韩美女毛茸茸| 亚洲r级在线观看| 欧美电影免费在线观看| 久久亚洲精品毛片| 欧美激情亚洲自拍| 日本成人黄色片| 国产免费一区二区三区香蕉精| 久久黄色av网站| 精品亚洲一区二区三区| 亚洲精品国精品久久99热一| 国产精自产拍久久久久久蜜| 久久成人亚洲精品| 在线亚洲午夜片av大片| 日本一区二区不卡| 国产午夜精品理论片a级探花| 国产91九色视频| 亚洲一区二区免费在线| 亚洲欧美色图片| 亚洲欧美自拍一区| 亚洲精品日韩激情在线电影| 欧美视频第一页| 伊人一区二区三区久久精品| 98午夜经典影视| 韩曰欧美视频免费观看| 亚洲香蕉成视频在线观看| 亚洲影视中文字幕| 精品毛片三在线观看| 久久久久这里只有精品| 亚洲天堂免费观看| 国产91热爆ts人妖在线| 国产精品高潮在线| 欧美第一黄网免费网站| 91精品久久久久久久久中文字幕| 亚洲伊人一本大道中文字幕| 国产日产欧美a一级在线| 日韩成人在线网站| 成人国产在线视频| 日韩av综合中文字幕| 国产精品一区专区欧美日韩| 成人黄色影片在线| 黑人极品videos精品欧美裸| 亚洲精品白浆高清久久久久久| 日韩精品丝袜在线| 色偷偷综合社区| 国内精品小视频在线观看| 国产一区二区三区在线播放免费观看| 性欧美视频videos6一9| 国产日韩视频在线观看| 午夜精品一区二区三区在线| 欧美巨猛xxxx猛交黑人97人| 26uuu另类亚洲欧美日本老年| 日韩中文字幕在线视频播放| 国产精品亚洲自拍| 亚洲精品不卡在线| 美日韩在线视频| 国产欧美一区二区三区久久人妖| 亚洲第一色在线| 亚洲免费福利视频| 精品亚洲一区二区三区在线播放| 日韩欧美a级成人黄色| 日韩风俗一区 二区| 日韩av黄色在线观看| 亚洲精品aⅴ中文字幕乱码| 国自在线精品视频| 亚洲国内精品视频| 国产精品人成电影| 欧美特级www| 中文字幕免费精品一区高清| 国外色69视频在线观看| 亚洲国产精品va在线看黑人动漫| 色婷婷av一区二区三区在线观看| 4p变态网欧美系列| 日韩欧美一区视频| 97超碰蝌蚪网人人做人人爽| 97国产suv精品一区二区62| www.亚洲免费视频| 一个人www欧美| 精品国内亚洲在观看18黄| 国产精品99久久久久久白浆小说| 精品视频久久久久久| 亚洲欧美日韩网| 国产亚洲精品美女久久久| 丝袜美腿精品国产二区|