zoukankan      html  css  js  c++  java
  • Struts2 In Action笔记_页面到动作的数据流入和流出

    因为回答百度知道的一个问题,仔细查看了《Struts2 In Action》,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟。

    一直觉得国外写的书很浮,不具有操作性,但其实,Coding多了,才发现国外的书写的深刻、清晰、能传道解惑。

    一、主要收获

    1. Struts2 框架的数据流入和流出

       使用 Struts2 标签时,所有非字符串属性都被当作 OGNL表达式进行解析。

        使用  %{expression} 语法可以强制将字符串属性当作 OGNL表达式解析。

    2. 页面的多值提交 

    3. 虚拟对象 ValueStack

       使用 params拦截器,将请求参数设置到 ValueStack 公开属性中,动作 Action也被设置到 ValueStack 中。

       ValueStack 中没有基础结构的对象(如Servlet API 或者 Struts2 的对象)。动作 Action 在 ValueStack 上是因为它作为

       业务数据(请求所提交的数据)的承载者。

       ValueStatck 有一个为妙的地方,当OGNL表达式根据 ValueStack解析时, 它装作一个对象。这个虚拟对象包含它自身

       包含的所有对象的所有属性如果相同属性存在,则栈下面的属性会被上面的同名属性覆盖1

    4. ActionContext

       Struts2 框架的一个核心对象,动作Action的上下文。AC 包含 动作Action 相关的所有重要的数据对象。

    它包括6个对象:ValueStack,  parameters, application, session, attr, request。

    其中,request 和 session, application 是 Sevrlet API 的 request, session, application 的翻版(映射或者说包装)。

    所以

    使用 OGNL 获取 ActionContext 中的 原生session对象中的值的方法是
    #session['user'] 或者 #session.user
    访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: 
    parameters 包含当前HTTP请求参数的Map
    #parameters.id[0] === request.getParameterValues("id").get(0);
    request 包含当前HttpServletRequest的属性(attribute)的Map
    #request.userName === request.getAttribute("userName")
    session 包含当前HttpSession的属性(attribute)的Map
    #session.userName === session.getAttribute("userName")
    application 类似

    另外注意区分 EL表达式、 JSTL 标签 和 OGNL 表达式

       

    时间有限,摘录部分重点:

    Strust2接收到一个请求时,它会立即创建一个 ActionContext、一个ValueStack 和一个动作对象 Action。作为数据承载者,动作Action 被马上放到 ValueStack 中,以便框架可以通过 OGNL 访问它的属性。

    1:

    当Action 内 含有 name 属性和一个 User 对象属性,并且刚好 User 类也有个 name 属性,根据 动作Action会先被放入ValueStack

    ,属性对象后放入的顺序,动作Action 的 name 属性将不会被框架自动的 赋值,换句话说,就会被永远无法访问到了。

    (但其实有 特定标签put 可以解决这个问题,实际中也很少出现这个问题,不知道为何?)

    参考《Struts2 In Action》 P112 ,Struts2 标签概要。

  • 相关阅读:
    网络基础相关知识内容
    json模块的转义dump 和反转义 loap
    常用模块--time,sys,os,json
    正则表达式
    day_24 模块和包
    day23_内置函数(__del__ item系列 ,模块)
    LuoguP3806 【模板】点分治1 (点分治)
    BZOJ1305/Luogu3153 [CQOI2009]dance跳舞 (network flow)
    LuoguP2217 [HAOI2007]分割矩阵 (DP + memorized search)
    BZOJ3224/LuoguP3369 普通平衡树 (splay)
  • 原文地址:https://www.cnblogs.com/muyun/p/7236124.html
Copyright © 2011-2022 走看看