3

由于最新版本中提供了安全修复程序,我从 2.1.6 升级到了 2.3.15.1。但是,现在表单字段值不会发布到 Action 类。基本上,HashMap props当提交表单时,我将 JSP 中的 填充到 Action 类中。当我将 struts 版本升级到 2.3.15.1 时,这不起作用。没有代码更改。当我调试代码时,我注意到该setProps方法没有被调用。这已经不允许了。有什么解决方法吗?一旦我恢复 struts 库的更改,一切都会完美。请帮忙。

这是我的代码的样子:

动作类

    private Map<String, Wall> props;

    public void prepare(){
          //fill up props map here.
        }
    public String view(){
        return INPUT;
    }

    public String save(){
        myService.setProps(props);
        return INPUT;
    }

    public void setProps(Map<String, Wall> props) {
        this.props = props;
    }

    public Map<String, Wall> getProps() {
        return props;
    }

JSP

<s:iterator value="props.entrySet()" id="prop" status="propStatus">
    <s:textfield name="props['%{#prop.key}'].value" value="%{#prop.value.value}" />
</s:iterator>
4

2 回答 2

1

自 Struts 2.1.6 以来发生了巨大的变化。如果您没有明确告诉它这样做,Struts 2 将不会为您创建对象。该方法在拦截器设置为操作prepare之前调用,并且您评论说您填充了地图 paramsprops

//在这里填写道具地图。

毫不奇怪,Struts 没有调用那个 setter,setProps因为它已经包含了一个 map 实例。所以,它只是调用getProps. 然后它应该将索引属性值设置为地图。但它不知道作为要转换为集合元素的对象的类型,以及它是否应该为 element 创建一个新对象(如果它是null. 通过在字段上添加注释,props它应该可以解决在提交时填充地图的问题。

@Element(value = Wall.class)
@CreateIfNull(value = true)
private Map<String, Wall> props = new HashMap<>();

我猜它会自动确定的关键。如果您在Action-conversion.properties

Element_props=Wall
CreateIfNull_props=true

接下来可以将您的 JSP 替换为

<s:iterator value="props">
    <s:textfield name="props['%{key}'].value" />
</s:iterator>

最后一个Wall你还没有发布的课程,应该看起来像

public class Wall {
  String value;
  //getter and setter here
} 
于 2013-08-03T08:04:24.300 回答
1

解决了。在新的 Struts 版本中,参数名称更加严格。就我而言,我有参数名称,例如props['1.2.3'], props['a.b.c'] or props['a-b-c']. 这些被新的支柱过滤掉了。这是解释这一点的链接:http: //struts.apache.org/development/2.x/docs/s2-009.html。最后一部分解释了为什么这些集合可能会停止工作。

我将拦截器堆栈中的 acceptParamNames 更改为<param name="acceptParamNames">\w+((\.\w+)|(\[\d+\])|(\['\w+(\-\w+)*'\]))*</param>,它解决了这个问题。我去掉了props['a.b.c']属性名称,所以上面的正则表达式没有涵盖它,但它确实涵盖了props['a-b-c'].

感谢@Roman C 挺身而出帮助我。

于 2013-08-08T07:25:07.553 回答