日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

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

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

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

本文轉自:http://www.cnblogs.com/xrq730/p/5342650.html

什么是SPRing MVC

Spring MVC框架是一個MVC框架,通過實現Model-View-Controller模式來很好地將數據、業務與展現進行分離。從這樣一個角度來說,Spring MVC和Structs、Structs2非常類似。Spring MVC的設計是圍繞DispatcherServlet展開的,DispatcherServlet負責將請求派發到特定的handler。通過可配置的hander mappings、view resolution、locale以及theme resolution來處理請求并且轉到對應的視圖。Spring MVC請求處理的整體流程如圖:

Spring MVC有基于注解版與基礎.xml版的兩種用法,不過現在的企業級開發基本都使用的是注解版,沒別的原因,就是方便而已。因此后面的代碼示例,都是基于注解版本的,想了解基于.xml版本的Spring MVC的朋友可以自行上網查詢。

 

Spring MVC環境搭建

要開始本文后面的內容,自然要搭建一個Spring MVC的環境,那么首先建立一個java Web的工程,我建立的工程名字叫做SpringMVC,要搭建一個基礎功能的Spring MVC環境,必須引入的jar包是beans、context、core、expression、web、webmvc以及commons-logging。

然后,對web.xml添加一些內容:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">        <display-name></display-name>        <welcome-file-list>        <welcome-file>index.jsp</welcome-file>    </welcome-file-list>            <!-- 該監聽器將在Web容器啟動時激活Spring -->    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>        <!-- 處理由JavaBeans,Introspector的使用而引起的緩沖泄露,建議配置此監聽器 -->    <listener>        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>    </listener>        <!--configure the setting of springmvcDispatcherServlet and configure the mapping-->    <servlet>        <servlet-name>springmvc</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>              <param-name>contextConfigLocation</param-name>              <param-value>classpath:springmvc-servlet.xml</param-value>          </init-param>          <load-on-startup>1</load-on-startup>     </servlet>     <servlet-mapping>        <servlet-name>springmvc</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping></web-app>

兩個listener不是必須的,但是servlet是必須的,url-pattern用于開發者選擇哪些路徑是需要讓Spring MVC來處理的。接著在classpath下按照我們約定的名字springmvc-servlet.xml寫一個xml文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://www.springframework.org/schema/beans"      xmlns:mvc="http://www.springframework.org/schema/mvc"      xmlns:context="http://www.springframework.org/schema/context"      xmlns:aop="http://www.springframework.org/schema/aop"      xmlns:tx="http://www.springframework.org/schema/tx"      xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-4.2.xsd">            <context:annotation-config />        <context:component-scan base-package="com.xrq.controller"/>        <!-- 配置視圖解析器 -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">          <!-- WebRoot到一指定文件夾文件路徑 -->          <property name="prefix" value="/" />          <!-- 視圖名稱后綴  -->          <property name="suffix" value=".jsp" />      </bean>  </beans>

另外,由于使用了Spring,所以Tomcat啟動的時候默認會去WEB-INF下找applicationContext.xml,所以放一個空的applicationContext.xml到WEB-INF下:

復制代碼
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">    </beans>復制代碼

寫一個Java POJO,用于處理具體的請求:

復制代碼
@Controller@RequestMapping(value = "/test")public class TestController{    @RequestMapping    public String dispatchTest()    {        System.out.println("Enter TestController.dispatchTest");        return "test";    }}復制代碼

注意,這里有一個@Controller,這個注解和@Service注解意思差不多,都表示該類是一個Spring Bean,這樣就不需要再在Spring文件中為這個類定義Bean了。

另外,由于我前面在springmvc-servlet.xml中配置了prefix和suffix,因此return的時候就可以方便一些,不需要寫前綴和后綴,Spring MVC默認會轉發到(請求轉發是Spring MVC默認的頁面跳轉方式)"/test.jsp"路徑下。

最后別忘了,因為在web.xml中設置了啟動激活Spring,因此還需要寫一個applicationContext.xml(Spring文件的默認名字),當然,里面除了基本的聲明,什么實際內容都不需要。最終,WebRoot文件夾應該是這么一個結構:

最后,啟動容器,訪問"localhost:8080/SpringMVC/test",容器就會把該請求轉發到"localhost:8080/SpringMVC/test.jsp"頁面下了。

 

@RequestMapping注解

Spring MVC中最重要的注解應該就是@RequestMapping了,它是用于處理請求映射的。繼續看剛才的TestController:

