出于安全考虑,我们更新了Struts 2.3.15.1。当我们这样做时,我们注意到我们失去了一些使用jsp中的点符号方法设置值的能力。如果我们有一个采用Foo类的地图而Foo有一个Bar类,那么我们之前已成功使用隐藏字段为Foo设置Bar类。当我们更新时,Bar类现在变为null,而在Bar类之前 - 在下面的示例中 - 将为Foo创建并给出id值为12.我知道这类似于2.3.15.1上的问题没有设置hashmap值,但是该帖子中的建议已经尝试没有成功:
[Upgrading to struts 2.3.15.1 does not set HashMap values on action class
我们需要在jsp中使用一种语法来获取Struts新版本的先前结果吗?
Class Foo
private Bar bar;
private String name;
public Bar getBar(){
return bar;
}
public void setBar(Bar bar){
this.bar = bar;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
Class Bar
private int id
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
类ActionClass {
private Map<String, Foo> userInputMap;
public Map<String, Foo> getUserInputMap(){
return userInputMap;
}
public void setUserInputMap(Map<String, Foo>, userInputMap){
this.userInputMap = userInputMap;
}
}
的Input.jsp
<s:hidden name="foo.userInputMap<'first_map_key'>.bar.id" value="12" />
<s:textarea name="foo.userInputMap<'first_map_key'>.name />
答案 0 :(得分:1)
<s:iterator value="userInputMap" >
<s:hidden name="userInputMap['%{key}'].bar.id" />
<s:textarea name="userInputMap['%{key}'].name" />
</s:iterator>
答案 1 :(得分:1)
我想回头看,原来的海报是我的同事。
我们终于找到了这个问题的答案。问题不是我们想的,问题是请求参数很长。 S2-011(参见https://struts.apache.org/release/2.3.x/docs/s2-011.html)将请求参数长度减少到100个字符。
字段中的名称被用作请求参数,在某些情况下,我们的字段名称为120个字符。
通过将以下代码放入我们的struts.xml文件中,问题得以解决。
<interceptor-ref name="params">
<param name="paramNameMaxLength">150</param>
</interceptor-ref>