SpringMVC筆記

少侠gqk發表於2024-06-07

1 SpringMVC簡介和體驗

1.1 SpringMVC簡介

Spring Web MVC是基於Servlet API構建的原始Web框架,從一開始就包含在Spring Framework中。正式名稱“Spring Web MVC”來自其源模組的名稱( spring-webmvc ),但它通常被稱為“Spring MVC”。

在控制層框架歷經Strust、WebWork、Strust2等諸多產品的歷代更迭之後,目前業界普遍選擇了SpringMVC作為Java EE專案表述層開發的首選方案。之所以能做到這一點,是因為SpringMVC具備如下顯著優勢:

- Spring 家族原生產品,與IOC容器等基礎設施無縫對接
- 表述層各細分領域需要解決的問題全方位覆蓋,提供全面解決方案
- 程式碼清新簡潔,大幅度提升開發效率
- 內部元件化程度高,可插拔式元件即插即用,想要什麼功能配置相應元件即可
- 效能卓著,尤其適合現代大型、超大型網際網路專案要求

原生Servlet API開發程式碼片段

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                                        throws ServletException, IOException {  
    String userName = request.getParameter("userName");
    
    System.out.println("userName="+userName);
}

基於SpringMVC開發程式碼片段

@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName,Sting password){
    
    log.debug("userName="+userName);
    //呼叫業務即可
    
    return "result";
}

1.2 核心元件和呼叫流程(面試題)

Spring MVC與許多其他Web框架一樣,是圍繞前端控制器模式設計的,其中 中央控制器 Servlet DispatcherServlet 做整體請求處理排程!

除了DispatcherServletSpringMVC還會提供其他特殊的元件協作完成請求處理和響應呈現。

SpringMVC處理請求流程:

SpringMVC涉及元件:

  1. DispatcherServlet(中央控制器) : SpringMVC提供,我們需要使用web.xml配置使其生效,它是整個流程處理的核心,所有請求都經過它的處理和分發![ CEO ]
  2. HandlerMapping(對映器) : SpringMVC提供,我們需要進行IoC配置使其加入IoC容器方可生效,它內部快取handler(controller方法)和handler訪問路徑資料,被DispatcherServlet呼叫,用於查詢路徑對應的handler![秘書]
  3. HandlerAdapter (介面卡): SpringMVC提供,我們需要進行IoC配置使其加入IoC容器方可生效,它可以處理請求引數和處理響應資料資料,每次DispatcherServlet都是透過handlerAdapter間接呼叫handler,他是handler和DispatcherServlet之間的介面卡![經理]
  4. Handler(需要手動自己寫的) : handler又稱處理器,他是Controller類內部的方法簡稱,是由我們自己定義,用來接收引數,向後呼叫業務,最終返回響應結果![打工人]
  5. ViewResovler (檢視解析器): SpringMVC提供,我們需要進行IoC配置使其加入IoC容器方可生效!檢視解析器主要作用簡化模版檢視頁面查詢的,但是需要注意,前後端分離專案,後端只返回JSON資料,不返回頁面,那就不需要檢視解析器!所以,檢視解析器,相對其他的元件不是必須的![財務]

1.3 SpringMVC入門程式

image

  1. 配置Maven

    需要先去下載maven並且配置

    https://maven.apache.org/download.cgi

image

maven的倉庫(修改的是conf下的setting.xml)

<localRepository>E:\software\mvn_repo</localRepository>
D:\software\mvn_repo
表示的是maven的倉庫地址(最終透過maven下載的依賴等 都會儲存在這個位置)

阿里雲映象(修改的是conf下的setting.xml)

<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
使用國內映象下載的更快

Maven整合在idea中

image

image

  1. 建立專案

image

專案結構

少了寫java的地方

image

解決方法:

image

  1. 匯入依賴

    <properties>
        <spring.version>6.0.6</spring.version>
        <servlet.api>9.1.0</servlet.api>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <!-- springioc相關依賴  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    
        <!-- web相關依賴  -->
        <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依賴 -->
        <!--
            在 Spring Web MVC 6 中,Servlet API 遷移到了 Jakarta EE API,因此在配置 DispatcherServlet 時需要使用
             Jakarta EE 提供的相應類庫和名稱空間。錯誤資訊 “‘org.springframework.web.servlet.DispatcherServlet’
             is not assignable to ‘javax.servlet.Servlet,jakarta.servlet.Servlet’” 表明你使用了舊版本的
             Servlet API,沒有更新到 Jakarta EE 規範。
        -->
        <dependency>
            <groupId>jakarta.platform</groupId>
            <artifactId>jakarta.jakartaee-web-api</artifactId>
            <version>${servlet.api}</version>
            <scope>provided</scope>
        </dependency>
    
        <!-- springwebmvc相關依賴  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
    
    </dependencies>
    
  2. Controller宣告

