我正在使用 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无法接收这种驼峰风格(只是第一个字符小写,第二个字符大写)
这实际上是不是真的。 Struts2 可以接收任何符合 JavaBeans 规范的变量名称。但除了 this 规范的 Java 实现之外。 (如果您想了解有关 JavaBeans 的更多信息,请参阅这篇文章到底什么是 JavaBean?),它使用自己的实现。因为 Struts2 使用 OGNL 来访问 bean 的属性,所以根据 OGNL 语言,您应该知道什么是“属性”。
什么是财产?粗略地说,OGNL 属性与 bean 属性相同,这意味着一对 get/set 方法,或者一个字段,定义一个属性(整个故事有点复杂,因为不同类型的对象的属性不同) ;请参阅下面的完整解释)。
您可以在这里找到完整的解释:参考属性。
我不会深入探讨 OGNL 如何处理对象属性的细节,但它应该遵循
PropertyAccessor
的约定。对于不同类型的“属性”有很多实现。 OGNL 用于对象的是 ObjectPropertyAccessor
。这里只是描述它的作用:
实现
,使用目标对象的类上的反射来查找具有给定属性名称的字段或一对 set/get 方法。PropertyAccessor
你可以通过浏览源代码找到它是如何做到的。我只想说,在与
get/set
方法前缀一起使用之前,它会将属性名称的第一个字母大写。所以,你问了
我怎样才能让它发挥作用?
更改属性的 getter/setter 的方法签名
public String getXTrace() {
return xTrace;
}
public void setXTrace(String xTrace) {
this.xTrace = xTrace;
}
更新:
自 OGNL 3.0.11 起,单个小写字母不再大写。
如果变量是
private String xTrace;
getter 和 setter 应该是
public String getXTrace() {
return xTrace;
}
public void setXTrace(String xTrace) {
this.xTrace = xTrace;
}
不管双连续大写字符。规则是set/get部分后第一个字符大写,其余不变
我通过使用 HttpServletRequest 检索变量并绕过 struts 方式找到了答案。
HttpServletRequest req = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
xTrace = req.getParameter("xTrace");
这将正确获取变量。
编辑
更好更优雅的方式:
正如 Aleksandr M 所评论的,将两个连续的 setter 名称更改为大写使得 struts 正确设置数据。