1. 程式人生 > >SpringMVC入門學習(一)

SpringMVC入門學習(一)

SpringMVC入門學習(一)

ssm框架  spring 

SpringMVC是一個Java WEB框架,現在我們知道Spring了,那麼,何為MVC呢?

MVC是一種設計模式,其分為3個方面

  • model 模型:dao層和service層
  • view 檢視:例如jsp和Html
  • controller 控制器

SpringMVC原理

SpringMVC工作的原理圖如下【圖來自於網路,侵刪】:

 


 

 

過程如下:

  1. http請求:客戶端提交請求到DispatcherServlet。

  2. 尋找處理器:DispatcherServlet是一個Spring提供的前端控制器,所有請求都是他來發放的。但是它需要HandlerMapping定位到具體的Controller。

  3. 呼叫處理器:在DispatcherServlet通過HandlerMapping找到控制器後,它就將http請求提交到Controller。

  4. 呼叫模型處理業務:Controller執行相關的邏輯程式碼。

  5. ModelAndView:在Controller執行完相關的處理後,返回ModelAndView。

  6. 處理檢視對映:ViewResolver是檢視解析器,將一個邏輯上面的檢視名稱機械為一個真正的檢視同時取出model。(ps:例如:將user解析為:/WEB-INF/jsp/user.jsp【下面的例子】)

  7. 將模型資料傳給View顯示:將model資料放入view中。

環境搭建配置

  1. 首先使用maven包快速構建web-app

     


     

     

    專案結構圖:

     


     

     

  2. maven jar包匯入:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.1.RELEASE</version>
    </dependency>
    
  3. 然後將web.xml檔案進行更改,使用3.1的版本:

    <?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_3_1.xsd"
            version="3.1">
    </web-app>
    
  4. 配置web.xml檔案

    首先,先配置前段控制器

    <!-- 配置 Spring MVC DispatchcerServlet 前端控制器
        這裡寫的這個名字是有講究的,如果我們不去修改spring配置檔案預設的位置,那麼SpringMVC他會去WEB-INF下面找一個叫springmvc-servlet.xml的檔案
    -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--<init-param>-->
        <!--可以重新宣告配置檔案的名字-->
        <!--<param-name>namespace</param-name>-->
        <!--將名字變成mvc-->
        <!--<param-value>mvc</param-value>-->
        <!--</init-param>-->
    
        <init-param>
            <!--上下文配置的位置的制定-->
            <param-name>contextConfigLocation</param-name>
            <!--此時是在類路徑下面spring資料夾去尋找,也就是resources/spring-->
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>
    

    然後進行對映配置:

    在web.xml檔案中,進行對映配置

    <!--servlet的對映配置-->
    <servlet-mapping>
        <!-- 將所有的請求都交給springmvc處理,即處理方式在springmvc.xm文      件中
        -->
        <servlet-name>springmvc</servlet-name>
        <!--這裡統一寫/-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    關於url-pattern的寫法問題

    • / 處理所有的請求,但是他不會像/*一樣,將這個girl.jsp當成一個新的請求,而是直接將渲染結果給瀏覽器
    • /* (永遠不要這樣寫):請求/helloController過去的時候,他的檢視名稱是girl,girl.jsp頁面,(出去的時候)它將其當成了一個叫做girl.jsp的請求,去嘗試請求對應的controller
    • *.do 例如:/helloController.do

    關於前段控制器的解釋:

    springMVC設定的理念是希望我們開發者遠離原生的servletAPI【太繁瑣了】,希望將操作儘量簡化。它將很多東西責任進行了拆分。不希望我們將技術點繫結死,可以做到任意切換。其本身還是基於servlet設計的,分發的servlet。

  5. 配置springmvc.xml檔案
    springmvc.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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    </beans>
    

    首先先配置檢視解析器和控制器:

    <!--配置一個檢視解析器
        常用內部資源檢視解析器
        這裡面的意思是:加入此時viewName為hello,那麼它會到WEB-INF/jsp/hello.jsp中去尋找
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--1. 字首-->
        <property name="prefix" value="/jsp/"/>
        <!--2. 字尾-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 註解掃描 -->
    <context:component-scan base-package="com.weno.controller"/>
    

書寫第一份程式碼

Controller的寫法有兩種:

  • 介面式的寫法:是一個傳統式的寫法,類implement一個介面,然後實現介面方法,在modle中填充元素,返回ModelAndView。

    public class HelloController implements org.springframework.web.servlet.mvc.Controller {
        @Override
        public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
    
            ModelAndView mav = new ModelAndView();
            mav.addObject("hello","世界");
            // 尋找web-inf目錄下的jsp/hello.jsp檔案
            mav.setViewName("hello");
            return mav;
        }
    }
    

    當然這種方法還要在springmvc中配置bean。

    <!-- 此時name相當於URI -->
    <bean class="com.weno.controller.HelloController" name="/hello"/>
    
  • 註解式寫法:註解式寫法要配置註冊掃描【前面已經配置】。

    將前面的換一種寫法:

    @org.springframework.stereotype.Controller
    public class HelloController {
        //URI
        @RequestMapping("hello")
        public String hello(Model model){
            model.addAttribute("hello","世界");
            // 尋找web-inf目錄下的jsp/hello.jsp檔案
            return "hello";
        }
    }
    

    jsp檔案

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    你好:${requestScope.hello}
    
    </body>
    </html>
    

    結果:

簡單的注意點

  • @RequestMapping可以同時寫在類的上面【模組】和方法的上面【業務】
    @org.springframework.stereotype.Controller
    @RequestMapping("product")
    public class HelloController {
        @RequestMapping("add")
        public String add(Model model){
    
            return "";
        }
        @RequestMapping("del")
        public String del(Model model){
    
            return "";
        }
    }
    
    這時候就可以使用/product/add完成add方法執行,/product/del完成del方法執行,這樣更好的有利於模組化的執行。