package com.gqk.controller;
   import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
   import org.springframework.web.bind.annotation.ResponseBody;
   /**
    * 此類用來接收客戶端請求和響應客戶端請求的
    */
   @Controller//表示HelloController為控制器
   public class HelloController {
       @RequestMapping("/hello")//表示請求路徑
       @ResponseBody//表示向瀏覽器響應資料
       public String hello(){
           return "hello World!!";
       }
   }
  1. 基於xml註解的方式編寫

    1. 在resources編寫SpringMVC的主配置檔案

      <?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">
          <!--開啟SpringMVC註解-->
          <mvc:annotation-driven />
          <!--掃描包-->
          <context:component-scan base-package="com.gqk.controller"/>
      </beans>
      
    2. 在web.xml中配置前段控制器

       <!--配置SpringMVC的核心控制器DispatcherServlet-->
        <servlet>
          <servlet-name>dispatcherServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!--配置Servlet的初始化引數, 讀取Spring的配置檔案, 建立Spring容器-->
          <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>dispatcherServlet</servlet-name>
          <url-pattern>/</url-pattern>
        </servlet-mapping>
      
  2. 配置Tomcat伺服器(選擇10以上版本)

image

image

image

image

image

啟動tomcat

  1. 測試

image

  1. Spring MVC核心元件配置類(此種方式替換xml的方式)

    不需要編寫上面第5步的操作

    package com.gqk.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.HandlerAdapter;
    import org.springframework.web.servlet.HandlerMapping;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
    
    @EnableWebMvc//開啟註解
    @Configuration//表示此類為配置類
    @ComponentScan(basePackages = "com.gqk.controller")//掃描包
    public class SpringMvcConfig implements WebMvcConfigurer {
        @Bean
        public HandlerMapping handlerMapping(){
            return new RequestMappingHandlerMapping();
        }
    
        @Bean
        public HandlerAdapter handlerAdapter(){
            return new RequestMappingHandlerAdapter();
        }
         @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**").addResourceLocations("/");
        }
    }
    
    
  2. SpringMVC環境搭建

    package com.gqk.config;
    
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    //TODO: SpringMVC提供的介面,是替代web.xml的方案,更方便實現完全註解方式ssm處理!
    //TODO: Springmvc框架會自動檢查當前類的實現類,會自動載入 getRootConfigClasses / getServletConfigClasses 提供的配置類
    //TODO: getServletMappings 返回的地址 設定DispatherServlet對應處理的地址
    public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        /**
         * 指定service / mapper層的配置類
         */
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return null;
        }
    
        /**
         * 指定springmvc的配置類
         * @return
         */
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class<?>[] { SpringMvcConfig.class };
        }
    
        /**
         * 設定dispatcherServlet的處理路徑!
         * 一般情況下為 / 代表處理所有請求!
         */
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    }
    
    
  3. 啟動測試

訪問:http://localhost:8080/hello

image

表示成功

2 SpringMVC接收客戶端資料

2.1 訪問路徑詳解

@RequestMapping註解的作用就是將請求的 URL 地址和處理請求的方式(handler方法)關聯起來,建立對映關係。

SpringMVC 接收到指定的請求,就會來找到在對映關係中對應的方法來處理這個請求。

  1. 精準路徑匹配

    在@RequestMapping註解指定 URL 地址時,不使用任何萬用字元,按照請求地址進行精確匹配。

    @Controller
    public class UserController {
    
        /**
         * 精準設定訪問地址 /user/login
         */
        @RequestMapping(value = {"/user/login"})
        @ResponseBody
        public String login(){
            System.out.println("UserController.login");
            return "login success!!";
        }
    
        /**
         * 精準設定訪問地址 /user/register
         */
        @RequestMapping(value = {"/user/register"})
        @ResponseBody
        public String register(){
            System.out.println("UserController.register");
            return "register success!!";
        }
        
    }
    
    
  2. 模糊路徑匹配

在@RequestMapping註解指定 URL 地址時,透過使用萬用字元,匹配多個類似的地址

@Controller
public class ProductController {

