天天看點

2021-09-19 SpringMVC入門SpringMVC入門

文章目錄

  • SpringMVC入門
    • 1 Spring內建web環境
      • 偶遇bug: 監聽器啟動失敗
    • 2 SpringMVC簡介
      • 2.1 SpringMVC簡介
      • 2.2 SpringMVC入門步驟
      • 2.3 SpringMVC快速入門
      • 再遇bug:
    • 3 SpringMVC元件解析
      • 3.1 SpringMVC元件解析
        • SpringMVC相關元件
        • SpringMVC配置和注解

SpringMVC入門

1 Spring內建web環境

建立spring_mvc的maven項目子產品

添加依賴(2021-09-19 Spring5 IoC與DI注解開發的基礎上添加此依賴)

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>8.0.1</version>
</dependency>
           

添加web環境

2021-09-19 SpringMVC入門SpringMVC入門

web配置檔案位置

2021-09-19 SpringMVC入門SpringMVC入門

web項目部署位置

2021-09-19 SpringMVC入門SpringMVC入門

将指定web項目打成war包

2021-09-19 SpringMVC入門SpringMVC入門

配置Tomcet

2021-09-19 SpringMVC入門SpringMVC入門

部署war包

2021-09-19 SpringMVC入門SpringMVC入門

首頁

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
<h1>Hello</h1>

<script></script>
</body>
</html>
           

web配置檔案(配置Servlet Filter Listerner)

<?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>userServlet</servlet-name>
        <servlet-class>com.raphuscucullatus.web.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>

</web-app>
           

servlet檔案

package com.raphuscucullatus.web;

import com.raphuscucullatus.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author raphus cucullatus
 * @version 2021/9/19 2:49
 * @since JDK8
 */
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)classPathXmlApplicationContext.getBean("userService");
        userService.save();
    }

}
           

測試

啟動伺服器後,在浏覽器通路http://localhost:8080/spring_mvc/userServlet 檢測環境是否正常

偶遇bug: 監聽器啟動失敗

原因:如下依賴的jar包不在war包中,導緻tomcat無法啟動監聽器

org.springframework.web.context.ConfigurableWebApplicationContext

2021-09-19 SpringMVC入門SpringMVC入門

解決:删除Spring_mvc:war exploded包,并重新添加war包

2 SpringMVC簡介

2.1 SpringMVC簡介

SpringMVC 是一種基于 Java 的實作 MVC 設計模型的請求驅動類型的輕量級 Web 架構,屬于SpringFrameWork 的後續産品,已經融合在 Spring Web Flow 中。

SpringMVC 已經成為目前最主流的MVC架構之一,并且随着Spring3.0 的釋出,全面超越 Struts2,成為最優秀的 MVC 架構。它通過一套注解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實作任何接口。同時它還支援 RESTful 程式設計風格的請求。

2.2 SpringMVC入門步驟

2021-09-19 SpringMVC入門SpringMVC入門

2.3 SpringMVC快速入門

需求:用戶端發起請求,伺服器端接收請求,執行邏輯并進行視圖跳轉。

開發步驟:

① 導入SpringMVC相關坐标 (pom.xml)

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

② 配置SpringMVC控制器DispathcerServlet (index.xml)

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
           

③ 建立Controller類和視圖頁面 ④ 使用注解配置Controller類中業務方法的映射位址

controller

package com.raphuscucullatus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author raphus cucullatus
 * @version 2021/9/20 5:18
 * @since JDK8
 */
@Controller
@RequestMapping("/user")
public class UserController {
	//params = {"userName"} :表示請求參數必須有userName
    @RequestMapping(value = "/quick",method = RequestMethod.GET,params = {"userName"})
    public String save(){
        System.out.println("Controller save running...");
        //請求轉發(不加字首"../success.jsp"預設作為請求轉發位址,且通路位址為相對于該類/user目錄下的資源 )
//        return "forward:../success.jsp";
        //重定向
        return "redirect:../success.jsp";
    }

}

           

視圖

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>跳轉成功</h1>

<script></script>
</body>
</html>
           

⑤ 配置SpringMVC核心檔案 spring-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: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/context http://www.springframework.org/schema/context/spring-context.xsd"
>
    <!--  Controller的元件掃描  -->
