day17-Spring MVC基礎(chǔ)(千峰逆戰(zhàn))

<meta charset="utf-8">

Spring MVC基礎(chǔ)

Spring MVC是基于Model 2實(shí)現(xiàn)的技術(shù)框架扎唾,Model 2是經(jīng)典的MVC模型在web應(yīng)用中的變體每强。model 1的開發(fā)模式是:jsp+javabean的模式通贞,它的核心是jsp頁面寥闪。model 2的開發(fā)模式是:jsp+servlet+javabean的模式材失。

一敬飒、運(yùn)行原理

用戶發(fā)起請求后邪铲,由前端控制器DispatcherServlet接受用戶請求響應(yīng),然后前端可控制性請求查找Handler无拗,處理器映射器HandleMapper收到請求后通過xml或者注解带到,根據(jù)url找到對應(yīng)的Handler(也就是Controller),找到之后前端控制器請求處理器適配器去執(zhí)行Handler英染,處理器適配器調(diào)用處理器Handler的方法執(zhí)行揽惹,返回ModelAndView,處理器適配器拿到ModelAndView后返回給前端控制器四康,前端控制器拿到ModelAndView后請求視圖解析器去解析搪搏,解析完成之后將View返回給前端控制器,前端控制器將View進(jìn)行渲染之后展示給用戶箭养。具體流程如下圖所示:

image

二慕嚷、開發(fā)步驟

1、引入依賴

添加依賴spring-webmvc毕泌,添加依賴后會添加八個(gè)jar包:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

2喝检、配置web.xml

在web.xml中配置一個(gè)servlet與對應(yīng)的類:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

init-param標(biāo)簽指定了上下文配置路徑,讓所有的請求都交給了DispatcherServlet撼泛,而DispatcherServlet里面需要配置一個(gè)contextConfigLocation挠说,上下文配置路徑,也就是我們的SpringMVC的配置文件愿题。如果沒有顯式地配置該屬性损俭,SpringMVC會在默認(rèn)WEB-INF下去找[servlet-name]-servlet.xml文件蛙奖。上面這種配置就是在resources目錄下尋找spring-mvc.xml。

3杆兵、配置Spring MVC配置文件

在這一步有兩種實(shí)現(xiàn)方式雁仲,一種是實(shí)現(xiàn)接口的方式,另一種是使用注解的方式琐脏,兩種方式配置的xml文件有所不同攒砖,但也有共同點(diǎn),比如配置視圖解析器

  • 實(shí)現(xiàn)接口:

    <?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:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <bean name="/ProductInput" class="com.qfedu.controller.ProductInputController"/>
        <bean name="/ProductDetail" class="com.qfedu.controller.ProductDetailController"/>
        <mvc:default-servlet-handler />
    </beans>
    
    

第一個(gè)bean配置視圖解析器日裙,可以分別分別指定前綴與后綴吹艇,在虛擬視圖前與后拼接字符串,去請求指定的資源昂拂。第二個(gè)與第三個(gè)bean配置servlet受神,當(dāng)用戶請求指定url的時(shí)候就是去請求這個(gè)對應(yīng)的類。使用name而不是id是因?yàn)閕d不能包含特殊字符格侯。最后一個(gè)mvc標(biāo)簽設(shè)置了默認(rèn)的servlet-handler鼻听,用于請求靜態(tài)資源。

  • 使用注解:

    <?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:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"/>
        </bean>
        <context:component-scan base-package="com.innovation"/>
        <mvc:default-servlet-handler />
        <mvc:annotation-driven/>
    </beans>
    
    

最后一個(gè)標(biāo)簽指定使用注解养交,如果不加就掃描不到精算,訪問非靜態(tài)資源時(shí)就會出現(xiàn)404.

4、創(chuàng)建controller包及控制類

  • 實(shí)現(xiàn)接口

    package com.qfedu.controller;
    
    import com.qfedu.bean.Product;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ProductDetailController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            String spid = httpServletRequest.getParameter("pid");
            String pname = httpServletRequest.getParameter("pname");
            String sprice = httpServletRequest.getParameter("price");
            String image = httpServletRequest.getParameter("image");
    
            int pid = spid == null||"".equals(spid.trim())?0:Integer.parseInt(spid);
    
            double price = sprice == null||"".equals(sprice.trim())?0.0:Double.parseDouble(sprice);
    
            Product p = new Product(pid,pname,price,image);
            //返回viewName碎连,將對象與對象名放入request域中
            return new ModelAndView("product","product",p);
        }
    }
    
    

