这就是我的课程的样子:
public abstract class BaseForm extends Z{
protected String someString;
public String getSomeString(){
return this.someString;
}
public void setSomeString(String some){
this.someString = some;
}
}
public abstract class AdvancedForm extends BaseForm{
protected Something selectedThing;
protected List<Something> listOfThings;
public Something getSelectedThing(){
return this.selectedThing;
}
public void setSelectedThing(Something thing){
this.selectedThing = thing;
}
public List<Something> getListOfThings(){
return this.listOfThings;
}
public void setListOfThings(List<Something> list){
this.listOfThings = list;
}
}
public class FinalForm extends AdvancedForm{
//Lot of stuff done here
}
所以我有类似于你上面看到的东西。当我创建JSP并尝试调用get/setListOfThings
方法时,问题就来了。
<html:html>
...
<html:select name="FinalForm" property="selectedThing">
<html:optionsCollection name="FinalForm" property="listOfThings" label="label" value="value" />
</html:select>
...
</html:html>
我知道我在这里遗漏了一些东西(struts-config.xml
和tiles-def.xml
存在并且是正确的),但我的观点是struts应该调用FinalForm
'{{ 1}}方法。这应该调用setListOfThings
的{{1}}方法(实现的方法),因为AdvancedForm
正在扩展setListOfThings
而我没有覆盖FinalForm
中的方法{1}}。
无论如何,这不起作用,我不知道出了什么问题。唯一可行的方法是,如果我覆盖该方法并从AdvancedForm
明确调用FinalForm
。
setListOfThings
我想避免重写,因为创建AdvancedForm
类的目的是删除我的大多数表单正在使用的许多功能(但不是全部,这是存在的原因) public class FinalForm extends AdvancedForm{
//...
public List<Something> getListOfThings(){
return super.getListOfThings();
}
}
和AdvancedForm
类。
为什么这不起作用的任何想法?有什么想法来改善这个吗?任何人都可以向我解释我做错了什么?提前谢谢!
答案 0 :(得分:2)
你的功能肯定会很棒。但是如果你在struts json中渲染结果,它将不会获得超类属性。 如果是json,你必须按照以下方式定义你的struts.xml
<result type="json">
<param name="ignoreHierarchy">false</param>
</result>
类似的讨论:How to include parent class fields in json response using struts 2 json plugin
答案 1 :(得分:0)
您需要在超类中使用方法public
而不是protected
,否则Struts类将无法看到它。
答案 2 :(得分:0)
它不起作用只是因为该方法受到保护。一旦你覆盖它,它就可以了,因为你将覆盖方法公之于众。
只需将基本方法公开,(几乎)一切都会好的。
提交表单后,应调用setSelectedThing
方法。问题是Struts无法将请求中收到的String
参数神奇地转换为Something
实例。 selectedThing
属性的getter和setter应使用String
而不是Something
。