天天看點

SpringMVC架構基礎知識(02)

在方法的聲明之前添加@RequestMapping注解,用于配置處理哪個路徑的請求;

應該使用public權限;

傳回值類型暫時使用String類型;

方法的名稱可以自定義;

方法的參數清單暫時為空。

例如,可以設計為:

package cn.tedu.spring;

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

@Controller
public class HelloController {
    
    // http://localhost:8080/springmvc01/hello.do
    @RequestMapping("hello.do")
    public String hello() {
        System.out.println("HelloController.hello()");
        return "";
    }

}

      

完成到以上步驟時,就可以将項目部署到Tomcat中,啟動Tomcat,在浏覽器中輸入測試網址http://localhost:8080/springmvc01/hello.do後,在浏覽器應該會提示404錯誤,但是,在Eclipse的控制台中,應該可以看到以上hello()方法中的輸出語句!

最後,如果希望通路後,能夠在浏覽器輸出自定義的内容,可以在方法的聲明之前添加@ResponseBody注解,并将期望傳回的内容寫在hello()方法傳回的字元串中即可!例如:

package cn.tedu.spring;

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

@Controller
public class HelloController {
    
    @RequestMapping("hello.do")
    @ResponseBody
    public String hello() {
        System.out.println("HelloController.hello()");
        return "<font color=red>Hello</font>, <font color=blue>SpringMVC</font>!!!";
    }

}

      

【補】2. 為什麼要使用SpringMVC架構

在原生的Java EE技術體系中,處理使用者請求的是Servlet元件,通常情況下,每個Servlet元件處理1種請求,例如“使用者注冊”的請求可能由UserRegServlet來處理,“使用者登入”的請求可能由UserLoginServlet來處理……在比較複雜的業務系統中,使用者送出的請求的種類可能特别多,就會導緻Servlet元件的數量也特别多!進而導緻代碼的管理難度很大,同時,在項目運作時,諸多的Servlet元件也會占用較多的記憶體空間……

在SpringMVC架構的設計中,就解決了以上問題,它使用1個DispatcherServlet的元件,用于接收所有請求(當然,也可以配置為某些特定的請求,例如配置為僅處理*.do的請求),以此減少Servlet元件的數量!

原本Servlet是用于處理請求的,而在SpringMVC架構中,DispatcherServlet的主要作用是接收到請求後,分發到具體處理請求的Controller元件,其本身并不處理請求!而SpringMVC中的每個Controller元件都可以有若幹個處理請求的方法,也就是每個Controller元件都可以處理若幹種請求,是以,即使項目很複雜,請求的種類很多,但是,Controller元件的數量并不會太多!

DispatcherServlet與Controller的關系就好比銀行大廳的取号機和業務櫃台的關系。

SpringMVC架構的使用比原生的Java EE更加簡單!

1. 顯示頁面

在項目的pom.xml中添加thymeleaf和thymeleaf-spring5這2個依賴:

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>      

注意:同一個

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;
    }
    
}

      

繼續閱讀