天天看點

SpringMVC架構基礎知識(03)

注意:同一個

groupId

下,各

artifactId

不同,但是,如果

version

的編号規則是一樣的,并且,在同一個項目中需要使用不同

artifactId

對應的依賴,必須使用相同的

version

package cn.tedu.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

@ComponentScan("cn.tedu.spring")
public class SpringMvcConfigurer implements WebMvcConfigurer {

    private String characterEncoding = "utf-8";
    
    @Bean
    public ViewResolver configViewResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setCharacterEncoding(characterEncoding);
        templateResolver.setTemplateMode("HTML");
        templateResolver.setCacheable(false);
        templateResolver.setPrefix("/templates/");
        templateResolver.setSuffix(".html");
        
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
        
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding(characterEncoding);
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
    
}

      

2. 接收用戶端送出的請求參數

2.1. 使用HttpServletRequest接收請求參數

在處理請求的方法的參數清單中,添加HttpServletRequest類型的參數,在處理過程中,調用參數對象的getParameter()方法即可擷取請求參數:

@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(HttpServletRequest request) {
    System.out.println("HelloController.handleReg()");
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    Integer age = Integer.valueOf(request.getParameter("age"));
    String phone = request.getParameter("phone");
    String email = request.getParameter("email");
    System.out.println("username=" + username);
    System.out.println("password=" + password);
    System.out.println("age=" + age);
    System.out.println("phone=" + phone);
    System.out.println("email=" + email);
    return "OK."; // 暫時不關心如何響應,是以使用@ResponseBody傳回某個字元串,避免程式報錯
}      

2.2. 将請求參數直接聲明為處理請求的方法的參數

可以将用戶端送出的請求參數直接聲明為處理請求的方法的參數,例如:

@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(String username, String password, Integer age, 
        String phone, String email) {
    System.out.println("HelloController.handleReg()");
    System.out.println("[2] username=" + username);
    System.out.println("[2] password=" + password);
    System.out.println("[2] age=" + age);
    System.out.println("[2] phone=" + phone);
    System.out.println("[2] email=" + email);
    return "OK."; // 暫時不關心如何響應,是以使用@ResponseBody傳回某個字元串,避免程式報錯
}      

在聲明參數時,需要保證名稱的一緻,即“用戶端送出的請求參數的名稱”與“處理請求的方法的參數名稱”必須是一緻的!如果伺服器端聲明的參數,在用戶端送出請求時并沒有送出,則伺服器端聲明的參數值将是null。

在處理請求的方法中,聲明參數時,可以将參數的類型聲明為所期望的類型,例如以上代碼中,就将age聲明為Integer類型,當然,前提是用戶端最終送出的資料是可以轉換為Integer,如果用戶端送出的資料根本就無法轉換,則會報錯。

使用這種雖然簡單、友善,但是,不适用于請求參數過多的應用場景!

2.3. 使用封裝的參數對象接收請求參數

可以将用戶端将要送出的各請求參數封裝到一個自定義的資料類型中,例如:

package cn.tedu.spring;
public class User {
    private String username;
    private String password;
    private Integer age;
    private String phone;
    private String email;
   
    // Getters & Setters
    // toString()
   
}      

然後,将以上自定義的資料類型添加到處理請求的方法的參數清單中即可:

@RequestMapping("handle_reg.do")
@ResponseBody
public String handleReg(User user) {
    System.out.println("HelloController.handleReg()");
    System.out.println(user);
    return "OK."; // 暫時不關心如何響應,是以使用@ResponseBody傳回某個字元串,避免程式報錯
}      

2.4. 小結

首先,在2.1介紹的使用HttpServletRequest接收請求參數的做法是不推薦使用的;

如果請求參數的數量較少,并且固定時,應該優先使用2.2介紹的做法;

如果請求參數的數量較多,或以後存在調整的可能性時,應該優先使用2.3介紹的做法。

另外,以上2.2和2.3的做法可以同時存在!

3. 向模版頁面轉發資料

當需要向Thymeleaf模版頁面轉發資料時,應該先在處理請求的方法的參數清單中添加ModelMap類型的參數,并在需要轉換資料時,調用ModelMap參數對象的addAttribute()方法将資料封裝進去:

@RequestMapping("handle_login.do")
public String handleLogin(String username, String password, ModelMap modelMap) {
    System.out.println("UserController.handleLogin()");
    System.out.println("username=" + username);
    System.out.println("password=" + password);
    // 假設root/1234是正确的使用者名/密碼
    // 判斷使用者名
    if ("root".equals(username)) {
        // 使用者名正确,判斷密碼
        if ("1234".equals(password)) {
            // 密碼也正确,則登入成功
            return "OK";
        } else {
            // 密碼錯誤
            String message = "登入失敗!密碼錯誤!";
            modelMap.addAttribute("errorMessage", message);
            return "error";
        }
    } else {
        // 使用者名錯誤
        String message = "登入失敗!使用者名錯誤!";
        modelMap.addAttribute("errorMessage", message);
        return "error";
    }
}      

後續,在Thymeleaf模版頁面中,使用Thymeleaf表達式即可顯示此前封裝的資料:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>操作錯誤</title>
</head>
<body>
<h1>操作錯誤:<span th:text="${errorMessage}"></span></h1>
</body>
</html>      

繼續閱讀