SpringMVC快速入門,搭建SpringMVC開發環境

三層架構與MVC

三層架構

  • 表現層(web層):和客戶端進行數據交互,表現層一般會採用MVC設計模型
  • 業務層(service層):處理公司具體的業務邏輯。
  • 持久層(dao層):操作數據庫。

MVC模型

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。

  • Model:數據模型,JavaBean的類,用來進行數據封裝。
  • View:指JSP、HTML用來展示數據給用戶。
  • Controller:用來接收用戶的請求,是整個流程的控制器,用來進行數據校驗等。

SpringMVC概述

SpringMVC是一種基於Java實現的MVC設計模型的請求驅動類型的輕量級WEB框架。SpringMVC屬於表現層框架(在三層架構中的位置)。

回顧:Servlet總結

在不使用框架之前,前端發送一個請求就對應寫一個Servlet,通過網頁驅動服務器端的Java程序,在網頁上顯示Java程序返回的數據。

如web3.0以前的版本,使用web.xml配置Servlet:

定義一個類,繼承HttpServlet 重寫doGet 和 doPost,註冊配置該Servlet

  • DemoXMLServlet
public class DemoXMLServlet extends javax.servlet.http.HttpServlet {
    @Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        response.getWriter().print("hello-DemoXMLServlet");
        System.out.println("訪問了DemoXMLServlet");
    }

    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
            this.doPost(request,response);
    }
}
  • 註冊配置Servlet :告訴服務器,我們的應用有這個servlet
    <!-- 【使用web.xml配置一個Servlet】
    聲明一個Servlet,向tomcat聲明, 這個應用裏面有這個servlet,
     名字叫做HelloServlet , 具體的路徑是com.mycode01.servlet.HelloServlet-->
    <servlet>
        <!-- 爲Servlet指定一個名稱,以便於引用 -->
        <servlet-name>DemoXMLServlet</servlet-name>
        <!-- 註冊Servlet實現類的全類名 -->
        <servlet-class>com.mycode.servlet.DemoXMLServlet</servlet-class>
    </servlet>

    <!-- 建立一個從虛擬路徑到Servlet之間的映射關係 -->
    <servlet-mapping>
        <!-- 引用Servlet名稱 -->
        <servlet-name>DemoXMLServlet</servlet-name>
        <!-- 映射到Servlet的虛擬路徑:“/HelloServlet” -->
        <url-pattern>/xMLServlet</url-pattern>
    </servlet-mapping>

大概執行過程是這樣的:
0.用戶發送請求,根據url找到Tomcat應用下的該項目
1.找web.xml, 查找是否有url-pattern的內容是/xMLServlet
2. 如果有url-pattern的內容是/xMLServlet,便找到對應servlet-mapping中的那個servlet-name(DemoXMLServlet)
3.再找到servlet元素中的servlet-name(DemoXMLServlet),找到下面定義了的servlet-class,然後反射創建該類的對象,並執行該類的相應方法。

SpringMVC快速入門案例

在這裏插入圖片描述

1.引入依賴

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- 版本鎖定 -->
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
      <!--Spring依賴-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <!--SpringMVC依賴-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <!--ServletAPI依賴-->
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
      </dependency>
  </dependencies>

2.在web.xml配置文件中配置SpringMVC核心控制器(DispatcherServlet)

<?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">
    
        <!-- SpringMVC的核心控制器 -->
        <servlet>
            <!-- 爲Servlet指定一個名稱,以便於引用 -->
            <servlet-name>dispatcherServlet</servlet-name>
            <!-- 註冊Servlet實現類的全類名 -->
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置Servlet的初始化參數,讀取springmvc的配置文件,創建spring容器 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- 配置servlet啓動時加載對象
              啓動加載優先級,讓Servlet 提前創建實例
              Tomcat一啓動,立刻調用dispatcherServlet的init方法,創建WebApplicationContext(SpringMVCIOC容器)
             -->
            <load-on-startup>1</load-on-startup>
        </servlet>

        <!--  映射攔截配置
            /:表示所有請求都將被dispatcherServlet(SpringMVC核心控制器)攔截
        -->
        <servlet-mapping>
            <!-- 引用Servlet名稱 -->
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
</web-app>

3.提供SpringMVC核心控制器初始化參數時讀取的springmvc.xml配置文件

SpringMVC核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       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.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置spring創建容器時要掃描的包 :識別對應註解,如使用@Controller等創建對象的註解,則就會給對象生成一個實例,並給SpringMVCIOC容器管理-->
    <context:component-scan base-package="com.mycode.controller"></context:component-scan>

   <!-- 配置spring開啓註解mvc的支持  (註解驅動)-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!-- 配置視圖解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

