Struts2 传递变量大小写
Struts2 passing variables case
我正在使用 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;
}
}
我称之为 URL:
localhost:8580/sagitarii/dummy?xTrace=thisisatest
输出为 NULL,但是当我将 xTrace 更改为 xyTrace(以及获取、设置和 url 时)一切正常。
我怎样才能让它发挥作用?
* 编辑 *
我已经尝试过使用这种格式的任何单词:iPad、iMac、iPhone、电子邮件、...
我认为这可能只是我的配置,但请在 post 回答之前尝试一下。
如果变量是
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 正确设置数据。
but Struts2 cannot receive this kind of camelcase style (just first one char lower and second upper case)
这实际上不正确。 Struts2 可以接收任何符合 JavaBeans 规范的变量名。但除了 this spec. (if you want to learn more about JavaBeans, see this post What is a JavaBean exactly?) 的 Java 实现之外,它使用自己的实现。因为 Struts2 使用 OGNL 访问 bean 的属性,你应该知道 "property" 根据 OGNL 语言是什么。
What is a property? Roughly, an OGNL property is the same as a bean property, which means that a pair of get/set methods, or alternatively a field, defines a property (the full story is a bit more complicated, since properties differ for different kinds of objects; see below for a full explanation).
您可以在此处找到完整的解释:Referring to Properties。
我不会深入探讨 OGNL 如何处理对象属性的细节,但它应该遵循 PropertyAccessor
的约定。有很多针对不同类型 "properties" 的实现。 OGNL 用于对象的是 ObjectPropertyAccessor
。这里只是描述它的作用:
Implementation of PropertyAccessor
that uses reflection on the target object's class to find a field or a pair of set/get methods with the given property name.
你可以通过浏览源代码找到它是如何做到的。我只是说它在使用 get/set
方法前缀之前将 属性 名称的第一个字母大写。所以,你问了
How can I make this to work?
更改 getter/setter 属性的方法签名
public String getXTrace() {
return xTrace;
}
public void setXTrace(String xTrace) {
this.xTrace = xTrace;
}
更新:
从 OGNL 3.0.11 开始,单个小写字母不再大写。
我正在使用 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;
}
}
我称之为 URL:
localhost:8580/sagitarii/dummy?xTrace=thisisatest
输出为 NULL,但是当我将 xTrace 更改为 xyTrace(以及获取、设置和 url 时)一切正常。 我怎样才能让它发挥作用?
* 编辑 *
我已经尝试过使用这种格式的任何单词:iPad、iMac、iPhone、电子邮件、... 我认为这可能只是我的配置,但请在 post 回答之前尝试一下。
如果变量是
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 正确设置数据。
but Struts2 cannot receive this kind of camelcase style (just first one char lower and second upper case)
这实际上不正确。 Struts2 可以接收任何符合 JavaBeans 规范的变量名。但除了 this spec. (if you want to learn more about JavaBeans, see this post What is a JavaBean exactly?) 的 Java 实现之外,它使用自己的实现。因为 Struts2 使用 OGNL 访问 bean 的属性,你应该知道 "property" 根据 OGNL 语言是什么。
What is a property? Roughly, an OGNL property is the same as a bean property, which means that a pair of get/set methods, or alternatively a field, defines a property (the full story is a bit more complicated, since properties differ for different kinds of objects; see below for a full explanation).
您可以在此处找到完整的解释:Referring to Properties。
我不会深入探讨 OGNL 如何处理对象属性的细节,但它应该遵循 PropertyAccessor
的约定。有很多针对不同类型 "properties" 的实现。 OGNL 用于对象的是 ObjectPropertyAccessor
。这里只是描述它的作用:
Implementation of
PropertyAccessor
that uses reflection on the target object's class to find a field or a pair of set/get methods with the given property name.
你可以通过浏览源代码找到它是如何做到的。我只是说它在使用 get/set
方法前缀之前将 属性 名称的第一个字母大写。所以,你问了
How can I make this to work?
更改 getter/setter 属性的方法签名
public String getXTrace() {
return xTrace;
}
public void setXTrace(String xTrace) {
this.xTrace = xTrace;
}
更新:
从 OGNL 3.0.11 开始,单个小写字母不再大写。