Web、MVC、WebMVC概述
1、完成一次web请求的过程
web浏览器发起请求
web服务器接收请求并处理请求,最后产生响应(一般为html)
web服务器处理完成之后,返回内容给web客户端,客户端对接收的内容进行处理并显示出来。
从这里可以看出,在web中 都是web客户端发起请求,web服务器接收处理并产生响应。
一般web服务器是不能主动通知web客户端更新内容。虽然有些技术可以帮我们实现这样的效果,如服务器推技术 Comet 还有HTML5中的websocket等
MVC模型 Model-View-Controller
是一种结构性的模式,本身不引入新功能,只是帮助我们将开发的代码结构,组织的更加合理。
Model模型
数据模型,提供要展示的数据,因此包含数据和行为,行为是用来处理这些数据的。不过现在一般都分离开来 Value Object 数据和服务层 行为 也就是数据中实体或者java bean来提供,行为由service层来提供。
View 视图
负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller 控制器
接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据交给视图,也就是说控制器在中间起到一个调度的作用。
在标准的mvc中,模型能主动推数据给视图进行更新(可以采用观察者模式实现,在模型上注册视图,当模型更新时自动更新视图),但在web开发中模型是无法推给视图,既无法主动更新用户界面,因为在web的访问时请求-响应的模式。必须由客户端主动发出请求后,服务器才能把数据返回。
WEbMVC
web中mvc里面的模型-视图-控制器的概念和标准mvc概念一样,但是在webmvc模式下,模型无法【主动推数据】如果用户想要视图更ixn,需要再发一次请求
servlet-----controller
jsp---------View视图
javabean+service ----Model
SpringWEBMVC
1、springWEBMVC简称SpringMVC
SpringMVC就是spring框架提供的一个模块,通过实现mvc模式来很好的将数据、业务与展现进行分离,SpringMVC框架的目的是简化我们的日常web开发。
SpringMVC框架跟其他的WEBMVC框架一样,都是请求驱动,并且设计围绕一个能够分发请求到控制器以及提供其他加快web应用开发功能的核心叫DispatcherServlet前端控制器 。spring的DispatcherServlet实现比其他框架还要多的功能。他和spring的ioc容器完全整合并且允许使用spring中其他的所有功能。
SpringMVC框架设计的一个核心的原则是 开闭原则,对扩展开放,对修改关闭,所以springMVC框架中很多方法都是final的,不允许用户随意覆盖,但是却提供很多可扩展的机制,SpringMVC目前已经成为非常流行的web应用的框架。
2、SpringMVC框架的核心组件
1、DispatcherServlet:前端控制器,用来过滤客户端发送过来,想要进行逻辑处理的请求。
2、Controller/Headler
控制器/处理器 开发人员自定义,用来处理用户请求的,并且处理完成之后返回给用户指定的视图的对象。
3、HeadlerMapping处理器映射器
DispatcherServlet接收到客户端请求的URL之后,根据一定的匹配规则,再把请求转发给对应的handler,这个匹配规则由HandlerMapping决定。
4、HanglerAdaptor 处理器适配器
处理器适配器用来适配每一个要执行的Handler对象。通过HandlerAdapter可以支持任意的类作为处理器。
5、ViewResolver 视图解析器。Handler返回的是逻辑视图名,需要有一个解析器就能够将逻辑视图名转为实际的物理视图,而且Spring的可扩展性决定了视图,同时用ModelandView中的数据对视图进行渲染。最后把准备好的视图展现给用户。
3、SpringMVC框架在项目中的搭建
1、构建web项目
2、导包
commons-logging-1.2.jar
spring-beans-3.2.4.RELEASE.jar
spring-context-3.2.4.RELEASE.jar
spring-core-3.2.4.RELEASE.jar
spring-expression-3.2.4.RELEASE.jar
spring-web-3.2.4.RELEASE.jar
spring-webmvc-3.2.4.RELEASE.jar
3、配置前端控制器 DispatcherSErvlet
4、编写controlller/Handler控制器
1、收集 验证请求并封装到对象上
2、将对象交给业务层 service,由业务对象处理并返回模型数据。
3、返回modelandView Model部分是业务层返回的模型数据,视图部分为逻辑视图名。
前端控制器 主要负责整体的控制流程调度部分
1、负责将请求委托给控制器进行处理。
2、根据控制器返回逻辑视图名选择具体的视图进行渲染。并把模型数据传入。
Controller唯一一个需要实现的方法是handlerRequest方法,方法中接收两个参数,分别对应servlet对象中的request和response对象。可以从request中获取客户端提交过来的请求参数。
返回值ModelandView 既包含要返回给客户端浏览器的逻辑视图又包含要对视图进行渲染的数据模型。
5、编写处理器映射器 可省去 有默认
BeanNameUrlHandlerMapping:表示将请求的URL和Bean名字映射
6、编写处理器适配器 可省去 有默认
想要正确运行自定义处理器,需要配置处理器适配器,在spring的配置文件中,
SimpleControllerHandlerAdapter:表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作为SpringMVC中的处理器。如果需要其他类型的处理器可以通过实现HadlerAdapter来解决。
7、配置视图解析器 可省去 有默认 前后缀为 “”
当处理器执行完成之后,返回给spring容器一个modelandView对象,这个对象需要能够被解析成与之相对应的视图。并且使用返回的model数据对视图进行渲染。
InternalResourceViewREsolver 用于支持servlet、JSP视图解析。
viewClass:Jstlview表示JSP模板页面需要使用jstl标签库,classpath中必须包含jstl相关的jar包。
prefix和suffix:视图页面的前缀和后缀,
注:昂在web-inf下的页面只能通过内部跳转的方式访问到,因为客户端访问不到wen-inf目录,而且服务器端可以访问到web-inf目录
8、配置控制器 处理器
从默认的配置中可以看出DispatcherServlet在启动时会自动注册这些特殊的Bean,无需我们注册,如果我们注册了,默认的将不会注册。
因此之前的BeanNameUrlHandlerMapping、SimpleControllerHandlerAdapter是不需要注册的,DispatcherServlet默认会注册这两个Bean。
整个访问的流程
1、用户发送请求,前端控制器收到请求后委托给其他解析器处理,前端控制器作为统一访问点,进行全局的流程控制。
2、DispatcherServlet把请求转交给HandlerMapping,或HandlerInterceptor拦截器对象
3、DispatcherServlet再把请求转发给HandlerAdapter,HanglerAdapter会把处理器包装成适配器,从而支持多种类型的处理。
4、HandlerAdapter将会根据适配结果调用真正的处理功能的方法,完成功能处理,并返回一个modelandVIew对象(逻辑视图名,模型数据)
5、modelandView的逻辑视图名交给viewResolver解析器,将视图名解析为具体的view
6、view根据传进来的model模型数据进行渲染,此处的model实际上是一个map数据结构,因此容易支持其他视图技术
7、最后返回DispatcherServlet 由DispatcherServlet返回响应给用户,到此一个流程结束。
DispatcherServlet中的映射路径
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1)拦截所有请求
<url-pattern>/</url-pattern>
此处需要特别强调的是,配置中使用的是/,而不是/*,如果使用/*,那么请求时可以通过DispatcherServlet转发到相应的Controller中,但是Controller返回的时候,如返回的jsp还会再次被拦截,这样导致404错误,即访问不到jsp。
拦截/,例如:/user/add
将来可以实现REST风格的访问
弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。
拦截/*,请求可以走到Controller中,但跳转到jsp时再次被拦截,不能访问到jsp,可以说这是错误的配置。
2)自定义拦截请求的后缀名
拦截*.do、*.html、*.action, 例如/user/add.do
这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。
弊端:
Controller的后缀只能固定成某一个
将来不便于实现REST风格的访问
3)静态资源的访问,如jpg,js,css
如果DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
如果DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。
例如:
<link href="static/css/hello.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="static/js/hello.js"></script>
<img alt="none" src="static/images/logo.png">
解决方式一:利用Tomcat的defaultServlet来处理静态文件
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
或者:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
特点:1.要配置多个,每种文件配置一个。
2.要写在DispatcherServlet的前面(和tomcat版本有关),让defaultServlet先拦截请求, 这样请求就不会进入Spring了
3. 高性能。
解决方式二: 使用<mvc:resources>标签,例如:
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
mapping: 映射
两个*,表示映射指定路径下所有的URL,包括子路径
location:本地资源路径
这样如果有访问/images或者/js或者/css路径下面的资源的时候,spring就不会拦截了
解决方式三: 使用<mvc:default-servlet-handler/>标签
在spring配置文件中加入此标签配置即可
5.spring提供的编码过滤器
查看这个过滤器类源码便可知这里所传的俩个参数的作用
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--上午的-->
SpringMVC周末的学习总结【一】
最新推荐文章于 2021-10-24 23:19:43 发布