<!--    <context:component-scan base-package="com.raphuscucullatus.controller"/>-->
    <!--
        base-package="com.raphuscucullatus" 對com.raphuscucullatus包掃描
        include-filter 過濾器(找到滿足條件的)
        exclude-filter 過濾器(排除滿足條件的)
        type="annotation" 通過注解過濾
        expression="org.springframework.stereotype.Controller 過濾條件 過濾含有該注解的類
    -->
    <context:component-scan base-package="com.raphuscucullatus">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component"/>
    </context:component-scan>
</beans>
           

⑥ 用戶端發起請求測試

2021-09-19 SpringMVC入門SpringMVC入門

再遇bug:

public String save(){
        System.out.println("Controller save running...");
        //請求轉發(不加字首"../success.jsp"預設作為請求轉發位址,且通路位址為相對于該類/user目錄下的資源 )
//        return "forward:../success.jsp";
//        return "forward:../other.jsp";
        return "/html/success.jsp";
        //重定向
//        return "redirect:../success.jsp";
    }
           

在測試時更換傳回的資源uri時(webapp頁建立了相應的目錄和.jsp檔案),浏覽器一直404,但是控制台有輸出"Controller save running…"語句

說明項目資源沒有更新到部署到服務期内(由于我的idea中配置了多個版本的Tomcat,更換版本後配置沒有更改導緻出現該Bug)

還沒解決就需要删除war包重新導入war包了

2021-09-19 SpringMVC入門SpringMVC入門

3 SpringMVC元件解析

3.1 SpringMVC元件解析

2021-09-19 SpringMVC入門SpringMVC入門

SpringMVC相關元件

  1. 前端控制器: DispatcherServlet

    使用者請求到達前端控制器,它就相當于 MVC 模式中的 C, DispatcherServlet 是整個流程控制的中心,由它調用其它元件處理使用者的請求, DispatcherServlet 的存在降低了元件之間的耦合性。

  2. 處理器映射器: HandlerMapping

    HandlerMapping 負責根據使用者請求找到 Handler 即處理器, SpringMVC 提供了不同的映射器實作不同的映射方式,例如:配置檔案方式,實作接口方式,注解方式等。

  3. 處理器擴充卡: HandlerAdapter

    /通過 HandlerAdapter 對處理器進行執行,這是擴充卡模式的應用,通過擴充擴充卡可以對更多類型的處理器進行執行

  4. 處理器: Handler

    它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把使用者請求轉發到 Handler。由

    Handler 對具體的使用者請求進行處理。

  5. 視圖解析器: View Resolver

    View Resolver 負責将處理結果生成 View 視圖, View Resolver 首先根據邏輯視圖名解析成實體視圖名,即

    具體的頁面位址,再生成 View 視圖對象,最後對 View 進行渲染将處理結果通過頁面展示給使用者。

  6. 視圖: View

    SpringMVC 架構提供了很多的 View 視圖類型的支援,包括: jstlView、 freemarkerView、 pdfView等。最

    常用的視圖就是 jsp。一般情況下需要通過頁面标簽或頁面模版技術将模型資料通過頁面展示給使用者,需要由程

    序員根據業務需求開發具體的頁面

SpringMVC配置和注解

請求映射注解:

視圖解析器的配資(在spring-mvc.xml中配置)

<!--
配置内部資源視圖解析器
對controller傳回字元串進行配置前字尾,例
不配置:return "/jsp/success.jsp";
配置後:return "success";
-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
           

url基礎視圖解析器

public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered
    /**
    指定重定向 URL 的特殊視圖名稱的字首(通常在送出和處理表單後指向控制器)。 
    此類視圖名稱不會以配置的預設方式解析,而是被視為特殊快捷方式
    */
    public static final String REDIRECT_URL_PREFIX = "redirect:";

    /**
    指定轉發 URL 的特殊視圖名稱的字首(通常在送出和處理表單後指向控制器)。 
    此類視圖名稱不會以配置的預設方式解析,而是被視為特殊快捷方式
     */
    public static final String FORWARD_URL_PREFIX = "forward:";
           
public String save(){
        System.out.println("Controller save running...");
        //請求轉發(不加字首"../success.jsp"預設作為請求轉發位址,且通路位址為相對于該類/user目錄下的資源 )
        return "/html/success.jsp";
        //重定向
//        return "redirect:../success.jsp";
    }