SpringMVC篇—认识MVC底层原理、架构和使用,一篇文章搞定!
深入理解什么是MVC
一、理解MVC
MVC是一种软件设计规范,是一种架构模式!
MVC三层架构分别是:
Model:模型,一般都是指数据库,执行一些业务逻辑,持久化数据
View:视图层,一般指前端的jsp页面
Controller:控制层,一般都是Servlet控制请求和响应,以及页面跳转(转发和重定向)
Controller详细职责:(1)取得表单数据(2)调用业务逻辑(3)页面重定向
二、早期的MVC框架
用户可以直接访问控制层,控制层可以直接操作数据库
这种框架存在很大的弊端:
通过在Servlet中直接对数据库进行增删改查
1、程序十分臃肿,不利于维护;
2、Servlet代码中不仅仅要处理请求和响应,还要处理页面跳转、处理JDBC、处理业务代码、处理逻辑代码......
三、现在演进的一些新框架
对于架构师而言: 没有什么事加一层解决不了的,所以在控制层和数据库之间又加了一层业务层
四、深入理解什么是MVC三层架构
1、Model层
(1)做业务的处理:比如用户登陆、用户注销等操作,里面都是一些业务逻辑 (Service层)
(2)做数据的持久层处理:对数据库进行增删改查 (Dao层)
2、View层
(1)展示数据
(2)提供链接发起Servlet请求(通过一些a标签、Form表单、内联的img链接等等)
3、Controller层 (目前来说就是一些Servlet)
1、接收用户的请求(通过request获取用户的请求参数、Session信息等等)
2、交给业务层处理对应的代码(调用Dao层的增删改查)
3、控制视图层的跳转(如果某个判断正确,进行页面的转发或者重定向操作)
举例说明:(正向的处理信息,那么返回来就是将信息返回给用户,经过前端的一些渲染,用户就可以看到登陆成功或者登陆失败的新的界面了)
用户想在JSP视图层登陆某网站-->Servlet中接收用户登陆的请求(获取登陆的参数,username,password等等)-->交给业务层处理登陆的业务
(判断用户名和密码是否正确,甚至是注册的一些功能,涉及到往数据库进行增删改查的操作,以及对数据库事务的处理)-->Dao层查询用户名
和密码是否正确,将查询的结果向上级返回-->数据库
SpringMVC特点、中心控制器DispatcherServlet
一、SpringMVC优势
1、轻量级,简单易学
2、高效,基于请求响应的MVC框架
3、与Spring兼容性好,无缝结合
4、约定大于配置
5、功能强大:RESTful、数据验证、格式化、本地化、主题等
6、简单灵活
二、SpringMVC中心控制器DispatcherServlet
作用:将请求发到不同的处理器上,即处理不同业务的类
HelloSpringMVC
一、新建项目,添加框架支持
二、确定导入了MVC依赖
<!-- 项目总依赖-->
<dependencies>
<!-- junit测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!-- Jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- jstl依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- SpringMVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
三、配置web.xml,注册DispatcherServlet
<?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">
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联绑定一个springmvc的配置文件(就是我们之前写的Spring核心配置文件):【servlet-name】-servlet.xml-->
<!--contextConfigLocation是写死的,记住,通过这个name才能获取到SpringMVC的配置文件路径
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1(由于系统一启动,可能有些请求就被处理,所以设置启动级别为1,即DispatcherServlet和服务器一起启动)-->
<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的配置文件
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
五、注册映射处理器、处理适配器、视图解析器
<?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">
<!--前缀(前缀一般就是写死的,注意jsp后面还有一个横杠,不要忽略!!!)-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
六、编写HelloController类
package com.guohui.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//注意:这里我们先实现Controller接口
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView 创建模型和视图对象
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中
mv.addObject("msg","HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
//这里面还会有处理业务的代码
return mv;
}
}
七、在springmvc-servlet.xml注册HelloController类
<!--Handler,注册HelloController的Bean-->
<bean id="/hello" class="com.guohui.controller.HelloController"/>
八、部署和发布项目
九、启动服务器
十、页面效果
1、首先跳转到首页
2、地址栏输入hello
十一、总结
现在我们使用SpringMVC来进行页面请求和响应,和以往不同的是现在我们只需要把中心控制器DispatcherServlet在web.xml中进行注册,写好的Ctroller类直接在Springmvc-servlet.xml中注册即可。
我们的DispatcherServlet会对所有的请求进行拦击,拦截后调用Springmvc-servlet.xml中的映射处理器、处理适配器,适配器会安邦我们在Springmvc-servlet.xml中查找有没有对应的类,如果有则进入方法,执行Ctroller方法,然后Ctroller中的方法想要进行请求转发,无需再调用转发的方法,并且路径只写jsp的名称即可,因为这个地方会调用Springmvc-servlet.xml中的视图解析器帮我们把jsp的全路径拼接出来!
至此,你已经掌握了SpringMVC的基础理论以及实现方式,现在的开发项目中,还有不少的项目依旧是MVC的项目,所以很有必要学习和掌握SpringMVC,他对我们将来学习SpringCloud也具有很重要的作用。后续笔者还会持续更新,敬请期待!