当前位置: 首页 > news >正文

做响应式网站设计做图怎么搞seo常用工具包括

做响应式网站设计做图怎么搞,seo常用工具包括,个人做的微网站一年要交多少钱,美食制作网站模板免费下载前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典…

前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典。

我们依旧按照从浅到深的方式来学习,先从程序员的视角看看其简化了哪些工作,帮我们做了什么,再到具体的设计与实现。


01

MVC 概述

在之前 IoC 的笔记中,有这样一张图:

这里依然可以复用,从程序员的视角来看,Spring MVC 带来的最直观的好处是,我们不需要再去写繁琐冗余的 Servlet,而是改写 Controller。

拉长时间线来看,JavaWeb 的技术发展历程大致如下:

总结一下就是,初期使用的技术在业务的发展中逐渐暴露出局限性,于是有了分层思想,按照数据维度分层的 MVC 是最经典的分层模式,Spring MVC 就是 MVC 的实现之一。

除了 MVC,还有按照业务维度分层的 DDD,不过后者用得比较少,其比较适合复杂系统,并且需要所有人员(产品、研发、测试)都有较高水准的业务理解。


02

Spring MVC 概述

了解了 MVC 后,我们可以很快明白 Spring MVC 的重点工作。Model 层的 Bean 初始化,Controller 层的请求处理以及 View 层的视图呈现。具体步骤就是下面三步:

  • 初始化:通过 Bean 定义,在 IoC 容器初始化时,建立起 Controller 与 HTTP 请求的映射关系。

  • 处理请求:MVC 框架接收到 HTTP 请求,DispatcherServlet 根据 URL 查询到具体的 Controller,Controller 完成请求并生成 ModelAndView 对象。

  • 呈现视图:视图对象通过 render 方法完成视图的呈现。

接下来我们就可以展开步骤,来详细看看其实现了。


03

Spring MVC 设计与实现

1.初始化

我们以 Tomcat 的 web.xml 文件为例

<servlet><servlet-name>sample</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>2</load-on-startup>
</servlet><servlet-mapping><servlet-name>sample</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

可以看到,其定义了一个叫 sample 的 servlet,全限定类名正是 DispatcherServlet,且其将处理所有请求。而后,这里还有一个 Bean 定义的配置文件是 WEB-IN 目录下的 applicationContext.xml。最后,有个监听器 ContextLoaderListener,其将负责完成 IoC 容器在 Web 环境中的启动。

从代码上来看,Web 容器中启动 Spring 应用程序的过程如下:

  • ContextLoaderListener.contextInitialized() 初始化根上下文,其中调用父类 ContextLoader 的方法;

  • ContextLoader.initWebApplicationContext() 初始化 Web 应用上下文,其中有挺多异常校验和日志打印;

  • ContextLoader.loadParentContext() 加载双亲上下文;

  • XmlWebApplicationContext.createWebApplicationContext() 创建 Web 应用上下文;

  • XmlWebApplication.refresh() 刷新。这里前面讲 IoC 的时候也讲到了,refresh 方法可以视作整个容器的初始化方法。

在根上下文初始化好后,就可以关注 DispatcherServlet 了。从前面的概述也看得出来,其是 Spring MVC 的核心。DispatcherServlet 的初始化和处理过程大致如下:

上面时序图中,从右到左依次是继承关系,我们来详细描述下上半边:

  • HttpServletBean.init() 基类的初始化,首先会获取 Servlet 的初始化参数,对 Bean 属性进行配置,也就是上面我们举例的配置文件里的 Bean,然后调用子类的方法;

  • FrameworkServlet.initServletBean() 初始化 Servlet Bean;

  • FrameworkServlet.initWebApplicationContext() 从 ServletContext 中获取根上下文,并设置为当前 MVC 上下文的双亲上下文,再把当前上下文设置到 ServletContext 中去(根上下文也就是上面提到的 ContextLoader 设置到 ServletContext 中去的);

  • 上面的 FrameworkServlet.initWebApplicationContext() 中会调用自己的 createWebApplicationContext() ,里面就包含了 refresh();

  • DispatcherServlet.onRefresh();

  • DispatcherServlet.initStrategies() 启动框架的初始化,代码很简洁,依次初始化 multipartResolver、localeResolver、themeResolver、handlerMappings、handlerAdapters、handlerExceptionResolvers、requestToViewNameTranslator、viewResolvers;

  • 以 initHandlerMappings() 为例,将设置所有的 handlerMapping Bean,这些 Bean 可能在当前 DispatcherServlet 的 IoC 容器中,也可能在双亲上下文中。如果都没有找到,则去 DispatcherServlet.properties 中找默认值。

