Struts2传递变量的情况

时间:2015-01-13 17:43:08

标签: struts2 datatables ognl

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

我遇到了一些问题,因为数据表传递了预定义的内部变量(如iDisplayStart,iDisplayLength,iColumns,sSearch),但是Struts2无法接收这种类型的camelcase(只有第一个char低和第二个大写)。

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

@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,eMail,...... 我想这可能只是我的配置,但请在发布答案之前先试一试。

3 个答案:

答案 0 :(得分:3)

如果变量是

private String xTrace;

getter和setter应该是

public String getXTrace() {
    return xTrace;
}

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

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

答案 1 :(得分:1)

我通过使用HttpServletRequest检索变量并绕过struts方式来解决问题。

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

这将正确获取变量。

修改

更优雅的方式:

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

答案 2 :(得分:1)

  

但Struts2无法接收这种类型的camelcase(只有第一个字符低于第二个大写字母)

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

  

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

您可以在此处找到完整的说明:Referring to Properties

我不会详细介绍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单个小写字母不是大写字母。