1、是否需要在類路徑中使用spring-mvc.jar,或者是spring-core的一部分?
spring-mvc.jar不是spring-core的一部分,如果要在Java項目中使用Spring MVC框架,則必須在應用程序的類路徑中包含spring-mvc.jar。在Java Web應用程序中,spring-mvc.jar通常放在/ WEB-INF / lib文件夾中。
2、什么是DispatcherServlet以及它用於什么?
DispatcherServlet是Front Controller設計模式的一個實現,它處理對Spring MVC應用程序的所有傳入Web請求。前端控制器模式是Web應用程序中的常見模式,其作用是接收所有請求並將其路由到應用程序的不同組件以進行實際處理。
在Spring MVC的情況下,DispatcherServlet將Web請求路由到Spring MVC控制器。
在Spring MVC中,DispatcherServlet用於查找正確的Controler以處理請求,它在處理程序映射的幫助下執行,例如@RequestMapping注釋。
它還負責將邏輯視圖名稱委派給ViewResolver,然后將呈現的響應發送到客戶端。
3、DispatcherServlet如何通過應用程序上下文實例化?
DispatcherServlet由Tomcat或Jetty等Servlet容器實例化。必須將DispatcherServlet定義到web.xml文件中,如下所示。
可以看到load-on-startup標記為1,當Spring MVC應用程序部署到Tomcat或任何其他Servlet容器時,將實例化DispatcherServlet。在實例化期間,它會查找文件servlet-name-context.xml,然后初始化此文件中定義的bean。
4、Spring MVC中的root應用程序上下文是什么?怎么裝載的?
在Spring MVC中,使用ContextLoaderListener加載的上下文稱為“root”應用程序上下文,它屬於整個應用程序,而使用DispatcherServlet初始化的應用程序上下文實際上是特定於該servlet。
從技術上講,Spring MVC允許在Spring MVC Web應用程序中使用多個DispatcherServlet ,因此可能存在多個這樣的上下文,每個上下文都針對相應的servlet,但是具有相同的根上下文。
5、@Controller注釋的用途?如何在沒有注釋的情況下創建控制器?
@Controller是用來定義Controller的Spring MVC注釋,但實際上它只是一個原型注釋。甚至可以在沒有@Controller的情況下通過使用@Component注釋Spring MVC控制器類來創建控制器。請求映射到處理程序方法的實際工作是使用@RequestMapping注釋來完成的。
6、什么是ContextLoaderListener,它的作用是什么?
ContextLoaderListener是一個監聽器,這有助於引導Spring MVC的。顧名思義它加載並創建ApplicationContext,因此不必編寫顯式代碼來創建它。應用程序上下文是Spring bean離開的地方。對於Web應用程序,有一個名為WebAppliationContext的子類。
ContextLoaderListener還將ApplicationContext的生命周期與ServletContext的生命周期聯系起來。可以使用getServletContext()方法從WebApplicationContext獲取ServletContext。
ContextLoaderListener是在web.xml中配置為監聽器的,可以將它放在一個標記中,如下所示:
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
部署Spring MVC Web應用程序時,Servlet容器創建了一個ContextLoaderListener類的實例,該類加載Spring的WebApplicationContext。
7、傳入請求如何映射到控制器和方法?
有時也會問這個問題DispatcherServlet如何知道哪個Controller應該處理請求?
Spring使用處理程序映射將控制器與請求相關聯,兩個常用的處理程序映射是BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。
在BeanNameUrlHandlerMapping中,當請求url與bean的名稱匹配時,bean定義中的類是將處理請求的控制器。
另一方面,在SimpleUrlHandlerMapping中,映射更明確。可以指定URL的數量,並且每個URL可以與控制器顯式關聯。
順便說一句,如果你使用注釋來配置Spring MVC,那么應該使用@RequestMapping注釋將傳入請求映射到控制器和處理程序方法。
還可以通過URI路徑,查詢參數,請求的HTTP方法以及請求中存在的HTTP標頭配置@RequestMapping批注。
8、@RequestParam用於什么?
@RequestParam是一個Spring MVC注釋,其被用於提取從URL中控制器的處理程序方法請求參數或查詢參數,如下所示:
- public String personDetail(@RequestParam("id")long id){
- ....
- return "personDetails";
- }
@RequestParam注釋也支持數據類型轉換,例如這里可以看到一個String被自動轉換為long,但它也可能導致一個異常,如果查詢參數不存在或類型不匹配的情況下 還可以使用requried = false使參數成為可選參數,例如@RequestParam(value ="id",required = false)
9、控制器方法的一些有效返回類型是什么?
Spring MVC中的控制器方法有許多可用的返回類型,這些方法由控制器內部的@RequestMapping注釋。其中一些流行的是:
(1)String
(2)void
(3)View
(4)ModelAndView (Class)
(5)Model (Interface)
(6)Map
(7)HttpEntity<?> or ResponseEntity<?>
(8)HttpHeaders
每種返回類型都有其特定用途。例如,如果使用的是String,則表示Controller只返回View Name,此視圖名稱將由ViewResolver解析。
如果不想返回任何視圖名稱,請提回返回類型void。如果要設置視圖名稱以及想要發送一些對象,請使用ModelAndView作為返回類型。
10、什么是模型?
Model再次是封裝數據或輸出以進行渲染的引用。始終創建模型並將其傳遞給Spring MVC中的視圖。如果映射的控制器方法將Model作為方法參數,則Spring框架會自動將模型實例注入該方法。
注入模型上設置的任何屬性都將保留並傳遞給View。以下是在Spring MVC中使用Model的示例:
- public String personDetail(Model model){
- ...
- model.addAttribute("name","Joe");
- ...
- }
11、InternalResourceViewResolver有什么作用?
在Spring MVC中,ViewResolveer返回View以處理基於邏輯視圖名稱(由控制器提供)和語言環境輸出呈現。這種方式控制器沒有耦合到特定的視圖技術,例如JSP或FreeMarker,它只返回邏輯視圖名稱。
InternalResourceViewResolver是在Spring MVC和DispatcherServlet中配置的默認View解析器用它來找到正確的視圖。InternalResourceViewResolver用於呈現JSP(JstlView)。
它將前綴和后綴配置為邏輯視圖名稱,然后生成特定JSP的路徑,如下所示:
- <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name = "prefix" value = "/WEB-INF/" />
- <property name = "suffix" value = ".jsp" />
- </bean >
因此,如果Controller返回"hello"作為邏輯視圖名稱,則InternalViewResolver將返回/WEB-INF/hello。
12、參考
SpringMVC中文官網:http://www.springmvc.cn/archives/55.html