Spring MVC设计模式
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器
使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
Model(模型)
表示应用程序核心(比如数据库记录列表)。
是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)
显示数据(数据库记录)。
是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)
处理输入(写入数据库记录)。
是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
视图
模型
控制器
MVC 从逻辑上把应用分为模型组件,视图组件和控制器组件。其中控制器组件又可以细分为:前端控制器组件和后端控制器组件。
MVC 的基本工作流程:
首先是客户端(通常是浏览器)发出一个请求。第一个接受这个请求的组件一般是一个前端控制器。它将不同的请求交给不同的后端控制器来处理,而在后端控制器里面又可以调用相应的模型对象来处理具体的业务逻辑,最后再返回一个特定的视图响应给客户端。
第一个接受这个请求的前端控制器叫 DispatcherServlet
后端控制器叫 Controller
负责处理请求 URL 和后端控制器映射的叫 HandMapping(它有多种类型,比较灵活,也是在一个 xml 文件上进行配置)
负责业务逻辑处理的模型对象一般也是我们平常写的 DAO/DTO 组件(只是它最后的返回更灵活, Controller 返回一个 ModelAndView 对象给 DispatcherServlet , ModelAndView 可以携带一个视图对象,也可以携带一个视图对象的逻辑名。如果携带的是一个视图对象的逻辑名,那 DispatcherServlet 需要一个 ViewResolver 来查找用于渲染回应的视图对象。最后, DispatcherServlet 将请求分派给 ModelAndView 对象指定的视图对象。视图对象负责渲染返回给客户的回应。)
跑一个最简单的例子,让大家对构建 SpringMVC 的基本步骤有个直观的认识
(1) 建立动态 web 工程,导入 spring 的 jar 包。
(2) 配置 DispatcherServlet
DispatcherServlet 是 SpringMVC 的核心,将下面 Servlet 的注册信息登记在 web.xml 中
<servlet>
<servlet-name> test </servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name> test </servlet-name>
<url-pattern> *.do </url-pattern>
</servlet-mapping>
(3) 编写 Controller ,做核心配置文件,并配置 url 和 Controller 的映射
package com.wepull.test; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller; public class HelloController implements Controller{ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { request.setAttribute( "hello" , "welcome to spring!" ); return new ModelAndView( " welcome " ); } }
在 WEB-INF 下新建一 XML 文件 : test -servlet.xml. 注意,这里的 test 取决于 servlet 的名字 . 当 DispatcherServlet 载入后,它将试图从这个文件中载入应用上下文。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 缺省映射处理器,不需要明确声明,但声明后就非常清楚使用的是哪个映射处理器 -->
<bean id = "beanNameUrlMapping" class = "org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
<!-- 这里的 name 属性有两个职责,既定义 Bean 的名字,也定义需要这个控制器处理的 URL 样式 -->
<bean name = "/hello.do" class = "com.wepull.test.HelloController">
</bean>
</beans>
上面可能有人奇怪,为什么不用 id 属性,而设置 name 属性。这里是因为 URL 中含有 XML id 属性非法字符——特别是斜杠( / ) ;
(4) 配置一个视图解析器将控制器与 JSP 结合起来。
将解析器的配置片段加到上面的 test-servlet.xml 中
<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
< property name = "prefix" value = "/WEB-INF/jsp/" />
< property name = "suffix" value = ".jsp" />
</bean>
InternalResourceViewResolver 在 ModelAndView 返回的视图名前加上 prefix 属性配置的前缀 , 再在最后加上 suffix 属性配置的后缀。如 HelloController 返回的 ModelAndView 中视图名为 welcome, 所以 InternalResourceViewResolver 将在 /WEB-INF/jsp/welcome.jsp 处查找视图。
(5) 编写呈现给用户的 jsp 文件。
/WEB-INF/jsp/welcome.jsp
<%@ page contentType = "text/html; charset=UTF-8" %> <%@ page isELIgnored = "false" %> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < html xmlns = "http://www.w3.org/1999/xhtml" > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> < title > Hello World! </ title > </ head > < body > < h2 > ${hello} </ h2 > </ body > </ html >
完成后启动服务器,在浏览器地址栏上输入 http://locahost:8080/projectName/hello.do 就可以访问了。
mvc中的映射关系HandlerMapping
springMVC 里有个映射处理器 (HandlerMapping) 的概念。它实际上是一个处理器映射 Bean, 用来将一个控制器指定到一个 URL 上。 Spring 提供了三种有用的 HandlerMapping 的实现:
BeanNameUrlHandlerMapping 根据控制器的名字将控制器映射到 URL SimpleUrlHandlerMapping 用上下文配置文件中定义的属性集合将控制器映射到 URL CommonsPathMapHandlerMapping 使用控制器代码中的元数据将控制器映射到 URL
mvc中的试图解析器ViewResolver
springMVC 里还有个视图解析器 (ViewResolver) 的概念。它决定了 ModelAndView 对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图 Bean..Spring 有四种 ViewResolver 实现:
InternalResourceViewResolver 将逻辑视图名解析成一个用模板文件 ( 如 JSP 和 Velocity 模板 ) 渲染的视图对象 BeanNameViewResolver 将逻辑视图名解析成一个 DispatcherServlet 应用上下文中的视图 Bean ResourceBundleViewResolver 将逻辑视图名解析成一个 ResourceBundler 中的视图对象 XmlViewResolver 从一个 XML 文件中解析视图 Bean, 这个文件是从 DispatcherServlet 应用上下文中分离出来的。
Spring MVC设计模式的更多相关文章
- 基于Spring MVC 实现拦截器
Spring MVC 拦截器 一,具体内容: 在所有的开发之中拦截器属于一个重要的组件,可以说几乎所有的项目都会提供的概念应用,不管是Spring MVC,还是Struts 2.x都是提供有拦截器的, ...
- 第14 章 Spring MVC的工作机制与设计模式
14.1 Spring MVC的总体设计 要使用SPring MVC,只要在web.xml中配置一个DispatcherServlet. 再定义一个dispatcherServlet-servlet. ...
- 第十四章 Spring MVC的工作机制与设计模式(待续)
Spring MVC的总体设计 Control设计 Model设计 View设计 框架设计的思考 设计模式解析之模版模式
- Spring MVC -- MVC设计模式(演示4个基于MVC框架的案例)
对于简单的Java Web项目,我们的项目仅仅包含几个jsp页面,由于项目比较小,我们通常可以通过链接方式进行jsp页面间的跳转. 但是如果是一个中型或者大型的项目,上面那种方式就会带来许多维护困难, ...
- Java面试题(设计模式篇+Spring/Spring MVC篇)
设计模式 88.说一下你熟悉的设计模式? 自行熟悉. 89.简单工厂和抽象工厂有什么区别? 简单理解简单工厂:对 一个对象的创建进行封装.抽象工厂:对 一组对象的创建进行封装. 比如生产 陶瓷马 和 ...
- Spring7:基于注解的Spring MVC(下篇)
Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...
- Spring MVC中文文档翻译发布
前后经过九个月,我翻译的Spring MVC官方4.2.4版本中文文档可以发布第一个较为完整的版本了.译文上尽量做到准确并且符合中文习惯,让人能读懂,能理解.现全文发布如下,也希望它能够给出其价值,并 ...
- Spring Mvc的入门
SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的. Spring Web MVC是什么: Sprin ...
- Spring MVC中Session的正确用法<转>
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
随机推荐
- Google Map API 使用总结
Google Map API (一):显示一个最基本的地图 1 实现一个地图:<head>中引用: <script type="text/javascript" ...
- CSS3实现气泡效果
首先定义一个 <p class="speech"></p> 先给外层的容器添加样式: p.speech { position: relative; widt ...
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- [cb] Assetbundle打包(一)
一.简介 Unity的Assetbundle是Unity Pro提供的功能. 理解:Asset 资源,资产:Bundle :包,一批,捆:字面上的意思,就是把资源打包. 在项目中怎么使用Assetbu ...
- 部署Zipkin分布式性能追踪日志系统的操作记录
Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务. 部署Zipkin环境的操作记录:部署Zipki ...
- ab压测&htop工具
1,apache bech 参考: http://www.nginx.cn/110.html http://www.ha97.com/4617.html ===================== y ...
- [tools]神器notepad++
1,现象 notepad++编辑sh文件,放入linux后执行会有问题 2,解决: 2.1dos2unix转换文件 2,2 修改notepad++默认字符集 2,快捷键: ctrl+k 单行.多行注释 ...
- Linux 网络编程七(非阻塞socket:epoll--select)
阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...
- 突然想起android与mfc差异
两者都可以算作是客户端程序,都是做上位机用的.而且都是被动执行. 相同点: 1.MFC中,它是由 project的名字 里面的某个成员函数来初始化,窗体,以及窗体里面的变量. 后面都是监听消息循环.数 ...
- php基础19:文件
<?php //1.打开文件的更好的方法是通过 fopen() 函数.此函数为您提供比 readfile() 函数更多的选项. //fopen() 的第一个参数包含被打开的文件名,第二个参数规定 ...