Struts2 传递变量案例

Posted

技术标签:

【中文标题】Struts2 传递变量案例【英文标题】:Struts2 passing variables case 【发布时间】:2015-03-11 18:25:25 【问题描述】:

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

我遇到了一些问题,因为数据表正在传递预定义的内部变量(如 iDisplayStart、iDisplayLength、iColumns、sSearch),但 Struts2 无法接收这种驼峰式样式(只有第一个 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、电子邮件、... 我认为这可能只是我的配置,但请在发布答案之前尝试一下。

【问题讨论】:

@AndreaLigios 是对的。将您的 getter/setter 更改为 getXTrace/setXTrace 即可。 我的 getter 和 setter 是由 eclipse 生成的。试试我上面的代码。 当然可以。构造setter的算法很简单:加上前缀set,把参数的首字母转大写就可以了。所以对于xTrace参数S2会搜索setXTrace方法。 我认识人。试一试。使用 Eclipse 的 GGAS 为“iPad”和其他为“imPad”制作二传手。 见***.com/q/7264253/1700321。 【参考方案1】:

但是 Struts2 不能接收这种驼峰式风格(只有第一个 char 小写和第二个大写)

这实际上是不正确的。 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 开始,单个小写字母不再大写。

【讨论】:

对不起罗马。你也是对的,但@Andrea Ligios 先写了(他的答案被删除然后恢复)。感谢您的详细解释(像往常一样),虽然我不太了解。真正的问题在于我太信任的 Eclipse 方法生成器。 @MagnoC 这不是第一个、第二个或以后回答问题的人。在做出决定之前,您应该查看帖子的质量以及答案是否有助于您解决问题。我发现您的问题是关于 JavaBeans 约定的有趣讨论,我无法更好地解释它是我的问题。 同意。 @Andrea Ligios 解决了我的问题。我认为您的回答导致了问题的根源why should I follow the naming specs?how this work in deep?,但真正的问题是我在信任 Eclipse 方法名称生成方面的错误,因为如果我使用文本编辑器进行编码,我会正确编写。 Andrea Ligios 简单地说:you dumb! pay attention what you're doing. 问题在于 Eclipse 的生成是正确的并且它不是你的错误,但它不适用于 Struts。安德里亚的回答是正确的,但他没有解释任何事情。我认为你暗示的问题是在讨论他的答案。【参考方案2】:

如果变量是

private String xTrace;

getter 和 setter 应该是

public String getXTrace() 
    return xTrace;


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

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

【讨论】:

我认为你没有理解我的问题。 Setter 和 getter 是正确的(我总是使用 eclipse 快捷方式)。这将返回 null。自己试试。任何具有这种格式 的变量都将返回 null(iPad、iMac、eMail...)。 如承诺的那样。这是正确的解决方案。我总是使用 Eclipse GGAS 快捷方式并等待它始终正确。通过使用此快捷方式生成 getter 和 setter,然后“手动”更改它(或者为了不那么懒惰,绕过 Eclipse 快捷方式并编写所有方法),Struts 将按预期工作。【参考方案3】:

我是通过使用 HttpServletRequest 检索变量并绕过 struts 方式得出的。

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

这将正确获取变量。

编辑

更好更优雅的方式:

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

【讨论】:

赞成使用常量。 :) 请注意:您也可以使用ServletRequestAware 获取HttpServletRequest

以上是关于Struts2 传递变量案例的主要内容,如果未能解决你的问题,请参考以下文章

Struts2注解配置案例

struts2入门案例

struts2系列:struts2参数传递错误struts2的输入错误验证

struts2框架快速入门小案例

Struts2列表案例

Struts2学习笔记四:Struts2拦截器学习拦截器实现案例Struts2标签学习