创建一个基于xml配置的Spring MVC项目。
Idea创建新项目,pom文件引入依赖:
org.springframework
spring-context
5.2.12.RELEASE
org.springframework
spring-web
5.2.12.RELEASE
org.springframework
spring-webmvc
5.2.12.RELEASE
在项目的webapp/WEB-INF目录下创建web.xml文件,配置DispatcherServlet:
dispatcherServlet
DispatcherServlet
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
DispatcherServlet
/*
注意其中定义了contextConfigLocation:上下文配置文件位置,配置为:classpath:springmvc.xml,指定Spring MVC启动过程中会到指定位置读取该配置文件,所以我们需要配置好springmvc.xml文件。
在项目resource路径下配置springmvc.xml文件:
主要是指定Spring MVC的controller的包扫描路径,并指定视图解析器、以及视图后缀为jsp。
最后,创建一个conrolller:
package org.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloWorldController {
@GetMapping("/hello")
@ResponseBody
public String hello(ModelAndView model){
return "Hello World
";
}
}
我们的目的就是让快速让这个Spring MVC案例跑起来,就不创建jsp文件了,所以在controller中引入了@ResponseBody注解(不加这个注解的话,controller的@GetMapping方法返回String则视图解析器会将其处理为jsp页面)。
启动后,测试:
所以,通过idea创建一个基于SpringMVC的项目非常简单,通过以上几步,一个Spring MVC项目就可以正常运行起来了。
接下来我们先简单研究一下以上案例得以正常运行的底层原理。
DispatcherServlet
我们知道Spring MVC是通过一个核心servlet:DispatcherServlet来处理请求的,所以还是从DispatcherServlet入手。
这个类层次结构中,Servlet->GenericServlet->HttpServlet是属于java SDK的内容,来自于javax.servlet.http包,之后的从HttpServletBean到DispatcherServlet是属于Spring Web MVC框架的内容,来自于org.springframework.web.servlet包。
如果不使用Spring Mvc、自己创建Servlet的话,我们的Servlet直接继承HttpServlet即可,其实实现起来也很简单:
1. 创建MyServlet
package org.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("OHhhhh,this is my own Servlet...
");
}
}
2.在web.xml中配置MySevlet
MyServlet
org.example.servlet.MyServlet
1
MyServlet
/my
其实Spring MVC的工作原理和MyServlet的工作原理类似,MyServlet是通过配置文件找到当前请求URL对应的Servlet,然后再根据请求类型调用Servlet的doGet或者doPost等方法处理请求。Spring MVC处理请求的Servlet是DispatcherServlet,DispatcherServlet根据请求URL匹配HandlerMapping、找到对应的Controller,之后交给HandlerAdapters经过请求参数的匹配、转换之后,通过反射机制调用Controller的对应方法,完成请求的处理。
上述DispatcherServlet的底层处理逻辑,后面我们会逐步细化、深入,从代码层面进行分析。