Struts2源码分析(一) 一一一 StrutsRequestWrapper

			StrutsRequestWrapper的源码

// 核心代码:
public class StrutsRequestWrapper extends HttpServletRequestWrapper {

    /**
     * 注意下面这句注释:获取object,如果没找到就去ValueStack里面找
     * Gets the object, looking in the value stack if not found
     *
     * @param s The attribute key
     */
    public Object getAttribute(String s) {
        if (s != null && s.startsWith("javax.servlet")) {
            return super.getAttribute(s);
        }

        ActionContext ctx = ActionContext.getContext();

	// ***** 调用父类的getAttribute()方法,获取request作用域中的属性 *****
        Object attribute = super.getAttribute(s);

        if (ctx != null) {
            if (attribute == null) {
                boolean alreadyIn = false;
                Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
                if (b != null) {
                    alreadyIn = b.booleanValue();
                }

                if (!alreadyIn && s.indexOf("#") == -1) {
                    try {
						// ***** 如果在request中没找到,那就去ValueStack中找 *****
                        // If not found, then try the ValueStack
                        ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
                        ValueStack stack = ctx.getValueStack();
                        if (stack != null) {
			// ***** 调用findValue()方法,在ValueStack中找[先从对象栈(Value Stack Contents)中找,若没找到,就去map栈(Stack Context)中找]
                            attribute = stack.findValue(s);
                        }
                    } finally {
                        ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
                    }
                }
            }
        }
        return attribute;
    }
}

所以:在jsp页面中使用EL表达式也可以访问到struts2中ValueStack里面的内容
EL表达式的查找顺序:
page --> request --> valueStack.findValue() --> session --> application

时间: 2024-10-11 03:33:31

Struts2源码分析(一) 一一一 StrutsRequestWrapper的相关文章

Struts2 源码分析——过滤器(Filter)

章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析——核心机制)里的机制图片来分析源码.如果还不明白核心机制的朋友,请转到对应的章节进行阅读.笔者为了方便读者阅读,也把图片在次贴到了本章中.如下 根据图片笔者就明白我们首要分析便是橙黄色(Servlet Filters).也就是传说的过滤器(Filter).相信看过笔者前面几个章节的读者都明白strut

Struts2 源码分析——调结者(Dispatcher)之执行action

章节简言 上一章笔者写关于Dispatcher类如何处理接受来的request请求.当然读者们也知道他并非正真的执行action操作.他只是在执行action操作之前的准备工作.那么谁才是正真的执行action呢?本章笔者就带大家来看看StrutsExecuteFilter类的工作.在理解StrutsExecuteFilter类的工作之前,笔者还是希望大家回顾一下前一章讲到的request请求工作.为什么这样子讲呢?可以说StrutsExecuteFilter类的工作是建立在StrutsPrep

Struts2 源码分析——拦截器的机制

本章简言 上一章讲到关于action代理类的工作.即是如何去找对应的action配置信息,并执行action类的实例.而这一章笔者将讲到在执行action需要用到的拦截器.为什么要讲拦截器呢?可以这样子讲吧.拦截器的应用是sturts2核心的亮点之一.如果不明白拦截器是什么的话,那么你相当于没有学习过struts2.笔者本来想直接讲这一章的知识点.可是又怕读者可能对拦截器没有一个概念化的理解.为什么这么讲呢?struts2在设计拦截器这一个部分的内容.在笔者看来事实是以AOP为核心思想来设计的.

Struts2之struts2源码分析

一.学习案例:struts2讲到这基本上可以结束了.不知道大家有什么感觉呢,反正我是都忘了,你呢.别说你都记住了.如果真是记住了,那好,请在本文下方留下大名和照片,我要贴在床头,每日加以膜拜.呵呵.回到正题,struts2一些基本的东西,在之前的文章基本都解释,并配上项目演示了.不是说,struts2的博文结束了,你的学习就结束了,我也说了,我都忘了,你如果不忘,可真就不是一般人了.就像张三丰当年传太极与张无忌一样,正常人学东西都这样的.忘了就复习呗.好了,接下来还有一章都是关于struts2源

Struts2 源码分析——配置管理之PackageProvider接口

本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 .如struts.xml文件里面的package节点.那么为什么要分开来讲呢?按道理的话,都是放在上一章中一起讲不是更好吗?关键点在于笔者也不明白strtus2的作者为什么会这样子设计,把关于加载package元素节点信息的工作独立出来.而他的接口便是PackageProvider接口.但是不管如

Struts2 源码分析——项目分析

项目知识点分析 从上一章中我们知道了接下来我们要去了解源码的项目(struts2-showcase).而这一章将讲述我三年后在次接触struts2-showcase项目是一个什么样子的情况.我有一个工作习惯.在参于每一个新项目开发的时候,我都希望项目负责人能跟我讲讲这个项目到底用到了哪些知识点.这样子的目标是让我心中对项目会有一个大体上的概念.悲剧的是struts2-showcase作者是不可能为你这个小小的角色特意打电话或是EMAIL你的.所以我的入手点是看这个项目的需要的JAR.如图下. 从

Struts2 源码分析——Result类实例

本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容进行讲解.笔者叫他们为Result类实例.如果还记得在上一章最后笔者说可以把处理action执行的结果简单的理解处理网页.而且还用红色标识.实际是处理跟表现层有关的内容.而不是页面上的内容.如HTML.即是MVC里面的C到V的内容.当然这还关系到配置文件里面的result元素节点信息.如strtus

Struts2 源码分析-----拦截器源码解析 --- ParametersInterceptor

ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Action中,如果栈顶是一个model(Action实现了ModelDriven接口)则把参数设置到了model中. 下面是该拦截器的doIntercept方法源码: @Override public String doIntercept(ActionInvocation invocation) throws Excep

Struts2源码分析(一) 一一一 ModelDrivenInterceptor

ModelDrivenInterceptor的核心源码 [说明] ModelDrivenInterceptor是默认的拦截器链(struts-default)的一部分,当一个请求经过ModelDrivenInterceptor的时候,它会判断当前要调用的Action对象是否实现了ModelDriven接口, 如果实现了这个接口,则调用getModel()方法,并把返回值压入ValueStack. // 核心代码: public class ModelDrivenInterceptor exten