• Struts 第一天


    请简述下Struts2 的执行流程.

    首先是,启动tomcat服务器,这时候会加载web.xml,当读到filter标签时,会创建过滤器对象struts2核心过滤器(StrutsPrepareAndExecuteFilter会负责加载类路径下的struts.xml配置文件。接下来,从客户端发送请求过来 先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter,前端控制器会根据请求的名称在struts.xml中找到对应的配置,创建我们的动作类对象(每次访问时都会创建新的Action对象),然后执行指定的方法,根据方法的返回值找到Result的配置进行页面的跳转.最后响应浏览器。

     加载struts2的配置文件,他们的加载顺序及作用.

    default.properties

    struts-default.xml

    strtuts-plugin.xml

    struts.xml

     

    struts.properties

     

    web.xml

    当多个配置文件中,有相同的参数,后加载的配置文件中的值会把前面加载的配置文件的值给覆盖了。

     实现一下动作类的三种创建方式.

    第一种:无侵入式创建一个action实现一个跳转(实际开发中基本不用)

    第二种:实现Action接口的定义方式 (实际开发中用的也不多)

    第三种:继承ActionSupport (们实际开发中采用的方式)

    1. Struts2与Struts1的联系与区别是什么?为什么要用Struts2?

    答案:

    struts1struts2都是mvc框架的经典实现模式。

    Struts2不是从Struts1升级而来,而是有WebWork改名而来,Struts 2WebWork为核心,采用拦截器的机制来处理用户的请求

    区别:(了解几条即可)

    1.核心控制器改成了过滤器(过滤器比Servlet的级别要高,因为程序运行时是先进入过滤器再进入Servlet

    2.struts1要求业务类必须继承ActiondispatchActionstruts2不强制这么做,只需要提供一个pojo

    3.绑定值到业务类时struts1是通过ActionFormstruts2是通过模型或属性驱动直接绑定到Action属性。

    4.struts1严重依赖于Servlet(因为太过于依赖于apiHttpServletRequestHttpServletResponse的两个参数),

    struts2就则脱离了ServletAPI

    5.管理Actionstruts1是单例模式,struts2是每个请求产生一个实例

    6.在表达式的支持上struts2不仅有jstl,还有功能更加强大的ognl表达式

    7.struts1的类型转换是单向的(页面到ActionForm),struts2是双向的(页面到Action再到页面回显)

    8.校验,struts1没有针对具体方法的校验,struts2提供了指定某个方法进行效验,还有框架校验。

     请求(.action)---->经过StrutsPrepareAndExecuteFilter 核心控制器---->进入到Struts2的拦截器Interceptor(实现代码功能)----->通过action的名称找对应的Action----->执行Action类的execute方法----->通过execute方法中返回的字符串,在Struts.xml中找对应的结果页面(result)【在action执行之前,执行了defaultStack拦截器栈】

    拦截器  struts-default.xml定义 【它位于sruts2-core-xxx.jar目录下】

    执行拦截器  defaultStack 中引用拦截器

    1. 值栈ValueStack的原理与生命周期?  

    答案:

    1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创建ActionContext,  

    ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。请求来的时候,action、ValueStack的生命开始,请求结束,action、ValueStack的生命结束;  

    2)action是多例的,和Servlet不一样,Servelt是单例的;  

    3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶;  

    4)ValueStack本质上就是一个ArrayList;  

    5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中:  只能用%{#取出}

    parameters  :   该 Map 中包含当前请求的请求参数  

    request     :   该 Map 中包含当前 request 对象中的所有属性  session :该 Map 中包含当前 session 对象中的所有属性  

    application :该 Map 中包含当前 application 对象中的所有属性  

    attr:该 Map 按如下顺序来检索某个属性: request, session, application           

    6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;  

    7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:<s:property value="name"/>  

    8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的"$",而不是#或者%;  

  • 相关阅读:
    连接数据库代码
    C/C++ Basicsfunction pointer
    MSMQ&Com+ Service: How to create an Com+ Service in .NetFramework
    C/C++ Basics>about #define, const
    EndpointAddress
    MSMQ Basics Transactional Messages Processing
    Thread Basics(thread synchronization&Asynchronization) part two
    Thread Basics using Timer to trigger Event at a specified internals
    FAQ about AJAXpart II
    FAQ about AJAXpart I
  • 原文地址:https://www.cnblogs.com/shan1393/p/9085008.html
Copyright © 2020-2023  润新知