1.Struts的工作原理
在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet, ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此 FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的 FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。
1. ActionServlet:Struts 的ActionServlet控制导航流。当ActionServlet从容器接到一个请求,它使用URI(或者“path”)也决定哪个Action来处理请求。< Control Layout >
2. Action:用来访问业务逻辑类。一个 Action 可以校验输入,并且访问业务层以从数据库检索信息。为校验输入或者使用输入来更新数据库,Action 需要知道什么值被提交上来。它并不是强制每个Action都要从请求中抓取这些值,而是由 ActionServlet 将输入绑定到 JavaBean 中。< Model Layout >
3.ActionForm:输入 bean 是Struts ActionServlet 类的子类。ActionServlet 通过查找请求的路径可以决定使用哪个 ActionForm(输入 Javabean ) ,Action 也是通过同样的方法选取的。ActionForm扩展了org.apache.struts.action.ActionForm类。< Data >
4.ActionMapping:Struts将这些细节绑定在一个ActionMapping对象中。每个ActionMapping相对于一个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping对象告诉servlet,哪些个Action,ActionForm,和 ActionForward 将被本次请求使用。
每个请求都必须以HTTP响应进行应答。通常,Struts Action 并不自行渲染响应信息,而是将请求转发到其他资源,比如JSP页面。Struts提供一个ActionForward类,用于将一个页面的路径保存为逻辑名称。当完成业务逻辑后,Action 选择并向 Servlet 返回一个 ActionForward 。Servlet 然后使用保存在ActionForward 对象中的路径来调用页面完成响应。
所有这些细节,关于Action,ActionForm,ActionForward,ActionMapping,以及其它一些东西,都在struts-config.xml 文件中定义。ActionServlet 在启动时读取这个配置文件,并创建一个配置对象数据库。在运行时,Struts 应用根据文件创建的配置对象,而不是文件本身。
struts的工作原理可分为如下8步。
1.读取配置(初始化ModuleConfig对象)
Struts框架总控制器(ActionServlet)是一个Servlet,在web.xml中被配置成一个自动启动的Servlet。读取配置文件struts-config.xml的配置信息,为不同的Struts模块初始化相应的ModuleConfig对象。
2.用户请求
用户提交表单或调用URL向WEB应用程序服务器提交一个请求,请求的数据用HTTP协议上传给WEB服务器。
3.填充FormBean
(*.do请求)从ActionConfig中找出对应该请求的Action子类,如有对应的Action且这个Action又一个相应的ActionForm,ActionForm被实例化并用HTTP请求的数据填充其属性,并保存在ServletContext中,这样他们就可以被其它Action对象或JSP调用。如果没有对应的Action,控制器则直接转发给JSP或静态页面。
4.派发请求
控制器根据配置信息ActionConfig将请求派发到具体的Action,相应的FormBean一并传给这个Action的execute()方法。
5.处理业务
Action一般只包含一个execute方法,它负责执行相应的业务逻辑。执行完毕后返回一个ActionFoward对象,控制器通过该ActionFoward对象来进行转发工作。
6.返回响应
Action根据业务处理的不同结果返回一个响应对象给总控制器,该目标响应对相对应一个具体的JSP页面或另一个Action。
7.查找响应
总控制器根据业务功能Action返回的目标响应对象找到对应的资源对象,通常是一个具体的JSP页面。
8.响应用户
JSP将结果展现给用户。
其工作原理可以总结为以下8步:
1、初始化,读取struts-config.xml、web.xml等配置文件(所有配置文件的初始化)
2、发送HTTP请求,客户端发送以.do结尾的请求
3、填充FormBean(实例化、复位、填充数据、校验、保存)
4、将请求转发到Action(调用Action的execute()方法)
5、处理业务(可以调用后台类,返回ActionForward对象)
6、返回目标响应对象(从Action返回到ActionServlet)
7、转换Http请求到目标响应对象(查找响应,根据返回的Forward keyword)
8、Http响应,返回到Jsp页面
视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。 模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。 流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。 核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。
2.Struts的流程
服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。
以登陆为例:第一次进login.jsp会先实例化Form、把默认值赋给表单元素。
输入用户名密码提交表单、提交到action属性的login.do,通过ActionServlet读struts-config.xml文件找到 action下的path属性找到.do,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面.验证通过会实例化Action,执行Action的excute方法。
7、Sturt1的核心类、核心标签库有哪些?基于Struts开发的应用通常由哪3类组件组成?
ActionServlet 控制器、ActionMapping状态改变事件 、 Action控制器的一部分、ActionForward用户指向、ActionForm状态改变的数据
Html标签、bean标签、logic标签、tiles标签、nested标签
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
3.Struts框架中的组件
(由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMapping,JSP和Tag Library包含进来,有时间作完替换)
框架中所使用的组件:
ActionServlet 控制器
ActionClass 包含事务逻辑
ActionForm 显示模块数据
ActionMapping 帮助控制器将请求映射到操作
ActionForward 用来指示操作转移的对象
ActionError 用来存储和回收错误
Struts标记库 可以减轻开发显示层次的工作
下面我们看看各自在框架中所扮演的角色和责任。
1. 首先在Tomcat启动的时候 ,自动检查web应用程序内是否有web.xml的配置文件,若没有找到的话就去找Tomcat下的web.xml配置文件,读取struts-config.xml配置信息然后将其加载到内存中!ActionServlet从struts- config.xml文件中读取配置信息将form-beans,action-formward等配置对象实例化!
2. 当ActionServlet接受一个来自客户端的请求时:
(1) 检索和用去请求向匹配ActionMapping实例,如果不存在则返回请求路径无效500错误信息。匹配则进入下一步创建ActionForm.
(2) 检查是否有ActionFrom实例存在,如果ActionFrom实例不存在,就创建一个ActionForm 对象,把用户提交的表单数据保存到ActionFrom中!
(3) 根据配置决定是否进行表单验证(validate),若需要验证就调用就调用ActionForm的validate()方法。如果ActionForm的validate()方法返回null或者返回一个不包含ActionMessage的ActionErrors的对象,说明验证成功,继续进行下一步,不成功返回错误信息!
(4) ActionServlet根据ActionMapping实例所包含的映射信息决定将请求转发给哪个Action,若没有知道相应的Action实例存在,则首先创建这个Action实例,然后调用Action的execute()方法!
(5) Action的execute()方法返回一个ActionForward对象。ActionServlet把转发给ActionForward对象指向的jsp组件。
(6) ActionForward对象指向的jsp组件生成的动态网页 返回给客户端
问题:请简述Struts的运行流程
回答:Struts是一个基于MVC模式的框架,所以它的运行流程是从控制器开始:
第一、客户端发送请求到到ActionServlet,ActionServlet根据客户请求的地址(通常都是XXX.do),在struts-congfig.xml文件当中找到与这个地址匹配的Action,并找到与这个Action匹配的ActionForm。
第二、接受客户端发送请求当中所携带的数据,生成ActionForm对象,并调用该对象的setter方法,将这些数据设置给ActionForm对象的成员变量;
第三、如果在Action的配置当中,validate属性的值为true,则会调用ActionForm的validate方法对客户端提交的数据进行验证。如果验证的过程当中产生了错误,ActionServlet会将请求转发到input属性所指定的页面,显示错误信息。如果validate属性的值为false,则不进行验证工作;
第四、如果验证的过程当中没有产生错误,则会生成Action的对象,并调用其execute方法;
第五、ActionServlet根据Action对象的execute方法所返回的ActionForward对象,将请求转发给下一个Action,或者是其他的服务器端资源;
第六、产生视图,并发送给客户端;
8. Struts的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
9. 说下Struts的设计模式
MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。
10. spring工作机制及为什么要用?
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.简述Struts Form Bean的表单验证流程
1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。
2、接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。
3、如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。
对于以上流程的步骤4 。如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。
问题:你常用的Struts类有哪些?哪个是Controller?
回答:
最常用的Strurts类有ActionServlet,Action,ActionFrom,ActionMapping,ActionForward以及ActionErrors和ActionError等等。
1.ActionServlet主要是用来接收客户提交的请求,将请求当中所携带的数据封装到ActionForm当中,然后调用Action的execute函数,并将ActionForm对象作为参数传递到该方法当中。最后根据这个方法所返回的ActionForward对象来决定将请求转发到下一个Action或者是jsp等资源;
2.ActionForm的作用分为两个部分,第一这个对象封装了客户从表单当中所提交的数据,第二是ActionForm当中有一个validate方法,这个方法的作用是验证客户提交数据的有效性;
2.Action的主要作用是处理请求。通常的做法是在Action的execute方法当中调用业务层对象,进行业务处理,并根据业务处理的结果,返回不同的ActionForward对象;
3.ActionMapping对象代表了struts-congfig.xml文件当中的<action>标签的配置信息,我通常会使用这个对象得到ActionForward对象,常用的方法有findForward和getInputForward;
4.ActionForwad对象通常代表了一个Web资源,可以是JSP,Servlet或者是另外一个Action。这个对象对应的是struts-config.xml文件当中的<forward>元素;
5.ActionError代表了一个错误信息,这个错误信息是一个键值对,配置在struts的资源文件当中。通常是在ActionFrom的validate方法当中验证客户从表单当中所提交的信息,如果不符合验证规则,就生成一个ActionError对象,将这个对象添加到ActionErrors对象当中。然后跳转到页面上使用<html:errors/>标签进行显示;
在Struts框架当中,ActionServlet和Action各自承担了一部分控制器的责任,总的来说还是ActionServlet更加侧重于控制器的功能。