一、SpringMVC

1.SpringMVC概述

1.1 SpringMVC的歷史

  • SpringMVC 它可以稱為一個(gè)解決 JavaEE 開發(fā)的 B/S 架構(gòu)項(xiàng)目的表現(xiàn)層的 MVC 的框架笔喉。其實(shí)在 SpringFramework項(xiàng)目中只是一個(gè)子模塊而已罗捎,最開始在SpringFramework項(xiàng)目中沒有SpringMVC子模塊,在一段時(shí)間里慢慢發(fā)展起來解決表現(xiàn)層業(yè)務(wù)邏輯的時(shí)候乎芳,才有了Springmvc 這樣的子模塊是在 SpringFramework項(xiàng)目中基于(AOP IOC 為基礎(chǔ)發(fā)展起來的),Springmvc 模塊應(yīng)該依賴 ioc 以及 aop。

  • Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品帖池,已經(jīng)融合在Spring Web Flow里面奈惑。Spring 框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊。使用 Spring 可插入的 MVC 架構(gòu)睡汹,從而在使用Spring進(jìn)行WEB開發(fā)時(shí)肴甸,可以選擇使用Spring的SpringMVC框架或集成其他MVC開發(fā)框架,如Struts1囚巴,Struts2等原在。

1.2. Springmvc是什么友扰?

Springmvc 也是一個(gè)類似于struts2框架的基于MVC 設(shè)計(jì)模式的表現(xiàn)層框架

1.2.1JAVAEE 開發(fā)應(yīng)用采用經(jīng)典的三層架構(gòu)

  • 表現(xiàn)層:完成跟客戶端進(jìn)行數(shù)據(jù)交互的, 處理數(shù)據(jù)以及模型跳轉(zhuǎn)的。
  • 業(yè)務(wù)邏輯層:完成數(shù)據(jù)針對(duì)需求進(jìn)行數(shù)據(jù)加工作處理
  • 數(shù)據(jù)訪問層(持久層): 完成對(duì)數(shù)據(jù)的持久化到數(shù)據(jù)庫提供操作對(duì)象

1.2.2 MVC 設(shè)計(jì)模式 沒在Java 23種設(shè)計(jì)模式中

  • Model(模型):數(shù)據(jù)模型(POJO)以及業(yè)務(wù)模型(Service層中)
  • View(視圖):模型渲染庶柿、填充模型數(shù)據(jù)用 Jsp 村怪、 pdf 、freemarker
  • Controller(控制器):Filter浮庐、Servlet作為中央控制器

2. SpringMVC 第一個(gè)程序

2.1 pom 文件配置 (導(dǎo)包)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xingxue.springmvc</groupId>
    <artifactId>springmvc-demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <!-- 導(dǎo)入 springmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>


        <!-- 導(dǎo)入 servlet 相關(guān)依賴 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <!-- 最小支持的 編譯版本 -->
                    <target>1.7</target>
                    <!-- 1.7 編譯源碼 -->
                    <source>1.7</source>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.2 配置 web.xml (應(yīng)用的描述文件)甚负,服務(wù)器啟動(dòng)的時(shí)候,要去讀

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">

    
    <!-- 
        mvc 框架 都有兩種控制器:
            1.前端控制器 (框架提供) StrutsPrepareAndExectuteFilter (Filter ) 审残、 DispatcherServlet (Servlet)
            2.頁面控制器(程序員自己定義) UserAction梭域、RoleAction...... 、 UserController搅轿、RoleController
                (Action Contoller  Handler)
                
        Filter  vs  Servlet 區(qū)別:
            相同點(diǎn):都可以處理http 請(qǐng)求:
            Filter : public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            Servlet:public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
            
            不同點(diǎn):Filter 功能要比 Servlet 強(qiáng)大病涨。  FilterChain chain 實(shí)現(xiàn)請(qǐng)求預(yù)處理
     -->
     
     
    <servlet>
        <!-- DispatcherServlet 組件在init 初始化的時(shí)候,會(huì)去讀取 mvc 配置文件 -->
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc.xml</param-value>
        </init-param>
        <!-- Servlet 組件創(chuàng)建的時(shí)候是在第一次請(qǐng)求來的時(shí)候才會(huì)創(chuàng)建璧坟,配上下面可以使 Servlet 組件在應(yīng)用啟動(dòng)的時(shí)候就被創(chuàng)建 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!-- Tomcat 有一個(gè)  rg.apache.catalina.servlets.DefaultServlet 默認(rèn)攔截  / 既穆,可以處理靜態(tài)數(shù)據(jù)(html css js...)
             DispatcherServlet 前端控制器 配置上  / 也就覆蓋了DefaultServlet
             
             如果不配,就使用不了Spring mvc 提供的 restFul 風(fēng)格的網(wǎng)絡(luò)資源架構(gòu)
                restFul :不是一種技術(shù)實(shí)現(xiàn)雀鹃,它是一種網(wǎng)絡(luò)資源架構(gòu)規(guī)則
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