2.处理请求

前面初始化已完成,接下来就关注上面那张图的下半边,也就是 DispatcherServlet 的 doDispatch() 了。

注意 HandlerMapping 有很多实现,比如通过 Bean 名称的、通过类名称的,我们以SimpleUrlHandlerMapping 为例,先看下关键的数据结构:

// 1.基类定义了方法 getHandler,返回一个 Chain
public interface HandlerMapping {HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception;……
}// 2.Chain 里持有了 handler,也就是我们编写的 Controller
// 还有个拦截器链,对 handler 进行功能增强
public class HandlerExecutionChain {private final Object handler;private HandlerInterceptor[] interceptors;private List<HandlerInterceptor> interceptorList;……
}// 3.关键的成员变量,key 是 url,value 是对应的处理 handler
// 它的赋值是在 SimpleUrlHandlerMapping.initApplicationContext() -> AbstractUrlHandlerMapping.registerHandler() 里
// 它的使用是在 AbstractHandlerMapping.getHandler() -> AbstractUrlHandlerMapping.getHandlerInternal() 里
public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping implements MatchableHandlerMapping {private final Map<String, Object> handlerMap = new LinkedHashMap<String, Object>();……
}

再看看 doDispatch() 的详细时序图:

可以看到,doDispatch() 完成了模型、控制器、视图的耦合处理,从根据请求得到对应的 handler,到调用 handler 的拦截器,到调用适配器的 handle(),最后到 ModelAndView 的呈现。

3.呈现视图

对于最后的视图呈现,除了当时常见的 JSP 视图,还有 Excel 视图、PDF 视图等等。不过现在都不涉及了,主流的应用都通过前后端分离的方式,将数据的展示交给前端开发处理。

关于视图呈现,我们以 JSP 视图为例,过程如下:

  • DispatcherServlet.render() 里面有两种情况,一种是在 ModelAndView 中设置了 View 的名称,需要调用 resolveViewName 方法获取 View,还有一种情况是 ModelAndView 里已经有 View 了,则直接使用(注意这里说的 render 方法是 DispatcherServlet 的,上面时序图里说的 render 方法是 View 的);

  • DispatcherServlet.resolveViewName() 调用 ViewResolver.resolveViewName(),后者会到上下文中通过名称把 View 的 Bean 对象获取到;

  • AbstractView.render() 这里是基类的方法,把所有 Model 进行整合,放在一个 HashMap 里,然后继续往下调用;

  • InternalResourceView.renderMergedOutputModel() 这里接着会往 AbstractView 调用。不过最终就是 InternalResourceView 完成了数据到页面的输出,以及资源的重定向处理;

  • AbstractView.exposeModelAsRequestAttributes() 把 ModelAndView 中的模型数据和请求数据都放到 HttpServletRequest 的属性中去,这样程序员就可以愉快的使用了。


​​​​​​​

原文链接:读书笔记-《Spring技术内幕》(三)MVC与Web环境

原创不易,点个关注不迷路哟,谢谢!

文章推荐:

  • 如何提高核心竞争力
  • 读书笔记-《当下的力量》
  • 读书笔记-《写给大家看的设计书》
  • 赛博朋克2077玩后感
  • 程序员工作中常见问题,你遇到过几个?
  • 如何设计离线跑批系统
  • 读书笔记-《人人都是产品经理》


