国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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運行數據環境

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 当雄县| 巴彦县| 封开县| 宁远县| 铜山县| 光山县| 台东县| 望奎县| 崇阳县| 潞城市| 四平市| 河北区| 江华| 合江县| 洪雅县| 林州市| 海淀区| 昆明市| 济阳县| 五寨县| 开平市| 博乐市| 鸡东县| 孟州市| 长顺县| 山阳县| 临城县| 十堰市| 大埔区| 榆林市| 江孜县| 屏南县| 芜湖市| 旬阳县| 灌云县| 永嘉县| 宁陵县| 繁昌县| 石楼县| 腾冲县| 四川省|