学习链接为狂神说Java的SpirngMVC前4章,希望学习更多新的知识!学习真的是太棒了!要一直学习哦!视频教得很好哦,特别适合初学者!
1 回顾MVC
ssm:MyBatis+Spring+SpringMVC
记忆中的MVC:也就是做项目时候的MVC三层架构.
1.1 MVC是什么:
- 模型(dao,service),视图(jsp),控制器(servlet),是一种软件设计规范。
- 是将业务逻辑、数据、显示分离的方法来组织代码。
- MVC的主要作用是降低了视图和业务逻辑之间的双向耦合。
- MVC不是一种设计模式,而是一种架构模式。不同的MVC存在差异。
模型Model:数据模型,提供要展示的数据,因此包含数据和行为。可以认为是领域模型或是JavaBean组件(包含数据和行为),不过现在一般都要先分离成:Value Object(dao层,包含数据)和服务层(行为Service),也就是模型层提供了模型数据查询和模型数据的状态更新等功能,包含着数据和业务。
视图View:负责模型的展示,一般就是我们见到的界面,是客户想看到的对象。
控制器Controller:接受用户请求,委托给模型进行处理(状态改变),处理完毕后再把返回的模型数据传递给视图,由视图负责展示。起了一个调度员的身份。
最典型的MVC就是JSP+Servlet+JavaBean的模式。
1.2 对三者的职责分析:
Controller(控制器):
- 获取表单数据
- 调用相应的业务逻辑
- 转到具体页面
Model(模型):
- 保存业务逻辑
- 保存数据的状态
View(视图):
- 展示界面
2 回顾Servlet
导包,Servlet只用到servlet-api和jsp-api两个包,其他的是SpringMVC中要用的
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.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.1 Servlet有两个注意点,
- 一个是要写一个类继承HttpServlet;
- 第二个是要取web.xml中配置Servlet.
ps:
HttpServlet的父类最终实现了Servlet的接口。
如果为了保证安全,确保用户不可见,可以把页面放到WEB-INF中;如果一些公共的页面就放在web目录下
2.2 MVC框架要做的事情:
- 将url映射到java类中或java的方法;
- 封装用户提交的数据;
- 处理请求----调用相关的业务处理----封装响应数据;
- 将数据进行渲染,用jsp/html等表示成数据。
ps:M V VM(ViewModel:双向绑定)
3 SpringMVC
3.1 SpringMVC是什么
SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
3.2 SpringMVC的特点
为什么我们要学习Spring MVC?
- 轻量级,简单易学。
- 高效,基于请求响应的MVC框架。
- 和Spring兼容好,无缝结合。
- 约定大于配置。
- 功能强大:RESTful(url地址栏区别它不用问号传参)、数据验证(上传的方式必须是邮箱啊之类的)、格式化、本地化、主题等。
- 简洁灵活。
Spring的Web框架是围绕**DispatcherServlet(调度Servlet)**设计的
中心控制器
Spring的web框架是围绕DispatcherServlet设计的。DispatcherServlet的作用是将请求分发到不同的处理器。
SpringMVC框架是以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能。DispatcherServlet是一个实际的Servlet(他继承于HttpServlet)
SpringMVC原理如图—英文版来自官方。
4 编写一个SpringMVC程序实例
新建一个module-maven项目并添加web框架支持。
4.1 编写web.xml文件
<?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">
<!--注册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>
</servlet>
<!--/ 匹配所有的请求: (不包括.jsp)-->
<!--/* 匹配所有的请求:(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.2 编写web.xml中使用到的springmvc-servlet.xml
<?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">
<!--URL处理器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--URL适配器-->
<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>
</beans>
4.3 编写一个继承控制器的类,通过这个类去起到控制器的功能
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//新建一个ModelAndView对象,模型和视图类
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中,
mv.addObject("msg","HelloSpringMVC");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello");//存放在/WEB-INF/jsp/hello.jsp中
return mv;
}
}
4.4 将hello注册到Spring容器中
在springmvc-servlect.xml中注入bean
<bean id="/hello" class="com.swrici.controller.HelloController"/>
4.5 编写对应的jsp页面,启动Tomcat
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2020/9/23
Time: 15:30
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>
4.6 可能会遇到的问题404报错
- 创建lib目录,并添加响应的包。
- 步骤
- 按住Ctrl+Alt+Shift+S,选择出现PojectStructure结构。
- 接着就是在WEB-INF目录下创建lib文件夹并添加所有的依赖。
4.7 SpringMVC粗略执行流程
地址栏访问的hello,没有在web.xml配置,是如何访问到的?
-
按下地址栏,发生url请求过来,我们在web.xml中只配置了一个DispatcherServlet,所以说明我们所有的请求都会经过它。
,DispatcherServlet接受到请求之后发送url到url处理器和url适配器 -
url处理器和url适配器起的作用是根据url去找spring里面有哪个Contronller去匹配它去处理它。
-
在Spring容器中也已经提前注册好了bean,在bean中包含着页面和具体的控制器类的映射关系,bean中id是url,对应的类型是一个继承Controller接口的类。然后通过这个Bean提供的信息跳转到对应的类中。
-
在这个继承Controller接口的类中存在着一个要实现的方法handleRequest(),这个方法会返回一个对象ModelAndView,模型保存数据,视图去设计要跳转到哪个页面。然后返回这个ModelAndView对象。
-
接下来会经过视图解析器,然后拼接url,然后找到这个页面,再返回这个页面。