復制代碼
@Controller@RequestMapping(value = "/test")public class TestController{    @RequestMapping    public String dispatchTest()    {        System.out.println("Enter TestController.dispatchTest()");        return "test";    }}復制代碼

類上的RequestMapping是用于第一層匹配的。"localhost:8080/SpringMVC/test"和"localhost:8080/SpringMVC/add",value是test,自然走的是前者。

接著看,比如我在TestController中又定義了三個方法,此時類上不使用RequestMapping注解:

復制代碼
@RequestMapping(value = "/add")public String dispatchAddTest(){    System.out.println("Enter TestControll.dispatchAddTest()");    return "test";}    @RequestMapping(value = "/add/add")public String dispatchAddAddTest(){    System.out.println("Enter TestControll.dispatchAddAddTest()");    return "test";}@RequestMapping(value = "/del")public String dispatchDelTest(){    System.out.println("Enter TestControll.dispatchDelTest()");    return "test";}復制代碼

那么這三個方法分別匹配的路徑是:

"localhost:8080/SpringMVC/add""localhost:8080/SpringMVC/add/add""localhost:8080/SpringMVC/del"

關于路徑匹配,再提一點,假如在類上和方法上都加了RequestMapping,那么將會以類路徑為基準,再向方法路徑做匹配,比如:

復制代碼
@Controller@RequestMapping(value = "/test/")public class TestController{    @RequestMapping(value = "common")    public String root()    {        System.out.println("Enter TestController.root()!");        return "result";    }}復制代碼

這種寫法,匹配的應當是:

"localhost:8080/SpringMVC/test/common""localhost:8080/SpringMVC/test/common/""localhost:8080/SpringMVC/test/common.html""localhost:8080/SpringMVC/test/common.jsp""localhost:8080/SpringMVC/test/common.vm"

類似這種的路徑,如果還想往"localhost:8080/SpringMVC/test/common/"再添加內容,那么root()這個方法就無法匹配到了,必須再添加方法。多說一句,"/"一直是一個容易弄混的東西,我自己試驗的時候發現,RequestMapping里面的value屬性,只要路徑不存在多級的關系,加不加"/"是沒有什么影響的。

另外,@RequestMapping還可以匹配請求類型,到底是GET還是POST還是其他的,這么做:

@RequestMapping(method = RequestMethod.POST)public String dispatchTest(){    System.out.println("Enter TestController.dispatchTest()");    return "test";}

這樣就指定了該方法只匹配"localhost:8080/SpringMVC/test"且請求方式為POST的請求。

前面頁面跳轉的方式都是轉發(dispatch)的方式,轉發在我看來未必是一種很好的方式,典型的就是處理表單的時候會有表單重復提交的問題,那么如何使用重定向(redirect)的方式進行頁面跳轉?可以這么寫Controller的方法,差別在于return部分:

@RequestMappingpublic String dispatchTest(Test test){    System.out.println("Enter TestController.dispatchTest(), test: " + test);    return "redirect:/test.jsp";}

最后,@RequestMapping中還有params、headers、consumes等幾個屬性,不過這幾個都不重要,也不常用,就不講了。

 

參數匹配

處理url也好、表單提交也好,參數匹配是非常重要的一個內容,萬幸,Spring MVC對參數請求的支持做得非常好----它會自動根據url或者表單中參數的名字和方法中同名形參進行匹配并賦值。

舉一個例子:

復制代碼
@Controller@RequestMapping(value = "/test")public class TestController{    @RequestMapping    public String dispatchTest(String testId, String ttestId)    {        System.out.println("Enter TestController.dispatchTest(), testId = " + testId +                 ", ttestId = " + ttestId);        return "test";    }}復制代碼

此時,我訪問"localhost:8080/SpringMVC/test?testId=1&ttestId=2",控制臺打印出:

Enter TestController.dispatchTest(), testId = 2, ttestId = 3

不僅如此,方法中還可以放入一個實體類對象:

復制代碼
public class Test{    private String tid;    private String nid;    private String bid;        public void setTid(String tid)    {        this.tid = tid;    }        public void setNid(String nid)    {        this.nid = nid;    }        public void setBid(String bid)    {        this.bid = bid;    }        public String toString()    {        return "tid = " + tid + ", nid = " + nid + ", bid = " + bid;    }}復制代碼

注意,實體類對象中如果私有屬性不打算對外提供,getter可以沒有,但是為了Spring MVC可以將對應的屬性根據屬性名稱進行匹配并賦值,setter必須要有。把TestController稍作改造,傳入一個對象:

