1. Hello Servlet
(1) 创建父工程
-
删除src文件夹
-
引入一些基本的依赖
<!--依赖--> <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><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>
(2) 创建子工程
- 建立一个Moudle:springmvc-01-servlet ,
-
添加Web app的支持,将子工程变为一个web项目
鼠标右键单击,左键单击 Add Framework Support…
-
导入servlet 和 jsp 的 jar 依赖
<dependencies><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> </dependencies>
-
编写HelloServlet 类,用来处理用户请求
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1.获取前端参数String method = req.getParameter("method");if (method.equals("add")) {req.getSession().setAttribute("msg", "执行了 add 方法");}if (method.equals("delete")) {req.getSession().setAttribute("msg", "执行了 delete 方法");}// 2.调用业务层// 3.视图转发或者重定向req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 调用 doGet 实现复用doGet(req, resp);} }
-
编写hello.jsp,在WEB-INF目录下建一个jsp文件夹,新建test.jsp
公共页面(用户可见)放在 web 目录下,用户不可见放在 WEB-INF 目录下。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Hello</title> </head> <body>${msg}</body> </html>
-
在 web.xml 中注册 Servlet
<?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>hello</servlet-name><servlet-class>com.why.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><!--设置超时时间--><!--<session-config>--><!-- <session-timeout>15</session-timeout>--><!--</session-config>--><!--欢迎页--><!--<welcome-file-list>--><!-- <welcome-file>index.jsp</welcome-file>--><!--</welcome-file-list>--></web-app>
(4) idea配置tomcat
(5) 启动Tomcat进行测试
-
localhost:8080/hello?method=add
-
localhost:8080/user?method=delete
2. 简介
SpringMVC 是 Spring Framework 的一部分,基于 java 实现的轻量级 web 框架
官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc
官方文档 5.2.0:https://docs.spring.io/spring-framework/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web
官方文档中文翻译:Spring MVC 4.2.4.RELEASE 中文文档_w3cschool
请求处理
(1) DispatcherServlet
-
Spring MVC框架,与其他很多web的MVC框架一样:请求驱动
-
Spring 的中央处理器,
DispatcherServlet
(继承自HttpServlet
基类),负责把所有请求分发到控制器,同时提供其他web应用开发所需要的功能,而且与 Spring IoC 容器做到了无缝集成,这意味着,Spring提供的任何特性,在 Spring MVC 都可以使用。
(2) 请求处理流程
-
下图展示了 Spring Web MVC 的
DispatcherServlet
处理请求的工作流,Front Controller 相当于DispatcherServlet
,DispatcherServlet
应用的是一个前端控制器的设计模式。 -
下图给出 Spring MVC 详细的的请求处理流程,并用红字注释了其具体操作。
-
实线为 Spring MVC 的操作,不需要编写,只需要配置相关内容即可。
-
虚线为需要编写的操作,由程序员编写逻辑。
-
Handler
:处理器,可理解为 Controller -
HandlerMapping
:处理器映射。它会根据某些规则将进入容器的请求映射到具体的处理器以及一系列前处理器和后处理器(即处理器拦截器)上。具体的规则视HandlerMapping
类的实现不同而有所不同。其最常用的一个实现支持你在控制器上添加注解,配置请求路径。当然,也存在其他的实现。 -
HandlerExecution
: Handler 实例,主要作用是根据 url 查找 Controller 实例,如 url 被查找控制器为:hello => HelloController。-
解释过程:http://localhost:8080/springmvc/hello
http://localhost:8080 服务器域名
springmvc 部署在服务器上的 web 站点(服务)
hello 控制器
解析结果:请求位于服务器 http://localhost:8080 上的 Spring MVC 站点的 hello 控制器
-
-
HandlerAdapter
:处理器适配器。拿到请求所对应的处理器后,适配器将负责去调用该处理器,这使得DispatcherServlet
无需关心具体的调用细节。比方说,要调用的是一个基于注解配置的控制器,那么调用前还需要从许多注解中解析出一些相应的信息。因此,HandlerAdapter
的主要任务就是对DispatcherServlet
屏蔽这些具体的细节。 -
ViewResolver
:视图解析器。它负责将一个代表逻辑视图名的字符串(String)映射到实际的视图类型View
上。 -
Spring的
DispatcherServlet
使用了以上特殊的 bean 来处理请求、渲染视图等,这些特定的 bean 是 Spring MVC 框架的一部分。这些特殊的 bean 可以在 web 应用上下文WebApplicationContext
中配置。Spring MVC 维护了一个默认的bean列表,若没有进行特别的配置,框架将会使用默认的 bean 。
-