springmvc工作机制(原理)

  DispatcherServlet主要用作职责调度工作,本身主要用于控制流程

  1、springmvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作;

  2、DispatcherServlet查询一个或多个

  HandlerMapping,找到处理请求的Controller;

  3、DispatcherServlet将请求提交到目标Controller;

  4、Controller进行业务逻辑处理后,会返回一个ModelAndView;

  5、DispathcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象;

  6、视图负责将结果显示到客户端;视图对象负责渲染返回给客户端。

  DispatcherServlet:前端控制器;(相当于一个转发器,中央处理器,调度)

  ModelAndView:模型和视图的结合体;(Springmvc的底层对象)

  HandlerMapping:处理器映射器

  springmvc运行原理

  1、客户端请求提交到DispatcherServlet;

  2、由DispatcherServlet控制器查询一个或多HandlerMapping,找到处理请求的Controller;

  3、DispatcherServlet将请求提交到Controller;

  4、Controller调用业务逻辑处理后,返回ModelAndView;

  5、DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图;

  6、视图负责将结果显示到客户端。

  DispatcherServlet是整个SpringMVC的核心。它负责接收HTTP请求组织协调SpringMVC的各个组成部分。其主要工作有以下三项:

  1、截获符合特定格式的URL请求;

  2、初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联;

  3、初始化SpringMVC的各个组成组件,并装配到DispatcherServlet中。

  Hibernate工作原理及为什么要用?

  原理:

  1、读取并解析配置文件

  2、读取并解析映射信息,创建SessionFactory

  3、打开Sesssion

  4、创建事务Transation

  5、持久化操作

  6、提交事务

  7、关闭Session

  8、关闭SesstionFactory

  为什么要用:

  1、对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;

  2、Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作;

  3、hibernate使用Java反射机制,而不是字节码增强程序来实现透明性;

  4、hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

  Struts工作机制?为什么要使用Struts?

  工作机制:

  Struts的工作流程:

  在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象。

  当ActionServlet接收到一个客户请求时,将执行如下流程.

  (1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;

  (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;

  (3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;

  (4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功;

  (5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;

  (6)Action的execute()方法返回一个ActionForward对,象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;

  (7)ActionForward对象指向JSP组件生成动态网页,返回给客户。

  为什么要用:

  JSP、Servlet,JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

  基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件

  如何优化Hibernate?

  1、使用双向一对多关联,不使用单向一对多

  2、灵活使用单向一对多关联;

  3、不用一对一,用多对一取代;

  4、配置对象缓存,不使用集合缓存;

  5、一对多集合使用Bag,多对多集合使用Set;

  6、继承类使用显式多态;

  7、表字段要少,表关联不要怕多,有二级缓存撑腰。

  Spring工作原理

  Spring已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xmlSpring的配置文件来动态的创建对象,和调用对象里的方法的。

  Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。

  Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置内部通过反射去动态的组装对象)

  Struts2框架本身大致可以分为3个部分:

  核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。

  核心控制器FilterDispatcher是Struts2框架的基础,包含了框架内部的控制流程和处理机制。

  业务控制器Action和业务逻辑组件是需要用户来自己实现的。

  用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。

  Struts2的工作流程相对于Struts1要简单,与WebWork框架基本相同,所以说Struts2是WebWork的升级版本。

  基本简要流程如下:

  1、客户端初始化一个指向Servlet容器的请求;

  2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh?Plugin)

  3、接着FilterDispatcher被调用,

  FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

  4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

  5、ActionProxy通过ConfigurationManager(配置管理器)询问框架的配置文件,找到需要调用的Action类;

  6、ActionProxy创建一个ActionInvocation的实例;

  7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;

  8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

  返回结果通常是(但不总是,也可?能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。

  在表示的过程中可以使用Struts2?框架中继承的标签。在这个过程中需要涉及到ActionMapper;

  9.响应的返回是通过我们在web.xml中配置的过滤器;

  10、如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal?ActionContext;

  如果ActionContextCleanUp不使用,则将会去清理。

  说下Struts的设计模式

  MVC模式:web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

  拦截器和过滤器的区别

  1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。

  2、拦截器不依赖于servlet容器,过滤器依赖于servlet容器。

  3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。

  4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

  5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

  struts1于struts2的比较

  1、Action类:

  Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

  Struts2Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。

  Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

  2、线程模式:

  Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。

  单例策略限制了Struts1Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

  Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,

  servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

  3、Servlet依赖:

  Struts1Action依赖于ServletAPI,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。

  Struts2Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2Action仍然可以访问初始的request和response。

  但是,其他的元素减少或者消除了直接访问HttpServetRequest和HttpServletResponse的必要性。

  4、可测性:

  测试Struts1?Action的一个主要问题是execute方法暴露了servlet?API(这使得测试要依赖于容器)。

  一个第三方扩展--StrutsTestCase--提供了一套Struts1的模拟对象(来进行测试)

  Struts2Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

  5、捕获输入:

  Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

  Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。

  Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。

  这种ModelDriven特性简化了taglib对POJO输入对象的引用。

  6、表达式语言:

  Struts1整合了JSTL,因此使用JSTLEL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

  Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"ObjectGraphNotationLanguage"(OGNL).

  7、绑定值到页面(view):

  Struts1使用标准JSP机制把对象绑定到页面中来访问。

  Struts2使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。

  ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

  8、类型转换:

  Struts1ActionForm属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

  Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。

  9、校验:

  Struts1支持在ActionForm的validate方法中手动校验,或者通过CommonsValidator的扩展来校验。

  同一个类可以有不同的校验内容,但不能校验子对象。

  Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性.

  10、Action执行的控制:

  Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

  Struts2支持通过拦截器堆栈(InterceptorStacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

  为什么要使用Struts2

  Struts2是一个相当强大的JavaWeb开源框架,是一个基于POJO的Action的MVCWeb框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。

  1、Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。

  2、使用OGNL进行参数传递。

  OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。

  (OGNL是Object-GraphNavigationLanguage的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。)

  3、强大的拦截器。

  Struts2的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中。

  以完成一些Java?Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。

  4.易于测试。

  Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5JavaWeb项目的测试。

  5、易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。

  6.模块化管理。

  Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。

  7.全局结果与声明式异常。

  为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。

  他的如此之多的优点,是很多人比较的青睐,与spring,Hibernate进行结合,组成了现在比较流行的ssh框架。

  struts2有哪些优点

  1、在软件设计上Struts2的应用可以不依赖于ServletAPI和strutsAPI。Struts2的这种设计属于无侵入式设计;

  2、拦截器,实现如参数拦截注入等功能;

  3、类型转换器,可以把特殊的请求参数转换成需要的类型;

  4、多种表现层技术,如:JSP、freeMarker、Velocity等;

  5、Struts2的输入校验可以对指定某个方法进行校验;

  6、提供了全局范围、包范围和Action范围的国际化资源文件管理实现。

  struts2是如何启动的?

  struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;

  StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。

  struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。

  struts2框架的核心控制器是什么?

  它有什么作用?

  1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。

  2)作用:负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。

  默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理。

  否则struts2框架将略过该请求的处理。可以通过常量"struts.action.extension"修改action的后缀。

  如:<constantname="struts.action.extension"value="do"/>

  如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

  <constantname="struts.action.extension"value="do,go"/>

  struts2配置文件的加载顺序:

  struts.xml——>struts.properties常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

  struts.xml文件的作用:通知Struts2框架加载对应的Action资源。

  struts2是如何管理action的?

  这种管理方式有什么好处?

  struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。

  主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

  struts2默认能解决get和post提交方式的乱码问题吗?

  不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。

  ActionContext、ServletContext、pageContext的区别?

  1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;

  2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;

  3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,生命周期是JSP四个域对象中最小的。

  以上就是动力节点java培训机构小编介绍的“小白自学Java框架,框架的全面解析总结”的内容,希望对大家有帮助,更多java最新资讯请继续关注动力节点java培训机构官网,每天会有精彩内容分享与你。

小白自学Java框架,框架的全面解析总结相关推荐

  1. 小白学习java集合框架(集合Collection)

    希望各位能够留下你们美丽的赞和评论谢谢,或者有好的资源帮帮小编提升实力一起努力,奥里给!! 拒绝垃圾视频:超级好的视频,建议从头开始看:https://www.bilibili.com/video/B ...

  2. 小白自学Java后端学习计划(附带学习视频)

    项目交流群 QQ群: 994793967 ,欢迎进群交流讨论 一.Java基础 java基础语法 集合 io 多线程 并发 反射 网络编程 注意:对于Java基础,其中集合和io是初学Java后端的时 ...

  3. 零基础小白-自学java全栈开发-学习路线-只要看这一篇就可以了(完整版)

    文章目录导航 小白自述 具体内容以及详细流程 开发工具的使用 总结一下 什么是java 第一个java程序分析 基础知识 运算符操作 控制语句 数组类型 方法定义和使用 Eclipse工具的使用 类与 ...

  4. Java基础入门教程,零基础小白自学Java必备教程

    一.本单元知识点概述 (Ⅰ)知识点概述 二.本单元目标 (Ⅰ)重点知识目标 1.方法重写 2.Super和this关键字 3.抽象类 (Ⅱ)能力目标 1.能够写出类的继承格式 2.能够说出super可 ...

  5. 自学Java大概需要多长时间可以入门呢?

    其实学java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步,而且还要有项目经验,否则是不会有公司要你 ...

  6. 自学Java半年,能找到工作嘛?

    坦白来讲虽然自学比较难,但是通过自学的方式,顺利找到工作的人还是有的,如果你是科班出身,有编程基础,而且自学能力比较强的话,可以尝试一下自学这条路, 现在推荐一条Java自学路线图,只要这些你都掌握了 ...

  7. opcua 入门简介 java_大二的学生自学Java有出路吗?

    这个是技术,学好了必须是有出路的,当然你喜不喜欢还得看后面的学习情况,三天热火气的情况大有人在,更有甚者就是,系统培训完,上了半年的班了,后转行到别的也有,所以兴趣是自己的最大的老师, 大学都会很迷茫 ...

  8. java篇:自学Java到底需要多久呢?

    总结,个人认为,零基础学Java只需要6个月时间左右,也要根据基础不同,学习能力不同有所差异,也是很正常的! 第一阶段:基础技能 首先要明确一件事,自学Java可行但不代表轻松容易. 我是觉得要先把J ...

  9. java 数学公式解析框架有哪些_java程序员该如何进阶?这份java中高级核心知识全面解析请收好...

    <Java中高级核心知识全面解析>是整理收录GitHub50K+Star以上的高质量学习文档,前前后后花了近半个月的时间,终于整理而成.包含了Java基础.网络.Linux.数据结构与算法 ...

最新文章

  1. PHP中try{}catch{}是异常处理.
  2. java线程池应用的好处_java高级应用:线程池全面解析
  3. EnableAutoConfiguration自动配置底层原理
  4. idea 一直在build_CEO季度表彰团队| 我们一直在做最酷的事
  5. hive 的条件判断(if、coalesce、case)
  6. 程序员面试金典 - 面试题 02.08. 环路检测(快慢指针)
  7. python数据库自动重连_python mysql断开重连的实现方法
  8. 4 5区别 angular 和_Angular 常见问题解答
  9. Elasticsearch聚合 之 Ip Range IP地址范围聚合
  10. PHP7.1安装memcaehd扩展
  11. 邮件服务器怎么填写,邮箱可以绑定哪些客户端?
  12. [JS]回调函数例子
  13. 2016年计算机辅助设计试题,cad考试题「附答案」
  14. Soui教程_v20201024
  15. CodeForces 68 A.Irrational problem(水~)
  16. 音乐学院计算机音乐实验中心,中央音乐学院鼎石实验学校
  17. 淘宝商城:将公布和解条件
  18. 结婚证照片尺寸是多少?教你拍出好看的证件照照片
  19. Win7/8双系统共用蓝牙鼠标
  20. TXS0102使用说明

热门文章

  1. Codeforces Round #131(Div. 2)
  2. RadioWar_RFID_LiveCD_Alpha330
  3. PHP正则表达式怎么匹配多行
  4. 程序员的能力矩阵表【转载自】
  5. 【51nod】1239 欧拉函数之和 杜教筛
  6. jQuery-demos轮播图练习(一)
  7. 【JAVA零基础入门系列】Day14 Java对象的克隆
  8. Spark基础脚本入门实践2:基础开发
  9. Jsoup解析的例子 之 选择器
  10. redis配置实例及redis.conf详细说明