2.3 開發(fā) Controller 控制器

//頁面控制器
@Controller
public class UserController {
    
    @RequestMapping(value="/hello")
    public String hello() {
        System.out.println("請(qǐng)求來了...");
        return "ok";
    }

}

2.4 mvc.xml 文件配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

<!-- 靜態(tài)資源處理 -->
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.xingxue"></context:component-scan>
<mvc:annotation-driven/>

<!-- 內(nèi)部資源視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
</beans>

3. @RequestMapping 請(qǐng)求映射注解

  • 該注解用于映射請(qǐng)求 是通過 該注解的 value 屬性來映射循衰。
  • 該注解可以修飾在類上,也可以修飾在方法上:如果修飾在類上會(huì)自動(dòng)在每個(gè)方法的url路徑上加上類上的前綴
  • 該注解可以使用 method 屬性來映射 請(qǐng)求方式
  • 該注解可以使用params 屬性來映射 請(qǐng)求攜帶的參數(shù)

總結(jié) : RequestMapping 注解中的 value 屬性用來映射 url褐澎,method屬性用于映射請(qǐng)求方式,params 屬性用于 映射 請(qǐng)求攜帶的參數(shù)

4.Springmvc 處理請(qǐng)求流程

圖片.png

1.頁面發(fā)出請(qǐng)求到 dispatcherServlet中央控制器進(jìn)行處理
2.中央控制器調(diào)用 處理器映射器 HandelMapping 查詢 Handel
3.處理器映射處理完畢后会钝,返回Handel 以及 HandelExcutionChain(攔截器鏈)
4.中央控制器調(diào)用 處理器適配器 執(zhí)行Handle
5.處理適配器調(diào)用真正的Handel執(zhí)行
6.Handle執(zhí)行完畢后,返回ModelAndView
7.處理器適配器ModelAndView返回給中央控制器
8.中央控制器調(diào)用視圖解析器查詢具體的View
9.視圖解析器返回真正的View 地址
10.中央控制器調(diào)用View 執(zhí)行 數(shù)據(jù)模型的 渲染
11.響應(yīng)請(qǐng)求

總結(jié):

  • 玩 springmvc 要配置好 一中心(dispatcherServlet) 三器(HandelMapping工三、 HandelApater 迁酸、 ViewResoler)但是一中心要在web.xml 文件配置 、 三器沒有特殊需求的時(shí)候可以不配俭正,三器在springmvc 配置文件中配置奸鬓,但是視圖解析器要顯示去配置一下(原因視圖的位置將來不確定)
  • 為什么三器不用配置:前端控制器dispatcherServlet 在創(chuàng)建完成后會(huì)自動(dòng)加載dispatcherServlet.properties 文件,在該文件中就已經(jīng)配置了相應(yīng)的三器的實(shí)現(xiàn)掸读,如果在springmvc.xml 配置文件中顯示的配置了默認(rèn)的三器串远,就會(huì)覆蓋默認(rèn)的配置
  • 程序員:只需要編寫View Handel