4.測試配置

  • HelloController控制器類(相當於以前的寫的Servlet)
/*@Controller  創建HelloController對象實例,並將實例對象交給SpringMVCIOC容器管理。
	web.xml配置了load-on-startup程序啓動就創建了SpringMVCIOC容器,
	springmvc.xml配置了包掃描,使用@Controller等創建對象的註解,則就會給對象(控制器)生成一個實例,並給SpringMVCIOC容器管理
*/
@Controller 
public class HelloController {
    //接收請求   http://localhost:8080/hello
    @RequestMapping(path="/hello")  //建立請求URL和處理方法之間的對應關係
    public String sayHello() {
        System.out.println("Hello SpringMVC");
        //跳轉頁面
        return "login";
    }
}

  • WEB-INF目錄下創建pages文件夾,編寫login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>你已入門啦</h3>
</body>
</html>
  • 訪問:http://localhost:8080/hello
    在這裏插入圖片描述
    大概執行過程:
  1. 當啓動Tomcat服務器的時候,因爲配置了load-on-startup標籤,所以會提前創建DispatcherServlet對象,並加載springmvc.xml配置文件, 配置開啓了註解掃描,那麼HelloController對象就會被創建。
  2. 前端發送請求,請求會先到達DispatcherServlet核心控制器,根據配置@RequestMapping註解找到執行的具體方法。
  3. 根據執行方法的返回值,再根據配置的視圖解析器,去指定的目錄下查找指定名稱的JSP文件,再通過Tomcat服務器渲染頁面,做出響應

RequestMapping註解詳解

  • 作用:建立請求URL和處理方法之間的對應關係。如RequestMapping的value與請求URL相對應,則執行當前註解標註的方法。
  • 作用位置
    1. 類上:請求 URL 的第一級訪問目錄,需要以/開頭。如不寫,默認是應用的根目錄。目的是爲了使我們的 URL 可以按照模塊化管理
    2. 方法上:請求 URL 的第二級訪問目錄。

如:處理請求路徑 http://localhost:8080/ssm/springmvc

@Controller
@RequestMapping(value = "/ssm")
public class HelloController {
	   @RequestMapping(value = "/springmvc")
	   public String sayHello() {
	       System.out.println("Hello SpringMVC!!");
	       return "login";
	   }
}

注: http://localhost:8080可以省略不寫

  • 屬性
    1. pathvalue屬性:value屬性和path屬性是一樣的,用來指定請求路徑的url。
    2. mthod屬性:指定該方法的請求方式。當請求路徑相同,而method屬性的值不一樣,如果是RequestMethod.GET,則只能以get方式請求(即請求路徑相同,請求方式爲get方式,則執行的是mthod屬性是RequestMethod.GET註解下的方法),如果是RequestMethod.POST,則只能以post方式請求。 擴展,RESTful編程風格的規範之一:一個路徑代表一個資源,通過不同提交方式識別不同操作。
    3. params屬性:指定 限制請求參數 的條件。
    4. headers 屬性:發送的請求中必須包含的請求頭
/*params參數:
       "name":表示請求必須包含name參數
       "!sex":表示請求不能包含sex參數
       "age=18":表示請求參數中的age參數必須爲18
       ......
       .....
*/
@RequestMapping(params = {"name","!sex","age=18"},value = "/ssm")
public String helloParams() {
    return "index";
}
/* headers參數:
      "Accept":表示請求頭必須包含Accept頭信息
      "Accept-Encoding!=zh-CN":表示請求頭中Accept-Encoding頭信息的值不能爲zh-CN
      ...
      ...
 */
@RequestMapping(headers = {"Accept","Accept-Encoding!=zh-CN"},value = "/ssm")
public String helloHeaders() {
    return "index";
}

springmvc.xml配置文件中配置 視圖解析器 的作用

配置視圖解析器後,可以直接返回 邏輯視圖名 即可跳轉到相應頁面。

    <!-- 配置視圖解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

在這裏插入圖片描述

@Controller
public class UserController {
    @RequestMapping(value = "/ssm")
    public String hello(){
        /*配置視圖解析器後,可以直接返回  邏輯視圖名(頁面名稱)
		
		本來要寫的返回值
        "/WEB-INF/pages/login.jsp"
       
        配置的視圖解析器中
        prefix="/WEB-INF/pages/"
        suffix=".jsp"
       
       	去掉前綴 後綴 直接返回邏輯視圖名
        */
        return  "login";  
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章