如何从HttpServletRequest对象访问Struts值栈?

Jav*_*Dev 5 java struts2

我遇到了一些代码,它们通过在HttpServletRequest对象上调用getAttribute()来访问存储在struts值栈中的值.我不认为这是可能的,它在哪里记录?

动作类中的代码(它不会将它仅添加到类值堆栈中):

private PaginatedChunk searchResults;   


public PaginatedChunk getSearchResults() {
    return searchResults;
}

public void setSearchResults(PaginatedChunk searchResults) {
    this.searchResults = searchResults;
}
Run Code Online (Sandbox Code Playgroud)

这是自定义标记中的代码,用于从请求中提取值(并且它可以工作!?):

HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
PaginatedChunk searchResults = (PaginatedChunk)  request.getAttribute("searchResults");
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这是如何工作的吗?我认为Stack值不能通过请求直接访问.

我们正在运行struts2 v2.1.8.1

Qua*_*ion 5

乍一看,我肯定会同意.你展示的内容看起来并不直观.但真正发生的事情是从值堆栈获取对请求对象的访问权限,而不是反之亦然.您从值堆栈中的pageContext开始,并且您仍在使用最终仍然可以访问值堆栈的东西(它也可以访问请求).以下是它的发生方式:

在这里(http://www.docjar.com/html/api/org/apache/struts2/ServletActionContext.java.html),我们看到"pageContext"来自哪里:

   93       public static PageContext getPageContext() {
   94           return (PageContext) ActionContext.getContext().get(PAGE_CONTEXT);
   95       }
Run Code Online (Sandbox Code Playgroud)

getContext().get()返回一个Object,我们知道它是一种Pa​​geContext.但实施班是什么?

创建一个简单的动作:

package com.quaternion.action.test;

import com.opensymphony.xwork2.ActionSupport;

public class RequestAccessTest extends ActionSupport{
    public String getGreeting(){
        return "Hello from Request AccessTest";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在JSP中:

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <body>
        <h1>Request Access Test</h1>
        <%
            HttpServletRequest r = (HttpServletRequest) pageContext.getRequest();
            String aGreeting = (String) r.getAttribute("greeting");
            System.out.println(aGreeting);
            System.out.println("R's class is:" + r.getClass().getCanonicalName());
        %>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

在我的控制台上,我看到打印:

INFO: Hello from Request AccessTest
INFO: R's class is:org.apache.struts2.dispatcher.StrutsRequestWrapper
Run Code Online (Sandbox Code Playgroud)

所以我们真的在处理一个StrutsRequestWrapper(现在我们知道我们实际上正在处理它很容易)......

http://massapi.com/source/struts-2.2.1/src/core/src/main/java/org/apache/struts2/dispatcher/StrutsRequestWrapper.java.html

查看上面的链接我们看到getAttribute确实已被覆盖.

从第65行开始,我们看到它试图从请求中获取值,然后如果失败则继续将其从值堆栈中取出.

这记录在哪里?我想这里有记录,截至目前;)