創(chuàng)建的新的controller類需要實(shí)現(xiàn)Controller接口然后重寫handleRequest方法灰羽,這個(gè)方法接收HttpServletRequest與HttpServletResponse參數(shù),返回一個(gè)ModelAndView鱼辙,這個(gè)ModelAndView對象可以放需要轉(zhuǎn)發(fā)到的虛擬的視圖廉嚼,還可以向request域中添加屬性。

  • 使用注解:

    npackage com.innovation.controller;
    
    import com.innovation.bean.Employee;
    import com.innovation.service.IEmployeeService;
    import com.innovation.service.impl.EmployeeServiceImpl;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    @Controller
    public class EmployeeController {
        private IEmployeeService service = new EmployeeServiceImpl();
        @RequestMapping("/employees")
        public String getEmployeesPage(Model model){
            List<Employee> list = service.getAllEmployees();
            model.addAttribute("list",list);
            return "employees.jsp";
        }
        @RequestMapping("/employeeInfo")
        public String getEmployById(HttpServletRequest request,Model model){
            String eid = request.getParameter("eid");
            int id = eid==null?-1:Integer.parseInt(eid);
            Employee e = service.getEmployeeById(id);
            model.addAttribute("employee",e);
            return "employeeInfo.jsp";
        }
    }
    
    

使用注解的方式更為簡單倒戏,只需要在類名前加上@Controller怠噪,這樣在包掃描的時(shí)候就會掃描到,然后再每個(gè)方法前加上@RequestMapping注解杜跷,用于指定匹配的url傍念,這個(gè)url必須全局唯一。每個(gè)方法可以添加參數(shù)葛闷,也可以不加參數(shù)憋槐,既可以加一個(gè)參數(shù),也可以加兩個(gè)參數(shù)淑趾,Model阳仔、HttpSession、HttpServletRequest等類型的參數(shù)都可以作為形參扣泊。上面的兩個(gè)方法返回值都是字符串近范,指定需要轉(zhuǎn)發(fā)的頁面嘶摊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市评矩,隨后出現(xiàn)的幾起案子叶堆,更是在濱河造成了極大的恐慌,老刑警劉巖稚照,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹂空,死亡現(xiàn)場離奇詭異,居然都是意外死亡果录,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門咐熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弱恒,“玉大人,你說我怎么就攤上這事棋恼》档” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵爪飘,是天一觀的道長义起。 經(jīng)常有香客問我,道長师崎,這世上最難降的妖魔是什么默终? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮犁罩,結(jié)果婚禮上齐蔽,老公的妹妹穿的比我還像新娘。我一直安慰自己床估,他們只是感情好含滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丐巫,像睡著了一般谈况。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上递胧,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天碑韵,我揣著相機(jī)與錄音,去河邊找鬼谓着。 笑死泼诱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赊锚。 我是一名探鬼主播治筒,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼屉栓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耸袜?” 一聲冷哼從身側(cè)響起友多,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤框,沒想到半個(gè)月后域滥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈抓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年启绰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沟使。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡委可,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腊嗡,到底是詐尸還是另有隱情着倾,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布燕少,位于F島的核電站卡者,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏客们。R本人自食惡果不足惜崇决,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镶摘。 院中可真熱鬧嗽桩,春花似錦、人聲如沸凄敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涝缝。三九已至扑庞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拒逮,已是汗流浹背罐氨。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滩援,地道東北人栅隐。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親租悄。 傳聞我的和親對象是個(gè)殘疾皇子谨究,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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

  • Spring MVC基礎(chǔ) Spring MVC是基于Model 2實(shí)現(xiàn)的技術(shù)框架,Model 2是經(jīng)典的MVC模型...
    拼搏男孩閱讀 185評論 0 0
  • SpringMVC介紹 Spring web mvc 和Struts2都屬于表現(xiàn)層的框架泣棋,它是Spring框架的一...
    day_Sunny閱讀 745評論 0 0
  • 16. Web MVC 框架 16.1 Spring Web MVC 框架介紹 Spring Web 模型-視圖-...
    此魚不得水閱讀 1,026評論 0 4
  • 對于java中的思考的方向胶哲,1必須要看前端的頁面,對于前端的頁面基本的邏輯潭辈,如果能理解最好鸯屿,不理解也要知道幾點(diǎn)。 ...
    神尤魯?shù)婪?/span>閱讀 806評論 0 0
  • Spring MVC是基于Model 2實(shí)現(xiàn)的技術(shù)框架把敢,Model 2是經(jīng)典的MVC模型在web應(yīng)用中的變體寄摆。 m...
    低調(diào)的灬攻城獅閱讀 127評論 0 3