动态加载不同类型对象列表的标记

时间:2015-02-20 11:30:26

标签: java jsp arraylist collections jsp-tags

我有一个非常不同的对象列表,但需要成为一个列表的一部分。例如页面上的小部件列表(天气,时钟,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来呈现项目。

我的问题是:

  1. 是否有更好的方式来支持这一点,而不是返回&#39;对象&#39;从基类?
  2. 我怎样才能避免在我的JSP中编写if?有没有办法可以纯粹基于类型加载标签? - 谷歌告诉我没有...或者如果没有按类型加载是否有任何其他技术,方法或设计模式,将提供更优雅的解决方案?
  3. 当前解决方案:

    /// 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
    

    非常感谢任何帮助或建议。

1 个答案:

答案 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方法对其他团队成员也更直观,并且保留了我们现有项目的常用方法*