我有一个非常不同的对象列表,但需要成为一个列表的一部分。例如页面上的小部件列表(天气,时钟,Facebook ..)。它需要在一个列表中,因为这个列表需要被排序为10个块,随机化和分页。
我当前解决方案的高级视图如下所示:
一个抽象基类:
abstract class MyBaseClass
{
Object getMe()
{
return this;
}
}
普通父类
public class Common extends MyBaseClass
{
public String commonMethod()
{
return "somestring";
}
}
其他课程
public class A extends Common
{
public String method_1_ForA();
public String method_2_ForA();
}
public class B extends Common
{
public String method_1_ForB();
public String method_2_ForB();
}
此实现如下:
public class MyQuickTest
{
public void test()
{
List<A> listA = new ArrayList<>();
List<B> listB = new ArrayList<>();
List<Common> listCommon = new ArrayList<>();
listCommon.addAll(listA);
listCommon.addAll(listB);
foreach(Common common:listCommon)
{
common.getMe(); //will return an object of type A or B
}
}
}
为了显示上面的内容,我必须使用自定义标记lib返回上面的列表,并遍历我的jsp中的对象列表。然后,对于每个对象,我必须检查类型,然后调用适当的jsp / .tag来呈现项目。
我的问题是:
即
当前解决方案:
/// loop
<c:if test="${type==A}"> call render A JSP </c:if>
<c:if test="${type==B}"> call render B JSP </c:if>
// end loop
希望解决方案:
//loop
<dispatcher type="${type}"/> //load the appropriate render tag for the object
//end loop
非常感谢任何帮助或建议。
答案 0 :(得分:0)
我相信我已经设法找到上述两个问题(Q1,Q2)的解决方案。我的发现如下:
Q1。我不需要有一个返回对象的基类;只要所有子类继承自'Common',我就可以返回Common列表并使用instanceof获取子类型信息。因此,考虑到原始示例,我可以省略抽象类'MyBaseClass',而是执行以下操作。
public class MyQuickTest
{
public void test()
{
List<A> listA = new ArrayList<>();
List<B> listB = new ArrayList<>();
List<Common> listCommon = new ArrayList<>();
listCommon.addAll(listA);
listCommon.addAll(listB);
foreach(Common common:listCommon)
{
if(common instanceof B)
{
B b = (B) common;
String s = b.method_1_ForB();
//do some other logicfind solutions for the above problem.
}
}
}
Q2。有两种选择: 一世。加载html chuck作为对象的一部分(装饰器模式将是最适用的)。这与sitemesh采用的方法非常相似。所以伪代码就像:
//loop
<c:out value='${common.renderMe}'/> //print the string output (this can be the output of a velocity, thymleaf template render)
//end loop
II。动态加载适当的JSP并执行JSP include。遗憾的是,JSP包含不能将对象作为参数,因此您需要将方法用作使用嵌套范围变量的here方法。
*我选择使用选项'ii',因为关注点明显分离,即对象不需要知道它是如何呈现的,而是全部专用于JSP。 JSP方法对其他团队成员也更直观,并且保留了我们现有项目的常用方法*