    /**
     *  路徑設定為 /product/*  
     *    /* 為單層任意字串  /product/a  /product/aaa 可以訪問此handler  
     *    /product/a/a 不可以
     *  路徑設定為 /product/** 
     *   /** 為任意層任意字串  /product/a  /product/aaa 可以訪問此handler  
     *   /product/a/a 也可以訪問
     */
    @RequestMapping("/product/*")
    @ResponseBody
    public String show(){
        System.out.println("ProductController.show");
        return "product show!";
    }
}

2.2 附帶請求方式限制

請求方式:客戶端以何種方式傳送的請求 有8中

public enum RequestMethod {
  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

最常用的有兩種:GET、POST

預設情況下:@RequestMapping("/logout") 任何請求方式都可以訪問!

如果需要特定指定:

package com.gqk.controller;

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

@Controller
public class UserController {

    /**
     * value:表示的是請求地址
     * method:指明請求方式
     * 中文亂碼:
     *  解決方法:produces = "text/plain;charset=UTF-8"
     * @return
     */
    @RequestMapping(value ="/login",method = RequestMethod.GET,produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String userLogin(){
        return "我是登入...";
    }
    @RequestMapping(value = "/add",method = RequestMethod.POST,produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String userAdd(){
        return "我是新增...";
    }


}

注意:服務端需要什麼請求,客戶端就安裝什麼請求傳送否則會報錯誤程式碼405

還有 @RequestMapping 的 HTTP 方法特定快捷方式變體:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
@RequestMapping(value="/login",method=RequestMethod.GET)
||
@GetMapping(value="/login")

2.3 客戶端引數傳遞(重點)

2.3.1 param引數接收

只要形引數名和型別與傳遞引數相同,即可自動接收!

客戶端程式碼:login.jsp

  <form action="myController/login" method="get">
        <p>
            使用者名稱稱:<input type="text" name="name">
        </p>
        <p>
            使用者密碼:<input type="password" name="pwd">
        </p>
        <input type="submit" value="login">
    </form>

服務端程式碼:

![image-20240507162545386](/image-20240507162545386.png)package com.gqk.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("myController")
public class MyController {
    @GetMapping("/login")
    @ResponseBody
    public String login(String name,String pwd){
        System.out.println("name:"+name+" pwd:"+pwd);
        return "LOGIN";
    }
}

注意:form表單中的name屬性必須和方法中的引數保持一致

image

image

  1. @RequestParam註解

    此註解也是用來獲取客戶端傳遞的引數的

    @RequestParam使用場景:

    • 指定繫結的請求引數名
    • 要求請求引數必須傳遞
    • 為請求引數提供預設值

    客戶端程式碼

        <form action="/login" method="post">
            <p>
                使用者名稱稱:<input type="text" name="uname">
            </p>
            <p>
                使用者密碼:<input type="password" name="upwd">
            </p>
            <input type="submit" value="登入">
        </form>
    

    控制器程式碼

    @Controller
    public class UserController {
        @RequestMapping("/login")
        @ResponseBody
        public String login(@RequestParam("uname") String name,
                            @RequestParam("upwd") String pwd){
            System.out.println("使用者名稱:"+name);
            System.out.println("密碼為:"+pwd);
            return "login";
        }
    

    注意:form表單中的name屬性xxxx必須和@RequestParam("xxxx")引數保持一致

    如果沒有獲取到引數此時會報400錯誤

image

將引數設定非必須,並且設定預設值:

客戶端傳送多個值(List集合)

客戶端程式碼:

<h1>
    使用者註冊
</h1>
<form action="/regist" method="post">
    使用者愛好:
    <p>
        <input type="checkbox" name="like" value="學習">學習
        <input type="checkbox" name="like" value="唱歌">唱歌
        <input type="checkbox" name="like" value="跳舞">跳舞
    </p>
    <input type="submit" value="註冊">
</form>

服務端程式碼:

  @RequestMapping("/regist")
    @ResponseBody
    public String regist(@RequestParam List<String> like){
        System.out.println("愛好為:"+like);
        return "regist";
    }

注意:form表單的name屬性必須和regist方法中的引數名稱保持一致

實體類接收引數

當客戶端傳遞引數過多的時候(比如使用者的註冊資訊)此時一個一個傳參麻煩

需要將所有的引數直接封裝到物件中,透過物件直接獲取客戶端傳遞的引數

前段程式碼:

<form action="/regist2" method="post">
    <p>
        使用者名稱稱:<input type="text" name="name">
    </p>
    <p>
        使用者密碼:<input type="password" name="pwd">
    </p>
    <p>
        使用者性別:
        <input type="radio" name="sex" value="男"> 男
        <input type="radio" name="sex" value="女"> 女
    </p>
    使用者愛好:
    <p>
        <input type="checkbox" name="like" value="學習">學習
        <input type="checkbox" name="like" value="唱歌">唱歌
        <input type="checkbox" name="like" value="跳舞">跳舞
    </p>
    <input type="submit" value="註冊">
</form>

實體類

實體類的屬性和上面表單中的name屬性保持一致

@Data
public class User {
    private String name;
    private String pwd;
    private String sex;
    private List<String> like;

}

控制層

@RequestMapping("/regist2")
    @ResponseBody
    public String regist2(User user){
        System.out.println(user);
        return "regist2";
    }

2.3.2 路徑 引數接收

路徑傳遞引數是一種在 URL 路徑中傳遞引數的方式。在 RESTful 的 Web 應用程式中,經常使用路徑傳遞引數來表示資源的唯一識別符號或更復雜的表示方式。而 Spring MVC 框架提供了 @PathVariable 註解來處理路徑傳遞引數。

@PathVariable 註解允許將 URL 中的佔位符對映到控制器方法中的引數。

例如,如果我們想將 /user/{id} 路徑下的 {id} 對映到控制器方法的一個引數中,則可以使用 @PathVariable 註解來實現。

下面是一個使用 @PathVariable 註解處理路徑傳遞引數的示例:

/**
 * 動態路徑設計: /user/{動態部分}/{動態部分}   動態部分使用{}包含即可! {}內部動態標識!
 * 形參列表取值: @PathVariable Long id  如果形參名 = {動態標識} 自動賦值!
 *              @PathVariable("動態標識") Long id  如果形參名 != {動態標識} 可以透過指定動態標識賦值!
 *
 * 訪問測試:  /param/user/1/root  -> id = 1  uname = root
 */ 
@RequestMapping("/add/{id}/{name}")
    @ResponseBody
    public String add(@PathVariable Integer id,
                      @PathVariable("name") String uname){
        System.out.println("id: "+id+" name: "+uname);
        return "add";
    }

2.3.3 Json引數接收

前端傳遞 JSON 資料時,Spring MVC 框架可以使用 @RequestBody 註解來將 JSON 資料轉換為 Java 物件。@RequestBody 註解表示當前方法引數的值應該從請求體中獲取,並且需要指定 value 屬性來指示請求體應該對映到哪個引數上。其使用方式和示例程式碼如下:

json資料型別:

前端傳遞json資料型別以下面的方式

{
    name:"admin",
    age:18,
    sex:"男"
}

實體類物件:

實體類物件中的屬性要和json中的key保持一致

@Data
public class Person {
    private String name;
    private Integer age;
    private String sex;
}

控制器:

  @RequestMapping("/addPerson")
    @ResponseBody
    public Person addPerson(@RequestBody Person person){
        System.out.println(person);
        return person;
    }

postman測試:

image

原因:

  • 不支援json資料型別處理
  • 沒有json型別處理的工具(jackson)

pom新增依賴jakson

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>
</dependency>

正確的結果

image

3 SpringMVC響應資料

響應資料:服務端(控制層)到客戶端(瀏覽器)

3.1 返回模版檢視(jsp)

1. 匯入jsp的依賴

在pom.xml中新增

<!-- jsp需要依賴! jstl-->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.0</version>
</dependency>

2. jsp頁面建立

建議位置:/WEB-INF/下,避免外部直接訪問!

位置:/WEB-INF/views/home.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>
        歡迎<font color="red">${name}</font>登入
    </h1>
</body>
</html>


3. 配置jsp的檢視解析器

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.gqk.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
    @Bean
    public HandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public HandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }
	//配置jsp的檢視解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/",".jsp");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }
}

4. 編寫控制器