@RequestMappingpublic String dispatchTest(Test test){    System.out.println("Enter TestController.dispatchTest(), test: " + test);    return "test";}

此時我訪問"http://localhost:8080/SpringMVC/test?tid=0&bid=1&nid=2",控制臺上打印出:

Enter TestController.dispatchTest(), test: tid = 0, nid = 2, bid = 1

看到,參數完全匹配。

不僅如此,再多試驗一點:

復制代碼
@RequestMappingpublic String dispatchTest(Test test1, Test test2, String tid, String nid){    System.out.println("Enter TestController.dispatchTest(), test1:" + test1 +             "; test2:" + test2 + "; tid:" + tid + "; nid:" + nid);    return "test";}復制代碼

訪問一樣地址"http://localhost:8080/SpringMVC/test?tid=0&bid=1&nid=2",結果是:

Enter TestController.dispatchTest(), test1:tid = 0, nid = 2, bid = 1; test2:tid = 0, nid = 2, bid = 1; tid:0; nid:2

結論就是:

假如方法的參數是普通的字符串,只要字符串名字有和請求參數中的key完全匹配的,Spring MVC就會將完全匹配的自動賦值假如方法的參數是實體類,只要實體類中的參數有和請求參數中的key完全匹配的,Spring MVC就會將完全匹配的自動賦值

