如下图,所有实线的部分都由 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/beans
http://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/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.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 即可解决