前言&準備
SpringMVC是一套輕量級web開發(fā)框架,可以容易的和Spring整合,簡單易用,其底層依然基于Servlet。使用SpringMVC之前,首先需要引入相關的Jar包,這里使用Maven包管理工具實現。
- 需要的
Jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
-
引入之后為項目添加框架支持
添加框架支持 -
配置本地
tomcat
配置本地tomcat -
將項目中用到的依賴添加到WEB-INF/lib下
image.png
使用SpringMVC
在真正使用SpringMVC框架開發(fā)之前,先回憶一下,在JavaWeb中,我們利用Servlet進行開發(fā),只要編寫好一個實現Servlet接口的類,實現對應的方法,然后在web.xml配置好<servlet>和<servlet-mapping>后, 訪問特定路經,請求就會自動跳轉到其對應的Servlet進行處理,這樣其實也不算復雜,但是隨著需求的增加,就需要配置大量的Servlet,為此SpringMVC給我們提供了一個好的解決方法,它內置了一個DispatcherServlet類,其繼承結構如下

可以看到其本質還是一個
Servlet,但是它并不直接處理業(yè)務邏輯,而是提供一個轉發(fā)功能,為某個url下的所有子路徑,找到一個對應的處理對象中某個處理方法,而這個處理對象,我們將其以Bean的形式加入Spring容器中,由Spring容器托管。因此配置SpringMVC的核心,就是配置這個DispatcherServlet和Spring的容器。
- 在
web.xml中配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<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-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
可以看見我們現在只需要配置一個DispatcherServlet即可,<url-pattern>/<url-pattern>指明了匹配除了靜態(tài)資源以為的所有請求,也就是說現在所有的請求都由SpringMVC框架來管理。重點關注DispatcherServlet 種的contextConfigLocation參數,由于所有進行實際請求處理的controller(即MVC模式中的控制器層)都會被注入一個Spring容器中,contextConfigLocation便指明了這個Spring容器配置文件的路徑,我們可以通過注解或xml的方式把Controller注入到容器中。
- 配置
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="/hello" class="com.spmvc.controller.HelloController">
</bean>
</beans>
這里需要關注的地方有2點,一個是InternalResourceViewResolver(內置視圖解析器),在非前后端分離的模式下,通常controller會返回一個String,我們要做的是將其轉化成對應的視圖名稱,InternalResourceViewResolver配置了前綴/WEB-INF/jsp/,和后綴.jsp,當Controller返回一個hello字符串時,該視圖解析器會將其轉換成/WEB-INF/jsp/hello.jsp,然后SpringMVC框架會去把這個位置的資源返回給游覽器。BeanNameUrlHandlerMapping是一個在非注解形式下才會用到的Bean,收到的請求url和配置在該容器中對應id的Controller匹配,假若我們這里訪問localhost:8080/hello,則就會匹配到 id=/hello的HelloController。
- 以非注解的形式編寫一個
Controller
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "HelloWorld");
modelAndView.setViewName("hello");
return modelAndView;
}
}
這種方式不經常使用,主要是實現一個Controller接口,其中方法會返回一個ModelAndView對象,這個對象包含了2大部分內容,即視圖的名稱,比如xxx.jsp還有需要傳遞的數據(以鍵值對的形式存在)。
- WEB-INF/jsp/hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
利用注解配置Controller
之前實現Controller接口的方式和Servlet似乎大同小異,但是如果使用注解就方便多了。
- 利用注解配置
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model){
model.addAttribute("msg", "Hello world~!");
return "hello"; // 被view解析器處理
}
}
只要在一個類上添加@Controller便可以,然后在具體方法上添加@RequestMapping("/hello")表明所有訪問/hello的請求都會被該方法處理,也就是說從原來的一個請求對應一個實現類,變成一個請求對應一個方法。Model是一個Springmvc管理的類,通過對其設置鍵值對的方式可以傳遞數據給對應的view,光有注解不夠,我需要配置Spring容器來掃描識別注解
- 配置
springmvc-servlet.xml
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.spmvc.controller"></context:component-scan>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
至此,就可以簡單的使用SpringMVC框架了。


