我遇到了一些通过简单地在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()返回一个Object,我们知道这是一种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行开始,我们看到它试图从请求中获取值,然后,如果失败,它将继续从值堆栈中获取值。
这在哪里记录?我想到目前为止,它已经记录在这里了;)