当前位置: 首页 > 知识库问答 >
问题:

Struts2传递变量的情况

乌骏
2023-03-14

我正在使用Datatables服务器端ajax分页,需要向服务器传递一些变量。我的服务器正在运行Struts2操作来处理此datatables请求。

我面临一些问题,因为datatable正在传递预定义的内部变量(如iDisplayStart,iDisplayL长度,iColns,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(以及get、set和url)时,一切都很好。我怎样才能让这工作?

*编辑*

我已经尝试过这种格式的任何单词:iPad,iMac,iPhone,电子邮件,...我想这可能只是我的配置,但请在发布答案之前尝试一下。

共有3个答案

晋骏喆
2023-03-14

我通过使用HttpServletRequest检索变量并绕过struts找到了答案。

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

这将正确获取变量。

编辑

更好更优雅的方式:

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

颛孙庆
2023-03-14

如果变量为

private String xTrace;

getters和setters应该是

public String getXTrace() {
    return xTrace;
}

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

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

连德水
2023-03-14

但是Struts2不能接收这种camelcase样式(仅第一个字符小写,第二个字符大写)

事实并非如此。Struts2可以接收任何符合JavaBeans规范的变量名。但是除了该规范的Java实现之外(如果您想了解更多关于JavaBeans的信息,请参阅本文什么是JavaBean?),它使用自己的实现。因为Struts2使用OGNL访问bean的属性,所以根据OGNL语言,您应该知道“属性”是什么。

什么是财产?大体上,OGNL属性与bean属性相同,这意味着一对get/set方法,或者一个字段,定义了一个属性(完整的故事要复杂一些,因为不同类型的对象的属性不同;请参阅下面的完整解释)。

你可以在这里找到完整的解释:指的是属性。

我不会深入研究OGNL如何处理对象的属性,但它应该遵循财产访问器的契约。对于不同类型的“属性”有很多实现。OGNL用于对象的对象是Object属性访问器。这里仅仅描述一下它的作用:

使用目标对象类的反射来查找具有给定属性名称的字段或一对set/get方法的属性访问器的实现。

你可以通过浏览源代码找到它是如何工作的。我只想说,它在将属性名的第一个字母大写,然后将其与get/set方法前缀一起使用。那么,你已经问过了

我怎样才能让这工作?

更改属性的getter/setter的方法签名

public String getXTrace() {
    return xTrace;
}

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

更新:

自OGNL 3.0.11以来,单个小写字母不会上调。

 类似资料:
  • 问题内容: 这是我的问题: 当我用JavaScript编写此代码时 // 好: 但是,当我尝试在属性标签中动态设置该值时,没有任何执行。 // 不好: 有人可以帮我吗? 问题答案: Struts标签,例如JSTL,EL等,是在服务器端执行的。执行完所有这些步骤后,仅HTML的最终页面将呈现给客户端。只有这样,JavaScript才能在页面上运行。 您不能混合使用javascript和Struts标

  • 问题内容: 这是我的问题: 当我用JavaScript编写此代码时 // 好: 但是,当我尝试在属性标签中动态设置该值时,没有任何执行。 // 不好: 有人可以帮我吗? 问题答案: Struts标签,例如JSTL,EL等,是在服务器端执行的。执行完所有这些步骤后,仅HTML的最终页面将呈现给客户端。只有这样,JavaScript才能在页面上运行。 您不能混合使用javascript和Struts标

  • 问题内容: 我有Google地图提供的JavaScript值,需要将其保存在MySQL数据库中。 其实我有变量 我需要将该变量传递给PHP变量lugar 问题答案: 如果要在页面转换时进行操作,则可以通过表单或在URL中传递它,然后仅使用或接收变量。 如果您需要无缝完成它,那么您可能需要考虑使用AJAX。

  • 为了使Playbook更灵活、通用性更强,允许用户在执行的时候传入变量的值,这个时候就需要用到“额外变量”。 定义命令行变量 在release.yml文件里,hosts和user都定义为变量,需要从命令行传递变量值。 --- - hosts: '{{ hosts }}' remote_user: '{{ user }}' tasks: - ... 使用命令行变量 在命令行里面传值

  • 问题内容: 我正在尝试将jquery字符串传递给我的cakephp控制器,但我不断收到一条错误消息,指出json_decode需要一个字符串,但传递了一个数组。 这是我的ajax的代码: 在我的控制器中,我试图像这样接收数据: 但是我得到上面提到的错误的任何想法如何解决这一点将非常感谢。 问题答案: 您确定使用的网址正确吗?如果您使用的是CakePHP,那么为什么不使用它呢? 尝试使用以下命令调试

  • 问题内容: 我在位于Xcode中两个不同.storyboard文件内的两个不同UIViewControllers之间传递数据。(这是一个很大的项目,因此我不得不将其分解为不同的故事板。) 我已经在要向其传递数据的视图中建立了一个“ exercisePassed”变量(字符串),而且我已经知道如何在位于不同情节提要中的两个视图之间移动。像这样 如何不使用Segue / PrepareForSegue