Struts2传递变量案例

问题描述 投票:0回答:3

我正在使用 Datatables 服务器端 ajax 分页,需要将一些变量传递到服务器。 我的服务器正在运行 Struts2 操作来处理此数据表请求。

我面临一些问题,因为数据表正在传递预定义的内部变量(如 iDisplayStart、iDisplayLength、iColumns、sSearch),但 Struts2 无法接收这种驼峰风格(只是第一个字符小写,第二个字符大写)。

为了确保这一点,我创建了这个测试操作:

@Action (value = "dummy", 
    results = { 
        @Result(name="ok", type="httpheader", params={"status", "200"}) } 
    ) 

@ParentPackage("default")
public class DummyAction {
    private String xTrace;

    public String execute () {
        System.out.println( xTrace );
        return "ok";
    }

    public String getxTrace() {
        return xTrace;
    }

    public void setxTrace(String xTrace) {
        this.xTrace = xTrace;
    }

}

我正在调用此网址:

localhost:8580/sagitarii/dummy?xTrace=thisisatest

输出为 NULL,但是当我将 xTrace 更改为 xyTrace(以及 get、set 和 url)时,一切正常。 我怎样才能让它发挥作用?

* 编辑*

我已经尝试过使用这种格式的任何单词:iPad、iMac、iPhone、电子邮件…… 我认为这可能只是我的配置,但请在发布答案之前尝试一下。

struts2 datatables ognl
3个回答
3
投票

但是Struts2无法接收这种驼峰风格(只是第一个字符小写,第二个字符大写)

这实际上是不是真的。 Struts2 可以接收任何符合 JavaBeans 规范的变量名称。但除了 this 规范的 Java 实现之外。 (如果您想了解有关 JavaBeans 的更多信息,请参阅这篇文章到底什么是 JavaBean?),它使用自己的实现。因为 Struts2 使用 OGNL 来访问 bean 的属性,所以根据 OGNL 语言,您应该知道什么是“属性”。

什么是财产?粗略地说,OGNL 属性与 bean 属性相同,这意味着一对 get/set 方法,或者一个字段,定义一个属性(整个故事有点复杂,因为不同类型的对象的属性不同) ;请参阅下面的完整解释)。

您可以在这里找到完整的解释:参考属性

我不会深入探讨 OGNL 如何处理对象属性的细节,但它应该遵循

PropertyAccessor
的约定。对于不同类型的“属性”有很多实现。 OGNL 用于对象的是
ObjectPropertyAccessor
。这里只是描述它的作用:

实现

PropertyAccessor
,使用目标对象的类上的反射来查找具有给定属性名称的字段或一对 set/get 方法。

你可以通过浏览源代码找到它是如何做到的。我只想说,在与

get/set
方法前缀一起使用之前,它会将属性名称的第一个字母大写。所以,你问了

我怎样才能让它发挥作用?

更改属性的 getter/setter 的方法签名

public String getXTrace() {
    return xTrace;
}

public void setXTrace(String xTrace) {
    this.xTrace = xTrace;
}

更新:

自 OGNL 3.0.11 起,单个小写字母不再大写。


3
投票

如果变量是

private String xTrace;

getter 和 setter 应该是

public String getXTrace() {
    return xTrace;
}

public void setXTrace(String xTrace) {
    this.xTrace = xTrace;
}

不管双连续大写字符。规则是set/get部分后第一个字符大写,其余不变


1
投票

我通过使用 HttpServletRequest 检索变量并绕过 struts 方式找到了答案。

HttpServletRequest req = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
xTrace = req.getParameter("xTrace");

这将正确获取变量。

编辑

更好更优雅的方式:

正如 Aleksandr M 所评论的,将两个连续的 setter 名称更改为大写使得 struts 正确设置数据。

© www.soinside.com 2019 - 2024. All rights reserved.