5.@RequestParam映射請(qǐng)求參數(shù)

  • 該注解用于映射請(qǐng)求參數(shù)

  • 該注解中的value 屬性 用于匹配http 請(qǐng)求過來的參數(shù)的名字

  • 該注解中的required 屬性用于限定請(qǐng)求是否必須攜帶參數(shù),默認(rèn)是true

  • 注解中的defaultValue 屬性用于沒有攜帶請(qǐng)求參數(shù)的時(shí)候儿惫,給方法變量賦默認(rèn)值

  • 可以利用 Controller 動(dòng)作類方法的簽名的方式來獲取請(qǐng)求參數(shù)值澡罚,保證頁面參數(shù)的名稱要跟方法中的形參名稱一致,如果方法形參為POJO 類型肾请,要保證頁面參數(shù)的名稱要跟方法中形參POJO中的屬性名稱一致留搔,滿足以上規(guī)則可以接收頁面數(shù)據(jù)

  • 處理頁面數(shù)據(jù)中文亂碼問題
    在 web.xml 應(yīng)用描述文件中配置

    <!-- 引入spring 提供的 POST 提交方式的中文亂碼過濾器 :注意一點(diǎn) 提供的 中文亂碼過濾器只能處理 POST -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • RestFul風(fēng)格的模板URL 攜帶參數(shù)方式:方便后期做網(wǎng)站的SEO優(yōu)化
    獲取模板參數(shù)使用 @PathVariable
@RequestMapping(value="m4/{id}",method=RequestMethod.GET)
public String m4 (@PathVariable(value="id") String id) {
    System.out.println(id);
    return "ok";
}
  • forward指令和redirect指令

forward指令:可以實(shí)現(xiàn)視圖的轉(zhuǎn)發(fā)以及動(dòng)作的轉(zhuǎn)發(fā)
redirect 指令:可以實(shí)現(xiàn)視圖的重定向以及動(dòng)作的重定向

指令的格式:
forward:/xxx.jsp
redirect :/xxx.jsp
如果Handler 方法執(zhí)行完畢后返回的字符串帶有forward 或者redirect ,視圖解析器就會(huì)另外處理铛铁,不會(huì)在返回的字符串前后加前綴和后綴

6.Springmvc 提供的隱式對(duì)象

  • 隱式對(duì)象:不需要程序員自己創(chuàng)建的對(duì)象隔显,springmvc 自動(dòng)會(huì)創(chuàng)建的對(duì)象却妨。拿來就使用
  • 框架提供的隱式對(duì)象:ModelAndView 、 Model 括眠、 ModelMap 彪标、 Map ,HttpServletRequest掷豺、HttpServletResponse等對(duì)象可以把數(shù)據(jù)放入到模型中捐下,自動(dòng)的放入到請(qǐng)求域中
    擴(kuò)展:
    框架還可以自動(dòng)注入 HttpSession 、 HttpServletRequest 萌业、 HttpServletResponse 等
  • 利用 框架提供的 隱式對(duì)象來完成數(shù)據(jù)向頁面?zhèn)鬟f
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奸柬,隨后出現(xiàn)的幾起案子生年,更是在濱河造成了極大的恐慌,老刑警劉巖廓奕,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抱婉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桌粉,警方通過查閱死者的電腦和手機(jī)蒸绩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铃肯,“玉大人患亿,你說我怎么就攤上這事⊙罕疲” “怎么了步藕?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挑格。 經(jīng)常有香客問我咙冗,道長(zhǎng),這世上最難降的妖魔是什么漂彤? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任雾消,我火速辦了婚禮,結(jié)果婚禮上挫望,老公的妹妹穿的比我還像新娘立润。我一直安慰自己,他們只是感情好媳板,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布范删。 她就那樣靜靜地躺著,像睡著了一般拷肌。 火紅的嫁衣襯著肌膚如雪到旦。 梳的紋絲不亂的頭發(fā)上旨巷,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音添忘,去河邊找鬼采呐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搁骑,可吹牛的內(nèi)容都是我干的斧吐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仲器,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼煤率!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乏冀,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蝶糯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辆沦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼捍,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年肢扯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妒茬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔚晨,死狀恐怖乍钻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铭腕,我是刑警寧澤团赁,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站谨履,受9級(jí)特大地震影響欢摄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笋粟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一怀挠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧害捕,春花似錦绿淋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春裁赠,著一層夾襖步出監(jiān)牢的瞬間殿漠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工佩捞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绞幌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓一忱,卻偏偏與公主長(zhǎng)得像莲蜘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帘营,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容