Struts2框架的工作原理与架构分析
- 格式:pptx
- 大小:1.22 MB
- 文档页数:48
struts2的工作原理
Struts2是一个基于Java的Web应用程序框架,其工作原理是
基于MVC(Model-View-Controller)设计模式。
它主要由以
下几个组件构成:
1. 客户端发起请求:用户在浏览器中输入URL地址或者点击
超链接等操作发起请求。
2. 前端控制器(Front Controller)处理请求:当用户发起请求时,前端控制器(通常是一个Servlet)接收到请求,并负责
处理该请求。
3. 配置文件解析:前端控制器会根据配置文件(通常是struts.xml)对请求进行解析,确定要执行的控制器动作和视图。
4. 控制器动作执行:前端控制器会根据配置文件中指定的控制器动作,调用相应的Action处理业务逻辑。
Action是一个
Java类,负责接收请求参数、调用服务层逻辑处理数据,并将处理结果封装进Action的属性中。
5. 视图生成:当控制器动作执行完成后,前端控制器会根据配置文件中指定的视图,调用相应的视图模板生成最终的
HTML响应。
6. 响应返回客户端:生成的HTML响应会被前端控制器发送
回客户端,显示在用户的浏览器中。
总结来说,Struts2的工作原理就是通过前端控制器来处理用
户请求,根据配置文件解析请求,并调用相应的Action处理
业务逻辑,最后生成HTML响应返回给客户端。
这种设计模
式的好处是将业务逻辑与界面分离,提高了代码的可维护性和可测试性。
Java面试中常常问到的一个重要的理论
1。
struts2工作原理
(a)用户发送http(httpServletRequest)请求,请求web服务器(Tomcat),web服务器加载web部署描述文件(web.xml),执行过滤器
ActionContextCleanUp,Other filters,filterDispatcher等等ActionContextCleanUp:需要与装饰器(siteMesh)插件一起使用,作用:使用装饰器插件,struts2中Action不再管理Action中属性,使用ActionContextCleanUp来清理Action中属性other filters:其他过滤器(siteMesh)filterDispatcher:struts2核心控制器
注意:过滤器执行是有顺序(同图),值栈在filterDispatcher中创建
(b)filterDispatcher询问ActionMapper是否请求Action,如果不请求Action,就不再实行struts2容器,否则filterDispatcher会调用ActionProxy,ActionProxy通过配置文件管理器(Configuraction Manager)加载struts.xml 配置文件,找到相应Action
(c)ActionProxy会创建Action Invocation对象先执行struts2中相应的拦截器,在行所请求Action
(d)Action Invocation执行Result找到分发页面
(e)(反向)执行struts2中拦截器或拦截器栈
(f) 响应(HttpServletResponse)给客户端
struts2优势:
与Servlet API(Servlet容器)解耦。
Struts2的工作机制分析及实例一、概述本章讲述Struts2的工作原理。
读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。
实际上Struts1.x 与Struts2并无我们想象的血缘关系。
虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。
Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。
本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问/xwork/download.action即可自行下载。
下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。
(图14)二、主要的包和类Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。
从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。
但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。
Struts2基本流程及原理1.Struts 2的基本流程Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。
在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。
2.核心控制器:FilterDispatcherFilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。
如果用户请求以action结尾,该请求将被转入Struts 2框架处理。
Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts 2调用名为login的Action来处理该请求。
Struts 2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。
Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。
而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。
显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。
用户实现的Action类仅仅是Struts 2的Action代理的代理目标。
用户实现的业务控制器(Action)则包含了对用户请求的处理。
Struts2(2) 工作原理一、Struts2框架结构Struts2框架按照模块来划分,可以分为Servlet Filters、Struts核心模块、拦截器和用户实现部分。
Struts2框架结构图如图4-1所示。
图4-1 Struts 2框架结构图一个请求在Struts2框架中的处理大概分为以下几个步骤。
①客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。
②请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。
注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。
③FilterDispatcher是控制器的核心,就是MVC的Struts2实现中控制层(Controller)的核心。
④F ilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy。
⑤ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。
例如,用户注册示例将找到UserReg类。
⑥ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。
但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)。
struts2核心工作流程与原理这是Struts2官方站点提供的Struts 2 的整体结构。
一个要求在Struts2框架中的处理大致分为以下几个步骤1.客户端提起一个(HttpServletRequest)要求,如上文在扫瞄器中输入”http://localhost:8080/TestMvc/add.action”确实是提起一个(Http ServletRequest)要求。
2.请求被提交到一系列(要紧是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。
注意那个地点是有顺序的,先ActionContextCleanUp,再其他过滤器(Site Mesh等)、最后到FilterDispatcher。
3.FilterDispatcher是操纵器的核心,确实是mvc中c操纵层的核心。
下面粗略的分析下我明白得的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequest req,ServletResponse res,Filter Chain chain)throws IOException,ServletException{HttpServletRequest request=(HttpServletRequest)req;HttpServletResponse response=(HttpServletRespon se)res;ServletContext servletContext=filterConfig.getServl etContext();//在那个地点处理了HttpServletRequest和HttpServlet Response。
DispatcherUtils du=DispatcherUtils.getInstance();du.prepare(request,response);//正如那个方法名字一样进行locale、encoding以及专门request parameters设置try{request=du.wrapRequest(request,servletContext);//对request进行包装}catch(IOException e){String message="Could not wrap ser vlet request with MultipartRequestWrapper!";LOG.error(message,e);throw new ServletException(message,e);}ActionMapperIF mapper=Actio nMapperFactory.getMapper();//得到action的mapperActionMapping mapping=mapper.getMapping(requ est);//得到action的mappingif(mapping==null){//there is no action in this reques t,should we look for a static resource?String resourcePath=RequestUtils.getServ letPath(request);if("".equals(resourcePath)&&null!=r equest.getPathInfo()){resourcePath=request.getPathInfo ();}if("true".equals(Configuration.get(WebWorkC onstants.WEBWORK_SERVE_STATIC_CONTENT))&&resourcePath.startsWit h("/webwork")){String name=resourcePath.subst ring("/webwork".length());findStaticResource(name,response);}else{//this is a normal request,le t it pass throughchain.doFilter(request,response);}//WW did its job herereturn;}Object o=null;try{//setupContainer(request);o=beforeActionInvocation(request,servlet Context);//整个框架最最核心的方法,下面分析du.serviceAction(request,response,servletC ontext,mapping);}finally{afterActionInvocation(request,servletContex t,o);ActionContext.setContext(null);}}du.serviceAction(request,response,servletContext,mapping);//那个方法询咨询ActionMapper是否需要调用某个Action来处理那个(re quest)要求,如果ActionMapper决定需要调用某个Action,FilterDispatche r把要求的处理交给ActionProxypublic void serviceAction(HttpServletRequest request,HttpServletResponse response,String namespace,String actionName,Map request Map,Map parameterMap,Map sessionMap,Map applicationMa p){HashMap extraContext=createContextMap(request Map,parameterMap,sessionMap,applicationMap,request,respons e,getServletConfig());//实例化Map要求,询咨询ActionMapper是否需要调用某个Action来处理那个(request)要求extraContext.put(SERVLET_DISPATCHER,this);OgnlValueStack stack=(OgnlValueStack)request. getAttribute(ServletActionContext.WEBWORK_V ALUESTACK_KEY);if(stack!=null){extraContext.put(ActionContext.V ALUE_STAC K,new OgnlValueStack(stack));}try{ActionProxy proxy=ActionProxyFactory. getFactory().createActionProxy(namespace,actionName,extraContext);//那个地点actionName是通过两道getActionName解析出来的,FilterDis patcher把要求的处理交给ActionProxy,下面是ServletDispatcher的TOD O:request.setAttribute(ServletActionContext.WEB WORK_V ALUESTACK_KEY,proxy.getInvocation().getStack());proxy.execute();//通过代理模式执行ActionProxyif(stack!=null){request.setAttribute(ServletActionCont ext.WEBWORK_V ALUESTACK_KEY,stack);}}catch(ConfigurationException e){log.error("Could not find action",e);sendError(request,response,HttpServletResp onse.SC_NOT_FOUND,e);}catch(Exception e){log.error("Could not execute action",e);sendError(request,response,HttpServletResp onse.SC_INTERNAL_SERVER_ERROR,e);}}4.FilterDispatcher询咨询ActionMapper是否需要调用某个A ction来处理那个(request)要求,如果ActionMapper决定需要调用某个A ction,FilterDispatcher把要求的处理交给ActionProxy。
struts2 的工作原理Struts2是一个基于Java的Web应用框架,其核心原理是基于MVC(模型-视图-控制器)模式进行开发。
它的工作原理可以简要概括如下:1. 客户端通过浏览器发送请求至Web服务器,请求的URL映射到Struts2框架的前端控制器(Front Controller)。
2. 前端控制器负责接收请求并进行初步处理,它会根据Struts2配置文件中定义的拦截器(Interceptors)和映射表(Mapping)来确定如何处理请求。
3. 拦截器是Struts2框架中的一个重要组件,用于对请求进行预处理和后处理。
它可以用于验证用户身份、记录日志、数据验证等。
拦截器可以按照一定的顺序链式执行,每个拦截器可以对请求进行修改或决定是否继续执行下一个拦截器。
4. 映射表用于将请求映射到对应的Action(控制器)及其相关方法上。
Struts2框架会根据请求的URL、请求参数等信息进行匹配。
5. Action是Struts2框架中的控制器组件,负责接收请求、处理业务逻辑并生成响应。
在执行Action方法之前,Struts2框架会将请求参数绑定到Action对象的对应属性上。
6. Action执行后,会返回一个结果视图(View)路径或逻辑名。
Struts2框架会根据配置文件中的Result定义,将该结果视图转发或重定向给客户端。
7. 结果视图可以是一个JSP页面、一个HTML文件、一个JSON数据等。
客户端浏览器会接收到结果视图并进行展示。
总的来说,Struts2的工作原理是通过前端控制器接收请求,经过拦截器的预处理和后处理,根据映射表将请求转发给对应的Action进行处理,最后将处理结果返回给客户端浏览器展示。
这种基于MVC模式的设计能够有效地将业务逻辑与用户界面分离,提高了代码的可维护性和可重用性。
第一章Struts2系统架构本章主要介绍的Struts2的系统架构,让学员对Struts2框架在结构上有一个整体概念为我们以后更加详细的学习Struts2打下一个良好的基础。
第一节Struts2的系统架构及处理的主要流程1.Struts1简介Struts1的历史比较久远,Struts1是世界上第一个发布的MVC框架,目前市场率最高的框架。
下面将简单讲解Struts1的基本架构。
图1-1显示了Struts1的数据流图。
图1-1 Struts1数据流图Struts1框架以ActionServlet为核心控制器,ActionServlet获得客户端请求。
然后ActionServlet根据请求信息调用匹配的业务逻辑控制器(Action)处理用户请求。
请求处理完成后,业务逻辑处理器调用相应的JSP显示处理结果。
Struts1框架实现了MVC模式,下面我们了解一下Struts1是怎样实现MVC模式的。
Struts1框架中并没有提供Model层的实现。
在实际的企业应用中,通过一个JavaBean 实现一个业务逻辑,在功能比较复杂的应用中也采用EJB或WebService服务实现业务逻辑。
Struts1框架的View层采用JSP实现。
Struts1提供了大量丰富的标签库。
这些标签库与Struts的组件兼容的特别好,可以很容易的输出控制器的处理结果。
Struts1框架中,控制器是它的核心,Struts1的控制器由两部分组成:核心控制器(ActionServlet)和业务逻辑控制器(Action),核心控制器由Struts1框架提供。
业务逻辑控制器需要由用户自己继承Struts1框架提供的Action类实现。
在Struts1框架中,JSP/Servlet耦合非常紧密。
这种紧密关系促使Struts1存在各种缺陷。
下面我们分析一下Struts1中存在的缺陷。
●支持的表现层技术单一●耦合性强,不便于单元测试●代码依赖于Struts1 API,侵入性强2.WebWork简介WebWork出自于开源组织opensymphony,实际的创始人是Java领域的名人Rickard Oberg(JBoss和XDoclet的作者)。
struts2工作原理Struts2是一个基于MVC设计模式的开源Web应用框架,它的工作原理是通过一系列的组件和机制来实现对Web应用程序的控制和管理。
在深入了解Struts2工作原理之前,我们先来了解一下MVC设计模式。
MVC是Model-View-Controller的缩写,它是一种软件架构模式,用于将应用程序的逻辑层、数据层和表现层分离开来。
在MVC 模式中,Model代表应用程序的数据和业务逻辑,View代表用户界面,Controller负责处理用户的输入并作出相应的反应。
在Struts2中,请求首先由前端控制器DispatcherServlet接收,DispatcherServlet将请求分发给相应的Action。
Action是Struts2框架中的核心组件,它负责处理用户的请求,并调用相应的业务逻辑处理数据。
在处理完业务逻辑之后,Action将结果返回给DispatcherServlet,DispatcherServlet再将结果渲染到用户界面上。
在Struts2中,配置文件也扮演着非常重要的角色。
通过配置文件,我们可以将请求映射到相应的Action,配置拦截器来处理用户的请求,以及配置全局结果集来统一处理Action的返回结果。
所有这些配置都是通过XML文件或注解来实现的。
另外,拦截器也是Struts2框架中非常重要的组件之一。
拦截器可以在Action执行之前或之后进行一些预处理或后处理操作,比如日志记录、权限验证、异常处理等。
通过配置拦截器栈,我们可以对请求进行统一的处理,提高代码的复用性和可维护性。
除了以上提到的组件和机制,Struts2还提供了丰富的标签库和插件,用于简化开发工作。
标签库可以帮助开发人员快速构建用户界面,而插件则可以扩展框架的功能,满足不同项目的需求。
总的来说,Struts2框架的工作原理可以概括为,前端控制器接收用户请求,将请求分发给相应的Action,Action处理业务逻辑并返回结果,DispatcherServlet将结果渲染到用户界面上。
Struts2框架的原理和应用1. 什么是Struts2框架Struts2是一个基于Java EE的开源Web应用框架,是Struts框架的升级版。
它通过MVC设计模式实现了Web应用开发的分层,将业务逻辑、数据模型和用户界面分离,使得代码更加清晰、易于维护。
2. Struts2框架的原理Struts2框架的原理主要包括以下几个关键点:MVC设计模式Struts2采用了MVC(Model-View-Controller)设计模式,其中:•模型(Model):负责管理应用程序的数据和业务逻辑。
•视图(View):负责显示数据给用户。
•控制器(Controller):负责处理用户输入、调用模型和视图等。
核心组件Struts2框架包含以下核心组件:•拦截器(Interceptor):负责在请求前后进行统一处理,可以用来进行身份验证、日志记录等操作。
•动作(Action):负责处理用户请求,包括接收请求参数、调用业务逻辑方法等。
•结果(Result):负责生成并返回视图,可以是JSP、Freemarker、JSON等。
•值栈(ValueStack):用于存储Action处理过程中的数据,支持OGNL表达式读取和赋值操作。
•配置文件(struts.xml):用于配置拦截器、动作、结果等,实现URL与处理类之间的映射关系。
工作流程Struts2框架的工作流程如下:1.客户端发送请求到Struts2框架的前端控制器(例如:DispatcherFilter)。
2.前端控制器根据请求的URL找到对应的处理类(Action)。
3.前端控制器将请求参数、上下文信息等传递给Action,同时执行拦截器的前置处理逻辑。
4.Action处理用户请求,并根据业务逻辑生成相应的结果。
5.前端控制器将结果传递给结果组件,选择合适的视图进行渲染。
6.前端控制器将渲染后的视图返回给客户端。
3. Struts2框架的应用Struts2框架在Web应用开发中具有广泛的应用,以下是一些主要的应用场景:1. 构建Web应用程序Struts2框架提供了许多构建Web应用程序的工具和技术,包括表单验证、国际化、文件上传等功能。