如下图,所有实线的部分都由 SpringMVC 框架实现,我们的代码只需要处理虚线的部分:
【总结】:
DispatchServlet(请求分发器 / 前端控制器), 是SpringMVC的核心
1. 用户发起请求的时候调用前端控制器 DispatcherServlet;
2. DispatcherServlet 会根据用户的请求找到HandlerMapping 映射器,HandlerMapping 将映射的URL 返回给DispatcherServlet;
3. DispatcherServlet 调用 HandlerAdapter 适配器,根据映射的URL地址找到对应的Controller,Controller 执行后返回 ModelAndView 给 DispatcherServlet;
4. DispatcherServlet 调用视图解析器配置ModelAndView,视图解析器将结果返回给DispatcherServlet;
5. DispatcherServlet 将最终的 View 视图层页面返回给用户。
SpringMVC 的底层还是由 JavaWeb 中学过的 Servlet 实现的,利用SpringMVC框架我们可以将Servlet分离出来:
在 web.xml 配置DispatchServlet:
<?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>servletDispatch</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联 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>servletDispatch</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
配置完web.xml后,下面介绍 springmvc 中,servlet 的两种写法:
写法一:(不推荐)
在 springmvc-sevlet.xml 配置spring配置文件:
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>--><!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>--><!--视图解析器:DispatcherServlet给他的ModelAndView--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="InternalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean><!-- Handler--><bean id="/hello" class="com.edward.controller.HelloController"/>
</beans>
在 HelloController 编写 Controller:
package com.edward.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class HelloController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView();mv.addObject("msg", "hello,controller");mv.setViewName("hello");return mv;}
}
写法二:(推荐!)
在 springmvc-sevlet.xml 配置spring配置文件:(bean自动装配, 去掉mapping配置)
<?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/beanshttp://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.edward.controller"/><mvc:default-servlet-handler /><mvc:annotation-driven /><!--视图解析器:DispatcherServlet给他的ModelAndView--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="InternalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean></beans>
在 HelloController 编写 Controller:
package com.edward.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/hello")public String test1 (Model model) {model.addAttribute("msg", "hello, controller2234");return "hello";}
}
最终的目录结构:
[踩坑]:
访问出现404:
1. 查看控制台输出,看一下是否少了什么jar包
2. 如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖
3. 重启 Tomcat 即可解决