在jsp中访问不同类的方法

时间:2015-08-13 09:33:25

标签: java jsp

我是java和JSP的新手,我对访问tag类的方法有疑问。我创建了3个自定义标签,即Primary,Secondary,Axis。所以我可以访问

<pre:Primary>
  <pre:Axis/>
</pre:Primary>

<pre:Secondary>
<Pre:Axis/>
</pre:Secondary> 

在Axis Tag类中,我必须访问父方法,在这种情况下,primary,secondary是Axis标记的父方法。在两个父类中,我有方法addItem(),我在轴类中调用如下方法。

 Object parent=null;
         try{
             parent = (PrimaryWrapper)getParent();
         }catch(Exception e){
            parent = (SecondaryWrapper)getParent();
         }
     parent.addItem(axisItem);

但这显示错误,&#34;方法addItem(StringBuilder)未定义类型Object&#34;,我知道在try中,只捕获父级的范围正在更改为primary / secondary,因此错误发生。但我必须访问基于Primary,Secondary的相应addItem方法。可能吗?或者我做错了。

提前致谢

1 个答案:

答案 0 :(得分:1)

问题是parent变量属于类Object,因此您分配给它的任何内容都只能使用Object的方法。我基本上看到了两种可能的解决方案。

快速而肮脏

Object parent = getParent();
if (parent instanceof PrimaryWrapper) {
  ((PrimaryWrapper) parent).addItem(axisItem);
} else if (parent instanceof SecondaryWrapper) {
  ((SecondaryWrapper) parent).addItem(axisItem);
} else {
  // log error?
}

更好 - 使用界面

// define an interface
public interface ItemContainer {
  void addItem(StringBuilder item);
}

// change your Wrappers to implement the interface, i.e.
public class PrimaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}
// and
public class SecondaryWrapper extends ... implements ItemContainer {
  // ... your code, just add @Override annotation to the addItem(...) method
}

// and finally, fix the AxisTag code
ItemContainer parent = (ItemContainer) getParent();
parent.addItem(axisItem);

或者,正如Hacketo的评论中提到的,您可以创建一个共同的祖先类(例如Wrapper)并在那里实现常用方法,而不是创建和接口。 AxisTag的代码与上述带接口的解决方案类似。