gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:06:01 24 4
gpt4 key购买 nike

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

来自 Action 类的代码(它不会将它添加到类中,只会添加到值堆栈中):

private PaginatedChunk searchResults;   


public PaginatedChunk getSearchResults() {
return searchResults;
}

public void setSearchResults(PaginatedChunk searchResults) {
this.searchResults = searchResults;
}

这是自定义标记中的代码,它从请求中提取值(并且有效!?):

HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
PaginatedChunk searchResults = (PaginatedChunk) request.getAttribute("searchResults");

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

我们正在运行 struts2 v2.1.8.1

最佳答案

乍一看我肯定会同意。您显示的内容看起来不直观。但真正发生的是从值堆栈中获取对请求对象的访问权,而不是相反。您从值堆栈中的 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 }

getContext().get() 返回一个对象,我们知道它是一种 PageContext。但是实现类是什么?

创建一个简单的 Action :

package com.quaternion.action.test;

import com.opensymphony.xwork2.ActionSupport;

public class RequestAccessTest extends ActionSupport{
public String getGreeting(){
return "Hello from Request AccessTest";
}
}

然后在 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>

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

INFO: Hello from Request AccessTest
INFO: R's class is:org.apache.struts2.dispatcher.StrutsRequestWrapper

所以我们实际上是在处理 StrutsRequestWrapper(现在我们知道我们实际处理的是什么很容易)...

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

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

从第 65 行开始,我们看到它尝试从请求中获取值,如果失败,它会继续从值堆栈中获取值。

这是在哪里记录的?我想它已经记录在这里,截至目前 ;)

关于java - 如何从 HttpServletRequest 对象访问 Struts 值堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com