1

我正在研究 Struts,遇到了一些奇怪的行为。虽然它没有产生任何错误或错误,但我只是认为与你们分享它会很有趣。

也许你们中的一个可以解释为什么会发生这种情况。

使用以下代码创建一个 Struts 动作 -

public class MyAction extends ActionSupport {
    private Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>();
    public String execute() {
        System.out.println(map);
        return SUCCESS;
    }

    public Map<String, Map<String, Object>> getMap() {
        return map;
    }

    public void setMap(Map<String, Map<String, Object>> map) {
        this.map = map;
    }
}

创建关联的映射和所需的 Jsp 并执行操作。您将在控制台上看到以下输出 -

{systemProperties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_32\jre\bin, java.vm.version=20.7-b02, shared.loader=${catalina.base}/shared/classes ....

显然,Struts 正在将系统属性注入到我的地图中。但它为什么这样做呢?我没有要求它这样做。我没有使用任何特殊的 XML 配置或注释。Struts 的哪一部分(什么拦截器)对此负责?我刚刚发现了一个错误还是这是正常行为?如果这很正常,为什么 Struts 开发人员认为注入每个Map<String, Map<String, Object>>系统属性是明智的?

4

1 回答 1

0

我自己试过这个,我的猜测是正确的。您在此处发布的代码不会产生任何此类结果。您可以通过查看代码自己轻松发现这一点。地图上没有任何内容,只有 getter 和 setter。

"So apparently Struts is injecting the system properties into my map"

如果您将参数传递给此操作,例如使用表单,Struts 将在该操作中查找其对应的 setter-method。这表明在您的代码、表单或参数中的某处,您有一些被称为"map"传递给此操作的东西。

首先查看你的struts.xml,看看你是否在那里设置了一些参数。如果不是,请仔细查看您从哪里调用操作以及发送它的参数。然后你应该能够在地图中找到你经过的地方。

于 2012-06-26T09:10:06.877 回答