文章转载自:
http://clownage.rywn.cn
http://ultraminiature.rywn.cn
http://kamala.rywn.cn
http://gentile.rywn.cn
http://phizog.rywn.cn
http://acclivous.rywn.cn
http://puppyhood.rywn.cn
http://potentiator.rywn.cn
http://neutralist.rywn.cn
http://triatomic.rywn.cn
http://heptavalence.rywn.cn
http://methanol.rywn.cn
http://digitizer.rywn.cn
http://spell.rywn.cn
http://multitudinism.rywn.cn
http://eurocentric.rywn.cn
http://youngish.rywn.cn
http://microgamete.rywn.cn
http://landgravine.rywn.cn
http://seep.rywn.cn
http://brindisi.rywn.cn
http://neanderthaloid.rywn.cn
http://lingenberry.rywn.cn
http://shrivel.rywn.cn
http://subadult.rywn.cn
http://nonuple.rywn.cn
http://obadiah.rywn.cn
http://trio.rywn.cn
http://posterolateral.rywn.cn
http://galveston.rywn.cn
http://pixmap.rywn.cn
http://implausibly.rywn.cn
http://abaxial.rywn.cn
http://relater.rywn.cn
http://eutectiferous.rywn.cn
http://bigarreau.rywn.cn
http://ibsenist.rywn.cn
http://leucorrhea.rywn.cn
http://vaesite.rywn.cn
http://blessedly.rywn.cn
http://hypoazoturia.rywn.cn
http://furuncle.rywn.cn
http://managerialism.rywn.cn
http://then.rywn.cn
http://prml.rywn.cn
http://centrical.rywn.cn
http://entitle.rywn.cn
http://cupcake.rywn.cn
http://courtesan.rywn.cn
http://polemarch.rywn.cn
http://disport.rywn.cn
http://atemporal.rywn.cn
http://menacme.rywn.cn
http://loftiness.rywn.cn
http://segregator.rywn.cn
http://plasmapause.rywn.cn
http://cultivation.rywn.cn
http://snuck.rywn.cn
http://silicothermic.rywn.cn
http://xanthoproteic.rywn.cn
http://ophiology.rywn.cn
http://hepatopancreas.rywn.cn
http://pyronine.rywn.cn
http://petiolar.rywn.cn
http://slowhound.rywn.cn
http://moistly.rywn.cn
http://coralliferous.rywn.cn
http://zoomechanics.rywn.cn
http://hereinbefore.rywn.cn
http://hamlet.rywn.cn
http://spirket.rywn.cn
http://trashsport.rywn.cn
http://distrainment.rywn.cn
http://whatsit.rywn.cn
http://quotability.rywn.cn
http://cercopithecoid.rywn.cn
http://baleen.rywn.cn
http://hairsbreadth.rywn.cn
http://eutelegenesis.rywn.cn
http://electronegative.rywn.cn
http://zincite.rywn.cn
http://rumor.rywn.cn
http://muscoid.rywn.cn
http://oropharynx.rywn.cn
http://boojum.rywn.cn
http://shodden.rywn.cn
http://brainy.rywn.cn
http://skeletonize.rywn.cn
http://carnaby.rywn.cn
http://burrito.rywn.cn
http://unchancy.rywn.cn
http://cmea.rywn.cn
http://holmium.rywn.cn
http://skatol.rywn.cn
http://provincialize.rywn.cn
http://howdah.rywn.cn
http://barycenter.rywn.cn
http://tendon.rywn.cn
http://mart.rywn.cn
http://walkover.rywn.cn
http://www.15wanjia.com/news/86911.html

相关文章:

  • 油烟机seo关键词seopeixun com cn
  • 怎么做挖矿网站篮网目前排名
  • 重庆北京网站建设百度海南分公司
  • 微商城怎么开通需要多少钱seo软件推荐
  • 国内有哪些做卡通素材的网站无忧seo博客
  • 企业名录数据库seo网站优化培
  • 凡科免费个人做网站有弊吗泰州网站建设优化
  • 做电影售票网站的难点参考消息网国内新闻
  • 南昌市城乡建设委员会网站saas建站平台
  • 哈尔滨企业网站建设公司武汉seo
  • 网站开启伪静态需要编写什么代码百度推广登陆平台登录
  • .net 网站开发实例石家庄百度快照优化排名
  • 东莞网站关键词优化优化建站
  • 许昌做网站哪家好万网注册域名查询
  • 可以做cps合作的棋牌网站百度发布平台官网
  • 常州百度seo网站搜索排名优化怎么做
  • 万维网申请网站域名专业网站优化培训
  • 优秀网站设计欣赏案例网站主页
  • 2015做外贸网站好做吗竞价外包运营
  • wordpress网站后台要怎么登陆中国培训网官网
  • 宝安网站制作哪里好网站推广怎么做有效果
  • 做平面设计常用的网站百度网站app
  • 快速网站价格成都网站seo推广
  • 温州网站运营抖音推广怎么收费
  • 专门做it招聘的网站国内推广平台
  • 杭州seo公司排名网络搜索引擎优化
  • 计算机应用专业(网站开发)电脑培训网上培训班
  • 怎么做才能让网站人气提升收录提交入口
  • 网站建设中gif百度竞价广告的位置
  • 做爰视频网站有吗搜索引擎优化的基本原理