文章目录
- 一、编写第一个 Spring MVC 程序
- 二、项目运行时报 404错误原因总结
- 三、Spring MVC 的执行流程
一、编写第一个 Spring MVC 程序
-
创建 maven 项目,以此项目为父项目,在父项目的 pom.xml 中导入相关依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- 导入servlet 和 jsp 的 jar 依赖 --> <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>
-
在父项目上右键创建子项目,创建完成之后,在子项目上右键选中 Add framework support 找到 Web Application 勾选上
-
具体步骤
-
勾选完之后项目会出现 web 目录
-
-
配置 web.xml
-
勾选完 Web Application 之后会在 web/WEB-INF 路径下生成一个 web.xml,这个就是默认的 web.xml 了
<?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"> </web-app>
-
在 web.xml 中配置 DispatcherServlet 和即将需要创建的 SpringMVC-Servlet.xml (Spring 容器配置文件)
<?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> <!-- 配置 Spring MVC 核心组件:前端控制器(DispatcherServlet) --> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联 SpringMVC 的配置文件,SpringMVC-Servlet.xml 是一会要写的 Spring 容器配置文件--> <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>中的内容需要与<servlet>子标签<servlet-name>中的内容保持一致--> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
-
配置 SpringMVC-Servlet.xml
-
创建 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"> </beans>
-
在 SpringMVC-Servlet.xml 中添加 Spring 的处理映射器(HandlerMapping)
<!-- 1、引入处理器映射器 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
添加 Spring 的处理适配器(HandlerAdapter)
<!-- 2、引入处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
添加 Spring 的视图解析器(ViewResolver)
<!-- 3、添加视图解析器:DispatcherServlet会将从Handler获取到的ModelAndView数据交给添加视图解析器。在这个环节视图解析器一共做了四步处理 1.获取ModelAndView的数据 2.解析ModelAndView的视图名称 3.通过设置的前缀和后缀拼接视图名称,以此找到对应视图:/WEB-INF/jsp/hello.jsp 4.将数据渲染到这个视图上 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 设置视图前缀路径 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 设置视图指定文件的后缀 --> <property name="suffix" value=".jsp"/> </bean>
-
编写要操作业务Controller ,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,模型封装数据,视图指定跳转到那个页面;
//注意:这里我们先导入Controller接口 public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); // 业务代码 //封装对象,放在ModelAndView中。Model mv.addObject("msg","Hello SpringMVC!"); // 视图跳转 //封装要跳转的视图,放在ModelAndView中,通过hello找到hello.jsp mv.setViewName("hello"); //此处加上视图解析器拼接出: /WEB-INF/jsp/hello.jsp return mv; } }
-
将操作业务的 Controller 类,交给 SpringIOC 容器,注册 bean
<!-- 处理器:Handler,也就是 Controller --> <bean id="/hello" class="com.sys.controller.HelloController"/>
-
编写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面;
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>HelloSpringMVC</title> </head> <body> ${msg} </body> </html>
-
配置 tomcat 然后运行
-
先找到默认的 index.jsp
-
通过 URL 控制输入 hello 参数
-
-
二、项目运行时报 404错误原因总结
-
1、可能是缺少 jar
-
查看控制台输出,看一下是不是缺少了什么jar包。
如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖! -
从下图可以看出,项目在运行时只有classes,没有lib也就是存放jar的地方,这里需要手动创建lib并将jar导入
-
导入jar
-
-
-
2、可能是静态路径与项目结构中的 Web 资源路径不一致
-
3、可能是依赖版本问题,换一下版本号试试
三、Spring MVC 的执行流程
-
Spring MVC 的执行流程图,如下所示:
-
Spring MVC 具体的执行流程
-
1.客户端浏览器向前端控制器(DispatcherServlet)发出请求。
-
2.DispatcherServlet接收到请求后,调用处理器映射器(HandlerMapping)。
-
3.HandlerMapping根据请求url查找相应的处理器(Handler,也称后端控制器),返回处理器对象(Handler),并且如果有处理器拦截器(HandlerInterceptor)的话,会将处理器对象(Handler)和处理器拦截器对象(HandlerInterceptor)一并返回给DispatcherServlet。
-
4.DispatcherServlet拿到这些信息后,会调用处理器适配器(HandlerAdapter),HandlerAdapter会执行Handler,Handler执行处理DispatcherServlet发来的请求,生成ModelAndView对象返回给HandlerAdapter。
-
5.HandlerAdapter将ModelAndView对象返回给DispatcherServlet。
-
6.DispatcherServlet在拿到ModelAndView对象之后,将ModelAndView对象发给视图解析器(ViewResolver)。
-
7.ViewResolver将ModelAndView对象进行解析,生成View对象,将View对象返回给DispatcherServlet。
-
8.DispatcherServlet拿到View对象,对jsp 页面进行渲染(将模型数据填充到视图中),将渲染后的页面呈现给用户。
-