1.1 DispatcherServlet
DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充當着前端控制器的角色。
在使用時,只需將其配置在項目的web.xml文件中,其配置代碼如下。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <!-- 配置前端過濾器 --> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 初始化時加載配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <!-- 表示容器在啟動時立即加載Servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
在上述代碼中,<load-on-startup>元素和<init-param>元素都是可選的。
如果<load-on-startup>元素的值為1,則在應用程序啟動時會立即加載該Servlet;
如果<load-on-startup>元素不存在,則應用程序會在第一個Servlet請求時加載該Servlet。
如果<init-param>元素存在並且通過其子元素配置了Spring MVC配置文件的路徑,
則應用程序在啟動時會加載配置路徑下的配置文件;如果沒有通過<init-param>元素配置,
則應用程序會默認到WEB-INF目錄下尋找如下方式命名的配置文件。
servletName-servlet.xml
其中,servletName指的是部署在web.xml中的DispatcherServlet的名稱,
在上面web.xml中的配置代碼中即為springmvc,而-servlet.xml是配置文件名的固定寫法,
所以應用程序會在WEB-INF下尋找springmvc-servlet.xml。
1.2 Controller注解類型
org.springframework.stereotype.Controller注解類型用於指示Spring類的實例是一個控制器,
其注解形式為@Controller。該注解在使用時不需要再實現Controller接口,只需要將@Controller注解加入到控制器類上,
然后通過Spring的掃描機制找到標注了該注解的控制器即可。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; @Controller public class FirstController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { //創建ModelAndView對象 ModelAndView mav=new ModelAndView(); //向模型對象中添加數據 mav.addObject("msg","這是我的第一個SpringMVC程序"); //設置邏輯視圖名 mav.setViewName("/jsp/first.jsp"); //返回ModelAndView對象 return mav; } }
為了保證Spring能夠找到控制器類,還需要在Spring MVC的配置文件中添加相應的掃描配置信息,
具體如下。
(1)在配置文件的聲明中引入spring-context。
(2)使用<context:component-scan>元素指定需要掃描的類包。
一個完整的配置文件示例如文件所示。
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 指定需要掃描的包 --> <context:component-scan base-package="com.itheima.controller"/> </beans>
<context:component-scan>元素的屬性base-package指定了需要掃描的類包為com.itheima.controller。
在運行時,該類包及其子包下所有標注了注解的類都會被Spring所處理。
與實現了Controller接口的方式相比,使用注解的方式顯然更加簡單。
同時,Controller接口的實現類只能處理一個單一的請求動作,而基於注解的控制器可以同時處理多個請求動作,
在使用上更加的靈活。因此,在實際開發中通常都會使用基於注解的形式。
1.3 RequestMapping注解類型
1.3.1 @RequestMapping注解的使用
Spring通過@Controller注解找到相應的控制器類后,還需要知道控制器內部對每一個請求是如何處理的。
這就需要使用org.springframework.web.bind.annotation.RequestMapping注解類型。
RequestMapping注解類型用於映射一個請求或一個方法,其注解形式為@RequestMapping,可以使用該注解標注在一個方法或一個類上。
標注在方法上
當標注在一個方法上時,該方法將成為一個請求處理方法,
它會在程序接收到對應的URL請求時被調用。使用@RequestMapping注解標注在方法上的示例如下。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class FirstController { @RequestMapping(value="/firstController") public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { //創建ModelAndView對象 ModelAndView mav=new ModelAndView(); //向模型對象中添加數據 mav.addObject("msg","這是我的第一個SpringMVC程序"); //設置邏輯視圖名 mav.setViewName("/jsp/first.jsp"); //返回ModelAndView對象 return mav; } }
標注在類上
當標注在一個類上時,該類中的所有方法都將映射為相對於類級別的請求,
表示該控制器所處理的所有請求都被映射到value屬性值所指定的路徑下。
使用@RequestMapping注解標注在類上的示例如下
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/hello") public class FirstController { @RequestMapping(value="/firstController") public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { //創建ModelAndView對象 ModelAndView mav=new ModelAndView(); //向模型對象中添加數據 mav.addObject("msg","這是我的第一個SpringMVC程序"); //設置邏輯視圖名 mav.setViewName("/jsp/first.jsp"); //返回ModelAndView對象 return mav; } }
1.3.2@RequestMapping注解的屬性
@RequestMapping注解除了可以指定value屬性外,還可以指定其他一些屬性,這些屬性如表12-1所示。
12.3.3 組合注解
前面兩個小節已經對@RequestMapping注解及其屬性進行了詳細講解,而在Spring框架的4.3版本中,
引入了組合注解,來幫助簡化常用的HTTP方法的映射,並更好地表達被注解方法的語義。
其組合注解如下所示。
· @GetMapping:匹配GET方式的請求。
· @PostMapping:匹配POST方式的請求。
· @PutMapping:匹配PUT方式的請求。
· @DeleteMapping:匹配DELETE方式的請求。
· @PatchMapping:匹配PATCH方式的請求。
以@GetMapping為例,該組合注解是@RequestMapping(method = RequestMethod.GET)的縮寫,
它會將HTTP GET映射到特定的處理方法上。在實際開發中,傳統的@RequestMapping注解使用方式如下
1.4 ViewResolver(視圖解析器)
Spring MVC中的視圖解析器負責解析視圖,可以通過在配置文件中定義一個ViewResolver來配置視圖解析器,其配置示例如下。
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 指定需要掃描的包 --> <context:component-scan base-package="com.itheima.controller"/> <!-- 視圖解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 設置前綴 --> <property name="prefix" value="/jsp/"></property> <!-- 設置后綴 --> <property name="suffix" value=".jsp"></property> </bean> </beans>