SpringMVC:学习笔记(1)——理解MVC及快速入门
SprigMVC—理解MVC及快速入门
说明:
传统MVC——>JSPModel2——>Front Controller + Application Controller + Page Controller + Context 三种模式是JavaWeb设计模式的逐渐适配和演进。本文分别讲述了这三种模式,作为了解即可。SpringMVC正是采用了第三种设计模式。
MVC
说明
MVC是Xerox PARC在20世纪80年代为编程语言SmallTalk发明的一种软件设计模式。
MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开。
MVC将应用程序分成3个核心模块:模型、视图、控制器,他们相互联结又分别担当不同的任务,如图示所示。
图示
理解
☐ 模型:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是JavaBean,一个模型可以为多个视图提供数据。
☐ 视图:负责模型的展示,一般就是我们见到的用户界面,客户想要看到的东西。
☐ 控制器:控制器负责应用的流程控制,所谓流程控制就是接受用户请求,委托给模型进场处理,后获取模型数据交由视图展示。
JSPModel2
说明
在早期的Web应用中,JSP负责处理业务逻辑、控制网页流程并创建HTML页面。基本上JSP包揽的所有的模块,这无疑造成了不少的困扰:
比如:
☐可维护性差
☐调试困难
☐ HTML与Java程序代码强耦合在一起
☐ 内嵌的流程控制逻辑,要理解应用程序的逻辑必须浏览所有的JSP页面。
为了解决这些问题,SUN公司先后制定了两种设计模式,分别为Model1和Model2。虽然Model1在一定程序上实现了MVC中的视图和模型,但是他的运用并不理想,知道Model2的出现才改变了这种局面。
Model2中用JSP技术实现了视图的功能、用Servlet技术实现了控制器的功能、用JavaBean技术实现了模型的功能。
图解
Front Controller + Application Controller + Page Controller + Context
说明
前端控制器+应用控制器+页面控制器(也有称其为动作)+上下文,也是一种WebMVC模型,只是责任更加明确,SpringMVC正是这种模式。
运行流程图
职责
Front Controller:前端控制器,负责为表现层提供统一访问点,从而避免Model2中出现的重复的控制逻辑(由前端控制器统一回调相应的功能方法,如前边的根据submitFlag=login转调login方法);并且可以为多个请求提供共用的逻辑(如准备上下文等等),将选择具体视图和具体的功能处理(如login里边封装请求参数到模型,并调用业务逻辑对象)分离。
Application Controller:应用控制器,前端控制器分离选择具体视图和具体的功能处理之后,需要有人来管理,应用控制器就是用来选择具体视图技术(视图的管理)和具体的功能处理(页面控制器/命令对象/动作管理),一种策略设计模式的应用,可以很容易的切换视图/页面控制器,相互不产生影响。
Page Controller(Command):页面控制器/动作/处理器:功能处理代码,收集参数、封装参数到模型,转调业务对象处理模型,返回逻辑视图名交给前端控制器(和具体的视图技术解耦),由前端控制器委托给应用控制器选择具体的视图来展示,可以是命令设计模式的实现。页面控制器也被称为处理器或动作。
Context:上下文,还记得Model2中为视图准备要展示的模型数据吗,我们直接放在request中(Servlet API相关),有了上下文之后,我们就可以将相关数据放置在上下文,从而与协议无关(如Servlet API)的访问/设置模型数据,一般通过ThreadLocal模式实现。
HelloWorld
0.说明
现在我们以前了解了MVC编程模型,接下来我们实际地编写一个SpringMVC入门实例,我们现在还不能解所有的技术细节,但是在接下来的博客一定会有相关解释。
1.加入Jar包
说明:
点击链接(http://projects.spring.io/spring-framework/)进入官方网站,页面右侧选择4.0版本进行下载,下载完毕后添加以上Jar包到Java环境变量中。
2.配置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_3_1.xsd"version="3.1"><!--配置DispatcherServlet--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--配置初始化参数:作用是配置SpringMVC配置文件的位置和名称--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:dispatcherServlet-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
说明:
DispatcherServlet是前端控制器设计模式的实现,提供了Spring Web MVC的集中访问点。
与其它web MVC框架一样,Spring的web MVC框架是一个请求驱动的web框架,其设计围绕一个中心的servlet进行, 它能将请求分发给控制器,并提供其它功能帮助web应用开发。然而,Spring的DispatcherServlet 所做的不仅仅是这些,它和Spring的IoC容器完全集成在一起,从而允许你使用Spring的其它功能。
请求处理流程:
3.加入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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--配置自动扫描的包--><context:component-scan base-package="handles"/><!--配置视图解析器:如何把handle方法返回值解析为实际的物理视图--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/></bean>
</beans>
说明:
视图解析器用来解析视图。如上视图解析器配置有前缀和后缀两个属性,这样一来,view路径将会缩短。
4.创建请求处理器类(编写控制器)
说明:
这里我们使用了注解@Controller ,可以表明了该类作为一个控制器,而不需要你扩展任何控制器基类或者引用ServletAPI。当然,如果需要还是可以引用特定Servlet功能。注解@Controller的基本目标是担任所注解的类的原型的角色,指明它的职责。
所注解的控制器Bean可以被显示定义。@Controller也允许自动侦测。要实现队所注解的控制器的自动侦测,必须要像配置中加入组件扫描的部分的语句。
<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="org.springframework.samples.petclinic.web"/><!-- ... --> </beans>
5.编写JSP页面(编写视图)
/WEB-INF/views/success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>Hello,World!
</body>
</html>
6.简单说明及测试
控制器return返回了视图的名称,我们在SpringMVC 中设置了如何解析处理器返回值为视图。
所以当我们访问/helloworld后我们会被处理器跳转到success.jsp页面。
转载于:https://www.cnblogs.com/MrSaver/p/6424291.html
SpringMVC:学习笔记(1)——理解MVC及快速入门相关推荐
- springMVC学习笔记(二)-----注解和非注解入门小程序
阅读目录 一:基础环境准备 二:非注解的处理器和映射器 三:注解的处理器映射器和适配器 四:springmvc.xml中的内容以及项目工程目录 最近一直在做一个电商的项目,周末加班,忙的都没有时间更新 ...
- java培优学习笔记(一)多线程快速入门
一.课程目标 线程与进程 为什么要使用多线程? 多线程应用场景 多线程创建方式 练习题 线程生命周期 面试总结 练习题 二.线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线 ...
- 【Python学习笔记】超详细Python快速入门教程(下)
文章目录 031 变量的作用域 032 递归函数 033 异常处理机制 034 class自定义类 035 object内置类 036 多态 037 特殊方法和属性 038 类的深拷贝和浅拷贝 039 ...
- TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅
TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...
- springmvc学习笔记(19)-RESTful支持
springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...
- SpringMVC学习笔记
文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...
- SpringMVC学习笔记整理
SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记: 导入jar包 一:springmvc工作流程. ①. servlet容器初始化一个request请求 ②. Di ...
- JavaEE 企业级分布式高级架构师(四)SpringMVC学习笔记(4)
SpringMVC学习笔记 高级应用篇 ControllerAdvice @ControllerAdvice @ModelAttribute 作用于方法 作用于方法参数 @InitBinder @Ex ...
- SpringMVC学习笔记_01
SpringMVC学习笔记_01 1.JAVAEE体系结构 JAVAEE体系结构图如下所示: 2.什么是springmvc? 什么是mvc? Model1 Model2 SpringMVC是什么? S ...
最新文章
- c++中使用Tesseract-OCR
- python_Django之模板模型
- C语言实验——拍皮球_JAVA
- Python爬虫遍历文档树
- 【拔刀吧少年】之awk文本和数据处理编程语言
- [20170412]bbed恢复修改记录(不等长).txt
- PAT甲级 -- 1148 Werewolf - Simple Version (20 分)
- ES6使用object的is()方法比较两个值
- STM32F407控制AD7606 采用HAL库的TIM和SPI
- Linux Vim基本操作(文件的打开和编辑)完全攻略(有图有真相)
- java 蓝桥杯算法训练 纪念品分组(题解)
- php面向对象开发技术 课本,PHP面向对象编程-高级技术书 - php
- java计算机毕业设计企业员工考勤系统的设计与实现源代码+数据库+系统+lw文档
- re.compile(r'xxx')中的r是什么意思
- 用IP地址签发SSL证书
- 単語ーー下げる(さげる)
- 解决:fatal: unable to access ‘https://github.com/xxxxxxxxxxxxxxx/‘: Failed to connect
- mnist数据集在FATE上应用
- 男人、女人都 值得推荐的经典电影
- POV-RAY基础教程 - 相机(6)
热门文章
- android开发 解析 b5,张绍文android开发高手课读书笔记4-启动优化篇
- java单例设计模式双重_Java 设计模式 ——单例模式(饿汉,懒汉,双重锁,静态内部类)...
- linux tcp 断网重连,LIS接口与串口服务器的KeepAlive的重连机制
- 如何用html构建ios应用,使用HTML5构建iOS原生APP(5)
- java读取文件到字符串_Java读取文件到字符串
- 如何使用PyTorch torch.max()
- Java try-catch示例
- python set_Python Set联合
- Android Volley教程
- primefaces教程_Primefaces FileUpload组件示例教程