  @RequestMapping("/home")
    public String home(Model model){
        model.addAttribute("name","gqk");
        return "home";//相當於跳轉至home.jsp
    }

5. 測試

輸入:http://localhost:8080/home

image

3.2 轉發和重定向

在 Spring MVC 中,Handler 方法返回值來實現快速轉發,可以使用 redirect 或者 forward 關鍵字來實現重定向。

@RequestMapping("/redirect-demo")
public String redirectDemo() {
    // 重定向到 /demo 路徑 
    return "redirect:/demo";
}

@RequestMapping("/forward-demo")
public String forwardDemo() {
    // 轉發到 /demo 路徑
    return "forward:/demo";
}

3.3 返回JSON資料(重點)

json資料格式

{
    "name":"admin",
    "age":18
}

1. 匯入jackson依賴

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>
</dependency>

2. 新增json資料轉化器

在配置類中新增@EnableWebMvc

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.gqk.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
}

編寫實體類Person

@Data
public class Person {
    private int id;
    private String name;
    private String sex;
    private Date date;
}

3.控制器方法中新增註解@ResponseBody

    @RequestMapping("/query")
    @ResponseBody//自動返回json物件
    public Person queryPerson(){
        Person person = new Person();
        person.setId(101);
        person.setName("gqk");
        person.setSex("男");
        person.setDate(new Date(95,4,20));
        return person;
    }

4. SpringMVC+Ajax(重點)

SpringMVC預設情況下不能訪問靜態資源(html,css,js......)

在webapp下面編寫login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="#">
    <p>
        使用者名稱稱:<input type="text" id="name">
    </p>
    <p>
        使用者密碼:<input type="password" id="pwd">
    </p>
    <input type="button" value="登入">
</form>
</body>
</html>

訪問的時候404

image

4.1SpringMVC靜態資源的處理

開啟靜態資源處理

在配置類中MyWebAppInitializer.java

package com.gqk.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.gqk.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
    @Bean
    public HandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public HandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/",".jsp");
    }

   /* @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }*/
   //開啟靜態資源處理 <mvc:default-servlet-handler/>
   @Override
   public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
   }
}

