什么是MVC
MVC:模型(Model)、视图(View)、控制器(Controller),是一种软件设计规范,就是将业务逻辑、数据、显示分离的方法来组织代码
MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
- Model:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务
- View:负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西
- Controller:接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作
Model2的发展
Model2把一个项目分成三部分,包括视图、控制、模型
- 用户发请求
- Servlet接收请求数据,并调用对应的业务逻辑方法
- 业务处理完毕,返回更新后的数据给servlet
- servlet转向到JSP,由JSP来渲染页面
- 响应给前端更新后的页面
职责分析:
- Controller:控制器
- 取得表单数据
- 调用业务逻辑
- 转向指定的页面
- Model:模型
- 业务逻辑
- 保存数据的状态
- View:视图
- 显示页面
在web早期的开发中,通常采用的都是Model1,但Model2的出现不仅提高的代码的复用率与项目的扩展性,且大大降低了项目的维护成本。Model 1模式的实现比较简单,适用于快速开发小规模项目,Model1中JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。Model2消除了Model1的缺点。
什么是SpringMVC
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架
为什么要学习SpringMVC?
Spring MVC的特点:
- 轻量级,简单易学
- 高效 , 基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定优于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简洁灵活
Spring的web框架围绕DispatcherServlet
[ 调度Servlet ] 设计。
DispatcherServlet
的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁。
MVC框架要做的事情
-
将url映射到java类或java类的方法 .
-
封装用户提交的数据 .
-
处理请求–调用相关的业务处理–封装响应数据 .
-
将响应的数据进行渲染 . jsp / html 等表示层数据
中心控制器
Spring MVC框架像许多其他MVC框架一样,以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)
SpringMVC的原理如下图所示:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
Spring MVC的体系结构
- DispatcherServlet(前端控制器)
- Spring MVC最核心的类
- web.xml中配置
- Handler(处理器):对应MVC中C(Controller层)
- 类型:Object
- 作用:实际处理请求
- 标注了
@RequestMapping
的所有方法都可以看作是一个Handler
- ModelAndView
- 逻辑视图名
- 模型对象
核心组件
- HandlerMapping(处理器映射)
- BeanNameUrlHandlerMapping(默认)
- 将请求URL映射到同名的控制器Bean上
- DefaultAnnotationHandlerMapping
- 将请求映射到标注@RequestMapping注解的控制器和处理方法上
- RequestMappingHandlerMapping
- BeanNameUrlHandlerMapping(默认)
- HandlerAdapter(适配器)
- AnnotationMethodHandlerAdapter
- RequestMappingHandlerAdapter
- ViewResolver(视图解析器)
- InternalResourceView
- InternalResourceView
HelloSpringMVC
1、引入JAR包
在“WEB-INF”目录下,建立“lib”目录,导入 Spring MVC 框架的相关依赖包,同时,在“External Libraries”中也导入相同的 jar 包,其中对于“lib”目录,我们直接把 jar 包复制过来就可以;但是对于“External Libraries”,我们就得通过“Project Structure”进行导入啦。至于需要导入的 jar 包,在我们先前下载的“Spring MVC框架的各种依赖包”中都可以找到,下面附上需要导入的 jar 名称:
spring-aop-3.2.2.jar AOP
spring-aspects-3.2.2.jar AOP
spring-beans-3.2.2.jar 核心包
spring-context-3.2.2.jar 扩展包
spring-context-support-3.2.2.jar 对扩展包支持
spring-core-3.2.2.jar 核心包
spring-expression-3.2.2.jar spring 表达式
spring-web-3.2.2.jar web b/s
spring-webmvc-3.2.2.jar springmvc
com.springsource.org.aopalliance-1.0.0.jar AOP
com.springsource.org.apache.commons.logging-1.1.1.jar 通用日志
2、配置web.xml
servlet
DispatcherServlet(替代所有的servlet) -->主要就是配置 DispatcherServlet,即核心分发器
init-param: classpath:springmvc-servlet.xml
对应的mapping 指定的url-pattern–> / 【不要用/*,会404】
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联SpringMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--这个东西要和服务器一起启动;
load-on-startup,启动级别,数字越小级别越高!-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会经过这个DispatcherServlet请求分发器-->
<!--
/和/*的区别:
< url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;
即:.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /* </ url-pattern > 会匹配*.jsp,
会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--欢迎页面-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3、编写SpringMVC的配置文件
- 让IOC的注解生效
- 静态资源过滤 :HTML,JS,CSS,图片 , 视频 …
- MVC的注解驱动
- 配置视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
<context:component-scan base-package="controller"/>
<!--静态资源过滤-->
<mvc:default-servlet-handler/>
<!--annotation-driven:支持MVC注解驱动 -->
<mvc:annotation-driven/>
<!--
视图解析器
作用;方便统一管理
-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.编写Controller类
- 需要给类加注解 :
@Controller
, 可以让IOC容器管理 , 等价于Bean - 请求映射的路径 :
@RequestMapping
(“路径”),如果类上有就先写类的,在写方法的 - Model :模型传递参数
- return “hello”:它会去视图解析中拼接前缀和后缀来找到对应的视图
@Controller
@RequestMapping("/HelloController")
public class HelloWorldController {
//请求映射("路径")
@RequestMapping("/hello")
public String hi(Model model){
model.addAttribute("msg","Hello,SpringMVC");
System.out.println("进入HELLO");
return "hello"; // WEB-INF/jsp/hello.jsp
}
}
5.视图层
- 注意视图的位置,要和视图解析器对应 web-inf / jsp , 为什么需要在web-inf路径下 , 因为这个路径下的东西用户无法直接访问,更加安全
- 可以通过EL表达式取出Model中存放的值,或者对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
${msg}
</body>
</html>
6.测试
配置Tomcat , 设置项目名 , 开启服务器 , 访问对应的请求路径
流程总结
- 建立web项目
- 导包
- 编写web.xml
- 编写springmvc的配置文件 【servletname】-servlet.xml
- 编写控制类
- 编写视图层
- 测试