目录
1、回顾MVC
1.1、什么是MVC
MVC
是模型
(Model)
、视图
(View)
、控制器
(Controller)
的简写,是一种软件设计规范。
是将业务逻辑、数据、显示分离的方法来组织代码。
MVC
主要作用是
降低了视图与业务逻辑间的双向偶合
。
MVC
不是一种设计模式,
MVC
是一种架构模式
。当然不同的
MVC
存在差异。
Model
(模型):
数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或
JavaBean
组件(包含数据和行为),不过现在一般都分离开来:
Value Object
(数据
Dao
) 和 服务层 (行为Service
)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View
(视图):
负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller
(控制器):
接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型 数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。
最典型的
MVC
就是
JSP + servlet + javabean
的模式。
职责分析:
Controller
:控制器
1.
取得表单数据
2.
调用业务逻辑
3.
转向指定的页面
Model
:模型
1.
业务逻辑
2.
保存数据的状态
View
:视图
1.
显示页面
![](https://i-blog.csdnimg.cn/blog_migrate/c64126e96b62c017ffea6095ed2ce22c.png)
MVC框架要做哪些事情
1.
将
url
映射到
java
类或
java
类的方法
.
2.
封装用户提交的数据
.
3.
处理请求
--
调用相关的业务处理
--
封装响应数据
.
4.
将响应的数据进行渲染
. jsp / html
等表示层数据
.
2、什么是SpringMVC
Spring MVC
是
Spring Framework
的一部分,是基于
Java
实现
MVC
的轻量级
Web
框架
Spring MVC
的特点:
1.
轻量级,简单易学
2.
高效
,
基于请求响应的
MVC
框架
3.
与
Spring
兼容性好,无缝结合
4.
约定优于配置
5.
功能强大:
RESTful
、数据验证、格式化、本地化、主题等
6.
简洁灵活
Spring
的
web
框架围绕
DispatcherServlet
[
调度
Servlet ]
设计。
2.1、中心控制器
Spring
的
web
框架围绕
DispatcherServlet
设计。
DispatcherServlet
的作用是将请求分发到不同的处
理器。从
Spring 2.5
开始,使用
Java 5
或者以上版本的用户可以采用基于注解的
controller
声明方式。 Spring MVC框架像许多其他
MVC
框架一样
,
以请求为驱动
,
围绕一个中心
Servlet
分派请求及提供其他
功能
,
DispatcherServlet
是一个实际的
Servlet (
它继承自
HttpServlet
基类
)
。
![](https://i-blog.csdnimg.cn/blog_migrate/2ed1ea07eca85615d1b8b410c7db0525.png)
SpringMVC
的原理如下图所示:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制
器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者
SpringMVC执行原理
![](https://i-blog.csdnimg.cn/blog_migrate/00b242f8475f56d957d4d27bcfe93a17.png)
图为
SpringMVC
的一个较完整的流程图,实线表示
SpringMVC
框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
简要分析执行流程
1. DispatcherServlet
表示前置控制器,是整个
SpringMVC
的控制中心。用户发出请求DispatcherServlet接收请求并拦截请求。
我们假设请求的
url
为
:
http://localhost:8080/SpringMVC/hello
如上
url
拆分成三部分:
http://localhost:8080
服务器域名
SpringMVC
部署在服务器上的
web
站点
hello
表示控制器
通过分析,如上
url
表示为:请求位于服务器
localhost:8080
上的
SpringMVC
站点的
hello
控制器。
2. HandlerMapping
为处理器映射。
DispatcherServlet
调用
HandlerMapping,HandlerMapping
根据
请求
url
查找
Handler
。
3. HandlerExecution
表示具体的
Handler,
其主要作用是根据
url
查找控制器,如上
url
被查找控制器
为:
hello
。
4. HandlerExecution
将解析后的信息传递给
DispatcherServlet,
如解析控制器映射等。
5. HandlerAdapter
表示处理器适配器,其按照特定的规则去执行
Handler
。
6. Handler
让具体的
Controller
执行。
7. Controller
将具体的执行信息返回给
HandlerAdapter,
如
ModelAndView
。
8. HandlerAdapter
将视图逻辑名或模型传递给
DispatcherServlet
。
9. DispatcherServlet
调用视图解析器
(ViewResolver)
来解析
HandlerAdapter
传递的逻辑视图名。
10.
视图解析器将解析的逻辑视图名传给
DispatcherServlet
。
11. DispatcherServlet
根据视图解析器解析的视图结果,调用具体的视图。
12.
最终视图呈现给用户。
HelloSpring
配置springmvc
1.
新建一个
Moudle
, 添加
web
的支持!
2.
确定导入了
SpringMVC
的依赖!
3.
配置
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的配置文件:【servlet-name】-servlet.xml-->
<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>
4.
编写
SpringMVC
的 配置文件!名称:
springmvc-servlet.xml : [servletname]-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">
</beans>
5.
添加 处理映射器
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
"/>
6.
添加 处理器适配器
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
"/>
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>
springmvc配置文件默认写法
<?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">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
注解版实现springmvc
配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://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="com.kuang.controller"/>
<!-- 让Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
<!--
支持mvc注解驱动
在spring中一般采用@RequestMapping注解来完成映射关系
要想使@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping
和一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理。
而annotation-driven配置帮助我们自动完成上述两个实例的注入。
-->
<mvc:annotation-driven />
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver
"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
在视图解析器中我们把所有的视图都存放在
/WEB-INF/
目录下,这样可以保证视图安全,因为这个
目录下的文件,客户端不能直接访问。
创建Controller
编写一个
Java
控制类:
com.kuang.controller.HelloController ,
注意编码规范 、
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/HelloController")
public class HelloController {
//真实访问地址 : 项目名/HelloController/hello
@RequestMapping("/hello")
public String sayHello(Model model){
//向模型中添加属性msg与值,可以在JSP页面中取出并渲染
model.addAttribute("msg","hello,SpringMVC");
//web-inf/jsp/hello.jsp
return "hello";
}
}
@Controller
是为了让
Spring IOC
容器初始化时自动扫描到;
@RequestMapping
是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该
是
/HelloController/hello
;
方法中声明
Model
类型的参数是为了把
Action
中的数据带到视图中;
方法返回的结果是视图的名称
hello
,加上配置文件中的前后缀变成
WEB-INF/jsp/
hello
.jsp
小结
实现步骤其实非常的简单:
1.
新建一个
web
项目
2.
导入相关
jar
包
3.
编写
web.xml ,
注册
DispatcherServlet
4.
编写
springmvc
配置文件
5.
接下来就是去创建对应的控制类
, controller
6.
最后完善前端视图和
controller
之间的对应
7.
测试运行调试
.
使用
springMVC
必须配置的三大件:
处理器映射器、处理器适配器、视图解析器
通常,我们只需要
手动配置视图解析器
,而
处理器映射器
和
处理器适配器
只需要开启
注解驱动
即可,而
省去了大段的
xml
配置