對于url如此,應用到表單中也是一樣的,有興趣的可以自己試驗一下。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产黄色小视频| 中文字幕在线观看欧美| 伊人国产视频| 中文字幕 欧美日韩| 在线国产99| 日韩视频在线免费播放| 亚洲综合在线中文字幕| 国产午夜精品视频免费不卡69堂| www.中文字幕在线观看| 欧美日韩中文字幕精品| 精品久久久视频| 91精品网站| 91av久久久| 91国内精品在线视频| 中文字幕在线看视频国产欧美| 日韩久久精品成人| 国产欧美综合在线观看第十页| 欧美高清一级片在线| av一级在线| 久久99久久久久| 91精品在线视频观看| 久久精品人妻一区二区三区| 欧美日韩在线精品成人综合网| 日韩欧美成人一区二区三区| 欧美在线观看视频一区| 亚洲一区视频在线观看视频| 国产欧美日韩最新| 亚洲一级二级| 国产欧美日韩成人| 国产成人日日夜夜| 午夜国产视频| 欧美日韩亚洲一| 欧美日韩国产免费观看视频| 一本一道综合狠狠老| aa国产成人| 欧美午夜影院在线视频| 成人无遮挡免费网站视频在线观看| 精品午夜av| 精品乱子伦一区二区| 久久91精品久久久久久秒播| 久久精品最新免费国产成人| 欧美日韩精品中文字幕| 日本а中文在线天堂| 精品久久香蕉国产线看观看gif| 欧美国产一级片| 欧美日韩人人澡狠狠躁视频| 亚洲黄页一区| www中文字幕在线观看| 日韩欧美国产视频| 日韩中文字幕视频网| 日韩精品视频免费看| 91精品国产丝袜白色高跟鞋| 亚洲国产欧美日韩精品| 在线亚洲人成| 日韩av一区二| 精品视频—区二区三区免费| 欧美日韩视频免费看| 国产超级va在线视频| 日本一级一片免费视频| 久久久久久欧美| 欧美日韩国产一二| 国产三级在线| 国产黄色在线| 日韩精品高清不卡| 精品视频999| 国产高清在线视频| 精品一二三区视频| 日韩精品高清不卡| 99这里有精品视频| 欧美高清视频一区二区三区| 国产三级视频在线| 中文字幕在线中文字幕二区| 不卡中文一二三区| 国产婷婷色一区二区三区在线| 精品网站999| 日韩专区中文字幕| 一区二区不卡久久精品| 精品欧美久久久| av免费观看国产| 亚洲一二三不卡| 日韩av一区二| 欧美久久久精品| 亚洲三级av| 欧美日韩国产一级片| 亚洲一卡二卡在线观看| 亚欧成人精品| 久久精品国产91精品亚洲| 欧美乱大交xxxxx免费| 日韩精品在线看| 午夜一区二区三区免费| 日韩国产欧美三级| 欧美亚洲国产日韩2020| 日韩国产在线观看一区| 欧美日韩综合色| 国产免费播放一区二区| www.狠狠干| 精品视频在线视频| 日韩欧美在线字幕| 国产字幕在线看| 亚洲乱码中文字幕| 在线观看免费国产小视频| 在线综合 亚洲 欧美中文字幕| 视频一区二区精品的福利| 国产福利不卡| 中文字幕亚洲区| 亚洲欧美中文字幕在线一区| 免费精品国产自产拍在| 在线视频日韩欧美| 国产日韩在线视频| 国产成人精品综合久久久| 欧美日韩亚洲一区| 精品久久电影| 日韩久久99| 亚洲人成欧美中文字幕| 视频一区二区国产| 欧美大片在线观看一区| 91精品高清| 日韩av在线中文字幕| 欧美日韩一二| 国内不卡的二区三区中文字幕| 日韩免费视频| 麻豆精品99| 日韩欧美在线中文字幕| 日韩欧美中文字幕在线播放| 中文字幕亚洲一区在线观看| 一区三区二区视频| 91久久精品在线| 日本黄色一区二区三区| 国产福利三区| 日本va欧美va精品发布| 黄色一区二区在线| 国产一级视频在线播放| 欧美特黄一区| 欧美日韩综合不卡| 国产福利免费在线观看| 精品日本视频| 日韩精品久久久| 中文字幕人成乱码在线观看| 欧美日韩在线第一页| 日韩在线观看视频一区| 香蕉精品久久| 欧美国产亚洲一区| 亚洲国产一区自拍| 国产激情久久久| 欧美中文字幕在线视频| 日韩国产成人| 亚洲二区自拍| 国产亚洲一级| 中文网丁香综合网| 国产乱码午夜在线视频| 韩国av一区二区| 欧美亚洲国产日韩2020| 欧美日韩视频网站| 天天摸日日摸狠狠添| 国产午夜精品久久| 欧美高清一区| 亚洲视频色图| 日韩在线观看视频一区二区| 国产欧美日韩在线看| 国产在线黄色| 一级特黄大欧美久久久| 天天在线视频色| 精品日韩欧美| 亚洲精品欧美二区三区中文字幕| 搞黄在线观看| 国产视频1区2区| 色一区在线观看| 国产成人精品免费网站| 亚州黄色一级| 日韩欧美在线中字| 天堂精品高清1区2区3区| 欧美色视频一区二区三区在线观看| 午夜一区二区三区| 日韩中文在线视频| 日韩福利视频导航| 蜜桃精品视频| 日韩精品视频在线观看免费| 日韩在线一区二区| 国产日韩电影| 精品免费视频| 久久欧美中文字幕| 在线不卡日本| 日韩在线视频免费观看| 不卡视频一区二区| 日韩精品手机在线| 欧美1234区| 日韩网站中文字幕| 精品对白一区国产伦| 日韩欧美在线看| 亚洲成在线观看| 日韩中文字幕第一页| 国产中文伊人| 在线日韩中文字幕| www.狠狠干| 日韩精品视频中文在线观看| 91精品国产91久久久| 天堂在线一区二区三区| 亚洲欧美视频一区二区三区| 亚洲一区在线观看视频| 国产激情99| 成人精品国产福利| 一本大道一区二区三区| 国产日韩av一区| 久久精品最新免费国产成人| 中文字幕欧美亚洲| 一本大道一区二区三区| 久久久99免费| 樱花草www在线观看| 91精品久久久久久蜜臀| 一级网站免费观看| 91精品国产91久久久久| 日韩在线二区| 欧美在线视频第一页| 日韩精品在线免费播放| 国产三级在线播放| 日韩欧美国产午夜精品| 国产日韩第一页v| 国产一级一片免费播放| 亚洲成av人综合在线观看| 婷婷中文字幕在线观看| 日韩精品视频免费| 欧美日韩在线播放视频| 精品日韩av| 国产三级视频在线| 国产偷久久久精品专区| 日韩中文字幕在线视频观看| 午夜一区二区三区视频 | 91精品国产91久久久久| 日韩在线二区| 欧美日韩视频网站| 国产在线一在线二| 天堂在线一区二区三区| 国产视频97| www.老鸭窝.com| 亚洲欧美小说国产图片| 日韩视频1区| 日韩精品一级| 久久电影国产免费久久电影| 精品视频—区二区三区免费| 精品国产欧美日韩| 天天综合色天天| 欧美日韩中文另类| 久久精品久久久久| 在线免费播放av| а√天堂8资源中文在线| 欧美久久久网站| 日本精品免费观看高清观看| 黄色欧美日韩| 国产欧美日韩亚州综合| 欧美一级免费看| 91精品国产综合久久香蕉最新版| 国产在线欧美日韩| 亚洲第一视频| 国产嫩草影院久久久久| 欧美三级日韩三级| 日韩欧美国产片| 亚洲男女av一区二区| 在线观看一区日韩| 午夜精品一区二区三区视频免费看| 日韩欧美亚洲区| 国产黄色高清在线| 亚洲欧美中文字幕| 欧美日韩高清在线| 国产男女av| 欧美在线日韩在线| 精品日韩99亚洲| 国产在线视频不卡| 日韩精品一二三四区| 人妻一区二区三区免费| 久久香蕉精品| 91精品在线视频观看| 国产日韩综合| 午夜国产视频| 国产在线播放一区二区| 国产日产一区二区| 日韩精品―中文字幕| 日韩区欧美区| 欧美日韩中文字幕在线观看| 亚洲大片免费看| 欧美日韩在线三级| 日韩欧美在线中字| 亚洲欧美小说国产图片| 日韩在线观看视频一区二区| 91精品国产综合久久蜜臀| 亚洲福利在线视频| 国内精品99| 一级片免费在线| 国产视频2区| 福利在线国产| av首页在线| 日韩三级一区| 首页国产欧美久久| 中文字幕在线播出| 成人a在线观看| 欧美日韩日本视频| 在线看欧美日韩| 欧美日韩视频不卡| 国产嫩草影院久久久久| 中文字幕久精品免费视频| 日韩中文字幕| 日韩精品在线观看网站| 精品在线网站观看| 一区二区在线视频播放| 中文字幕亚洲国产| 亚洲第一精品在线| 国产传媒久久久| 久久久精品福利| 欧美1234区| 日韩视频一区| 日韩国产在线观看一区| 精品在线网站观看| 欧美日韩日本视频| 欧洲精品二区| 精品视频国产| 日韩不卡一二区| 在线三级av| 欧美激情一区二区在线| 欧美亚洲国产免费| 午夜私人影院在线观看| 在线中文字幕视频观看| 日韩欧美一二三四区| 91精品国产综合久久久久久| 欧美日韩国产片| 在线观看中文字幕一区| 精品极品三级久久久久| 久久精品夜夜夜夜久久| 国产黄色在线播放| 亚洲成av人片在线| 久久网站免费观看| 欧美日韩精品免费| 在线观看av的网站| 亚洲专区一二三| 最新中文字幕在线播放| 亚洲高清在线观看一区| 精品国产1区二区| 国产免费一级片| 日本熟女一区二区| 午夜视频在线观看一区| 婷婷中文字幕一区| 午夜国产视频| 国产农村妇女精品一二区| 日韩欧美一级在线| 亚洲一区在线观看免费| 亚洲综合三区| 日韩国产成人| 国产专区中文字幕| 欧美中日韩在线| 欧美日韩精品中文字幕| 日韩免费视频一区二区| 日韩在线观看视频一区| 日韩中文字幕国产| 日韩中文字幕亚洲| 午夜精品一区二区三区免费视频| 日韩国产欧美| 国产99在线 | 亚洲| 国产日韩亚洲欧美| 在线观看91精品国产入口| 亚洲一区在线视频观看| 蜜臀久久精品| 在线中文字幕视频观看| 亚洲一二三不卡| av免费在线不卡| 亚洲制服丝袜一区| 日韩国产在线不卡视频| 亚洲福利在线看| 精品国产乱码一区二区| 国产在线拍偷自揄拍精品| www.精品av.com| 日韩精品在线免费看| 91最新在线| 美日韩精品免费视频| 国产又粗又猛又爽又黄91精品| 日韩国产专区| 日韩.com| 久久精品最新免费国产成人| 亚洲一区在线观看网站| 91精品国产91| 欧美日韩国产免费| 国产免费不卡av| 欧美日韩高清一区二区不卡| 欧美日韩在线观看成人| 日韩 欧美 亚洲| 欧美日韩精品在线| 日韩中文字幕国产| 欧美日韩中文字幕在线| 欧美日韩免费视频| 国产久卡久卡久卡久卡视频精品| 久草视频观看| 精品日韩一区二区三区免费视频| 999精品视频在线观看播放| 日韩欧美三级视频| 亚洲一区二区三区精品中文字幕| 美女黄a一级视频| 成年人黄国产| 久久婷婷中文字幕| 免费视频久久| 亚洲一区在线观看免费| 国产午夜精品视频| 日韩不卡在线观看| 国产中文在线观看|