一點一滴學習Spring(五)之Spring MVC

一、request請求過程

這裏寫圖片描述

1、請求的第一站是Spring的DispatcherServlet。與大多數基於Java的Web框架一樣,Spring MVC所有的請求都會通過一個前端控制器。在Spring MVC中,DispatcherServlet就是前端控制器;
DispatcherServlet的任務是將請求發送給Spring MVC的控制器controller。控制器是一個用於處理請求的Spring組件。在典型的應用程序中會有多個控制器。DispatcherServlet需要知道應該將請求發送給哪個控制器。所以DispatcherServlet會查詢一個或多個處理器映射(hander mapping)來確定下一站在哪裏。處理器映射會根據請求所帶的URL信息來進行決策;

2、一旦選擇了合適的控制器,DispatcherServlet會將請求發送給選中的控制器。到了控制器,請求會卸下其負載(用戶提供的信息)並耐心等待控制器處理這些信息。

3、控制器在完成邏輯處理之後,通常會產生一些信息,這些信息需要返回給用戶並在瀏覽器上顯示。這些信息被稱爲模型(model)。處理器所做的最後一件事就是將模型數據打包,並標示出用於渲染輸出的視圖名。接下來將請求連同模型和視圖名發送給DispatcherServlet;

4、DispatcherServlet將會使用視圖解析器(view resolver)來將邏輯視圖名匹配爲一個特定的視圖實現;
簡單的基於javaConfig方式配置Spring MVC

二、配置DispatcherServlet

public class SpitterWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return new Class<?>[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[] {"/web/*"};
    }

}

getServletMappings():配置映射路徑的。
getServletConfigClasses():方法返回的帶有@Configuration註解的類將會用來定義DispatcherServlet應用上下文中的bean
getRootConfigClasses():方法返回的帶有@Configuration註解的類將會用來配置ContextLoaderListener創建的應用上下文中的bean
在本例中:跟配置定義在RootConfig中,DispatcherServlet的配置聲明在WebConfig中。稍後我們會看到這兩個類中的內容

最簡單的WebConfig類:

@Configuration
@EnableWebMvc
public class WebConfig {

}

這可以運行起來,它的確能夠啓用Spring MVC,但是還有不少問題要解決
1、沒有配置視圖解析器。如果這樣的話,Spring默認會使用BeanNameView-Resolver,這個視圖解析器會查找ID與視圖名稱匹配的bean,並且查找的bean要
實現View接口。它以這樣的方式來解析視圖;
2、沒有啓用組件掃描。這樣的結果是,Spring只能找到顯示聲明在配置類中的控制器;
3、這樣配置的話,DispatcherServlet會映射爲應用的默認Servlet,所以他會處理所有的請求,包括對靜態資源的請求,如圖片、樣式等

WebConfig類詳細配置

@Configuration
@EnableWebMvc//啓用Spring MVC
@ComponentScan(basePackages={"com.cn.test.web"}) //啓用組件掃描,掃描帶有@Controller的組件
public class WebConfig extends WebMvcConfigurerAdapter{

    //配置視圖解析器
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = 
                new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    //配置靜態資源的處理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // TODO Auto-generated method stub
        configurer.enable();
    }

}

1、WebConfig添加了@ComponentScan註解,因此將會掃描com.cn.test.web包來查找組件。稍後你會看到,我們所編寫的控制器會帶有@Controller註解,這會使其成爲組件掃描時候候選bean。因此,我們不需要再配置類中顯示的聲明任何控制器
2、接下來,我們添加了一個ViewResolver bean,在這裏他會查找文件,在查找的時候,他會在視圖名稱上加一個特定的前綴和後綴。
3、最後,新的WebConfig類還擴展了WebMvcConfigurerAdapter並重寫了其configureDefaultServletHandling方法。通過調用DefaultServletHandlerConfigurer的enable()方法,要求DispatcherServlet將對靜態資源的請求轉發到Servlet容器中默認的Servlet上。而不是使用DispatcherServlet本身來處理此類請求

RootConfig類基本配置:

@Configuration
@ComponentScan(basePackages={"com.cn.test"},excludeFilters={
        @Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)
})
public class RootConfig {

}

這裏對RootConfig不做過多介紹

基本控制類:

@Controller//聲明一個控制器
public class HomeController {

    @RequestMapping(value="/home/test",method=RequestMethod.GET)//處理對/web/home/test的請求
    public String home(){
        return "test";//返回的試圖名稱
    }
}

1、你也可以讓HomeController帶有@Component註解,他實現的效果是一樣的,但是在表意上回差一些,無法確定HomeController是什麼組件類型
@RequestMapping註解,他的value屬性制定了這個方法所要處理的請求路徑,method屬性細化了他所處理的HTTP方法。
2、在本例中收到對”/web/home/test”的HTTP GET請求時,就會調用home()方法,爲何需要加/web呢,由於我們在SpitterWebAppInitializer配置了
DispatcherServlet映射路徑是/web/*。
3、home()方法返回了一個String類型”test”,這個String將會被SpringMVC解讀爲要渲染的視圖名稱。DispatcherServlet會要求視圖解析器將這個邏輯名稱解析爲
實際的視圖。鑑於我們配置的InternalResourceViewResolver方式,視圖名”test”將會解析爲”/WEB-INF/views/test.jsp”路徑下的JSP。

JSP文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
測試第一個搭建的SpringMVC
</body>
</html>

接受請求參數

SpringMVC允許以多種方式將客戶端中的數據傳送到控制器的處理方法中,包括:
查詢參數(Query Parameter)
表單參數(Form Parameter)
路徑變量(Path Parameter)

查詢參數(Query Parameter):
Ctroller 獲取參數方式:
@RequestParam(“param1”) String param1;
@RequestParam(“param2”) Integer param2;

查詢參數(Path Parameter):
Ctroller 獲取參數方式:
@PathVariable(“param3”) String param3;

Ctroller:
@Controller//聲明一個控制器

public class HomeController {

    @RequestMapping(value="/home/test/{param3}",method=RequestMethod.GET)//處理對/web/home/test的請求
    public String home(Model model,
            @RequestParam("param1") String param1,
            @RequestParam("param2") Integer param2,
            @PathVariable("param3") String param3){
        model.addAttribute("model", "我是一個填充的參數");
        return "test";//返回的試圖名稱
    }
}

訪問鏈接示例:http://localhost:8080/web/home/test/para3?param1=para1&param2=2

這裏寫圖片描述

項目:
這裏寫圖片描述

發佈了45 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章