我使用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,...... 我想这可能只是我的配置,但请在发布答案之前先试一试。
答案 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单个小写字母不是大写字母。