4.2 ajax傳送請求

Jquery支援ajax的 所以首先需要下載Jquery的類庫

4.2.1 在html頁面引入jquery類庫

<script src="js/jquery.js"></script>

image

測試jquery是否引入成功

<script src="js/jquery.js"></script>
<script>
    $(function (){
        alert($)
    })
</script>

image

https://www.runoob.com/jquery/jquery-ajax-intro.html

ajax語法:

$.get(URL,callback);
或
$.post( URL [, data ] [, callback ] [, dataType ] )

4.2.2 ajax傳送請求

無引數的訪問

客戶端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src="js/jquery.js"></script>
<script>
    $(function (){
        $("#login_btn").click(function (){
           //傳送ajax請求(一般發向伺服器)
            /**
             * 第一引數為:url
             * 第二個引數:請求引數
             * 第三個引數:回撥函式
             */
            $.post("/login1","",function (data){
                alert(data)
            })
        })
    })
</script>
<body>
<form action="#">
    <p>
        使用者名稱稱:<input type="text" id="name">
    </p>
    <p>
        使用者密碼:<input type="password" id="pwd">
    </p>
    <input type="button" id="login_btn" value="登入">
</form>
</body>
</html>

服務端程式碼:

@Controller
public class UserController {

    @RequestMapping("/login1")
    @ResponseBody//返回給ajax的回撥函式
    public String login1(){
        return "success";
    }
}

帶引數傳送ajax

 $.post("/login1",{'name':'gqk','pwd':"123456"},function (data){
                alert(data)
  })

登入頁面傳送ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<script src="js/jquery.js"></script>
<script>
    $(function (){
        $("#login_btn").click(function (){
           //傳送ajax請求(一般發向伺服器)
            /**
             * 第一引數為:url
             * 第二個引數:請求引數
             * 第三個引數:回撥函式
             */
           /* $.post("/login1","",function (data){
                alert(data)
            })*/
           /* $.post("/login1",{'name':'gqk','pwd':"123456"},function (data){
                alert(data)
            })*/
            let obj = {
                name: $("#name").val(),
                pwd:  $("#pwd").val()
            }
            $.post("/login1",obj,function (data){
                alert(data)
            })
        })
    })
</script>
<body>
<form action="#">
    <p>
        使用者名稱稱:<input type="text" id="name">
    </p>
    <p>
        使用者密碼:<input type="password" id="pwd">
    </p>
    <input type="button" id="login_btn" value="登入">
</form>
</body>
</html>

服務端程式碼:

package com.gqk.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {

    @RequestMapping("/login1")
    @ResponseBody//返回給ajax的回撥函式
    public String login1(@RequestParam("name")String name,
                         @RequestParam("pwd") String pwd){
        System.out.println(name);
        System.out.println(pwd);
        return name+" "+pwd;
    }
}

相關文章