【SpringMVC】SpringMVC基础教程(2)
前言:
本文内容:初识SpringMVC、SpringMVC执行原理、深入SpringMVC学习
推荐免费SpringMVC基础教程视频:【狂神说Java】SpringMVC最新教程IDEA版通俗易懂_哔哩哔哩_bilibili
初识SpringMVC
简介
SpringMVC是SpringFramework的一部分,是基于Java实现MVC的轻量级Web框架。
SpringMVC的特点
- 轻量级,简单易学
- 高效,基于请求响应的MVC框架
- 与Spring兼容性好
- 约定大于配置
- 功能强大(Restful、数据验证、格式化、本地化、主题等等)
- 简洁灵活
中心控制器
Spring的web框架围绕DispatcherServlet调度Servlet设计。
DispatcherServlet的作用是将请求分发到不同的处理器。从Spring2.5开始,使用Java 5或者以上版本可以采用基于注解形式开发,更加简洁。
SpringMVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能。DispatcherServlet是一个实际的Servlet(继承自HttpServlet)
快速搭建SpringMVC
-
新建一个Module,添加web支持
-
确定导入了SpringMVC的依赖
-
配置
web.xml
,注册DispatcherServlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<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">
<!-- 注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联一个springmvc的配置文件 servlet-name servlet.xml-->
<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>
<!-- / 匹配所有的请求,不包括.jsp-->
<!-- /* 匹配所有的请求,包括.jsp-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app> -
在
resources
下新建springmvc-servlet.xml
1
2
3
4
5
6
<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> -
添加处理器映射
1
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
添加处理器适配器
1
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
添加视图解析器
1
2
3
4
5
6
7<!-- 视图解析器: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> -
编写我们要操作业务
Controller
,要么实现Controller
接口,要么增加注解;需要返回一个ModelAndView
,封装数据和视图1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package com.jokerdig.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Joker大雄
* @data 2022/5/31 - 18:11
**/
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 视图和模型
ModelAndView mav = new ModelAndView();
// 封装对象,放在ModelAndView中
mav.addObject("msg","HelloSpringMVC");
// 封装要跳转的视图,放在ModelAndView中
// 结合之前配置的视图解析器 地址为:/WEB-INF/jsp/hello.jsp
mav.setViewName("hello");
return mav;
}
} -
在
WEB-INF/jsp
下新建hello.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<%--
Created by IntelliJ IDEA.
User: Joker大雄
Date: 2022/5/31
Time: 18:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html> -
将类交给SpringIOC容器,注册bean
1
2<!-- Handler-->
<bean id="/hello" class="com.jokerdig.controller.HelloController"/> -
运行项目测试
1
2浏览器显示
HelloSpringMVC
SpringMVC执行原理
SpringMVC流程图,实线标识SpringMVC框架提供的技术,虚线表示需要开发者实现
简要分析执行流程
DispatcherServlet
表示前端控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet
接收并连接请求- 如果我们假设请求为:http://localhost:8080/springmvchello/hello
- 我们将url拆分成三部分
- http://localhost:8080 服务器无名
- springmvchello 部署在服务器上的web站点
- hello表示控制器
- 通过分析,如上url表示为:请求位于服务器localhost:8080上的springmvchello站点的hello控制器
HandlerMapping
为处理器映射。DispatcherServlet
调用HandlerMapping
,被调用者根据请求url查找Handler。HandlerExecution
表示具体的Handler,其主要作用是根据url查找控制器,例如上方url被查找控制器为:helloHandlerExecution
将被解析后的信息传递给DispatcherServlet
,例如解析控制器映射等。HandlerAdapter
表示处理器适配器,其按照特定的规则去执行Handler- Handler让具体的Controller执行
- Controller将具体的执行信息返回给
HandlerAdapter
,如ModelAndView
。 HandlerAdapter
将视图逻辑名或模型传递给DispatcherServlet
。DispatcherServlet
调用视图解析器(ViewResolver
)来解析HandlerAdapter
传递的逻辑视图名。- 视图解析器将解析的逻辑视图名传给
DispatcherServlet
。
深入SpringMVC学习
-
新建
springmvc-03-hellomvc2
的module分析原理并编写代码 -
在
WEB-INF/jsp
下创建test.jsp
1
2
3
4
5
6
7
8
9<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
${msg}
</body>
</html> -
配置web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<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">
<!-- 配置DispatcherServlet SpringMVC的核心,请求分发-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet要绑定spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动的级别 1和服务器一起启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 不会去匹配 .jsp
/* 回去匹配.jsp 造成项目报错
-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app> -
创建
springmvc-servlet.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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"/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!-- BeanNameUrlHandlerMapping 需要我们注册TestController-->
<bean id="/test" class="com.jokerdig.controller.TestController"/>
</beans> -
编写
TestController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28package com.jokerdig.controller;
import com.sun.org.apache.xpath.internal.operations.Mod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Joker大雄
* @data 2022/5/31 - 21:20
**/
public class TestController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
// 业务代码
String result ="TestSpringMVC";
mav.addObject("msg",result);
// 视图跳转
mav.setViewName("test");
return mav;
}
} -
运行测试
1
2浏览器运行结果:
TestSpringMVC -
报错解决
如果代码没问题但是/test仍然提示404,可以在Project Structure->Artifacts下对应的项目的WEB-INF下新建lib文件夹,并把所有的包都导入
-
小结
虽然对比JavaWeb简洁不少,但我们实际开发更多是用注解来实现