我正在将此参数发送到我的 struts 操作
cdata[1]=栏
在我的行动中,我对索引和值感兴趣。 我为
CDATA
定义了一个 getter/setter 对,如 OGNL 文档 所示:
public void setCdata(int index, String value){
LOG.info("setData; key="+ key +"; value="+ value);
// store index and value;
}
public String getCdata(int index){
return null; // don't really need a setter
}
这是我得到的异常:
2013-04-29 15:38:49,792 [http-apr-8080-exec-3] WARN com.opensymphony.xwork2.util.logging.commons.CommonsLogger.warn(CommonsLogger.java:60) - Error setting expression 'cdata[1]' with value '[Ljava.
lang.String;@4223d2a4'
ognl.OgnlException: target is null for setProperty(null, "1", [Ljava.lang.String;@4223d2a4)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2309)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.ASTChain.setValueBody(ASTChain.java:227)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
...
如果我定义了一个公共成员变量
String[] cdata = new String[1000]
,我在日志中没有看到任何异常,但我的设置器也没有被调用。如果成员变量是私有的,我会再次遇到另一个异常。
使用以下设置
List<String> cdata = new ArrayList<String>();
public List<String> getCdata() {
return cdata;
}
public void setCdata(final List<String> cdata) {
if (cdata == null) {
this.cdata = new ArrayList<String>();
} else {
this.cdata = cdata;
}
}
从 JSP 提交值,例如 cdata[1]=value 等
唯一的要求是拥有 getter/setter。我已经测试过这个 Tomcat7 在 java 1.6 上运行。您也可以类似地提交 cdata[0]、cdata[1] 等值
private Map<String, String> data = new HashMap<String, String>();
public Map<String, String> getData() {
return data;
}
public void setData(Map<String, String> data) {
this.data = data;
}
JSP可以有
<s:form action="indexProperty">
<h3>Test The Map</h3>
<input type="text" name="data['0']"/>
<input type="text" name="data['1']"/>
<s:iterator value="data.entrySet()" var="aData">
<s:property value="#aData.key" />-<s:property value="#aData.value" />
</s:iterator>
<input type="submit" name="submit" value="submit"/>
</s:form>
毫无问题地填充
我的解决方案(相当丑陋的黑客):
我让我的动作类实现了
ServletRequestAware
,并在动作中迭代来自HttpServletRequest
的参数映射,从中获取cdata并解析它的索引和值
我必须更改发送的参数并进行编码,例如
cdata[999]=foobar
,就像cdata_999_=foobar
一样,因为如果它看起来像数组字段,struts需要在操作类中有一个setter / getter。
根据文档,OGNL提供了对JavaBeans索引属性的支持:OGNL参考指南:
JavaBeans 支持索引属性的概念。具体来说,这意味着一个对象具有一组遵循以下模式的方法:
public PropertyType[] getPropertyName();
public void setPropertyName(PropertyType[] anArray);
public PropertyType getPropertyName(int index);
public void setPropertyName(int index, PropertyType value);
您没有实现所有这些方法。此外,如果您没有初始化数组,则无法设置值。
您可以在此处阅读有关索引属性的更多信息。
索引属性
索引属性是一个数组而不是单个值。在本例中,bean 类提供了获取和设置整个数组的方法。以下是名为
的
int[]
属性的示例:testGrades
public int[] getTestGrades() {
return mTestGrades;
}
public void setTestGrades(int[] tg) {
mTestGrades = tg;
}
对于索引属性,bean 类还提供了获取和设置数组特定元素的方法。
public int getTestGrades(int index) {
return mTestGrades[index];
}
public void setTestGrades(int index, int grade) {
mTestGrades[index] = grade;
}