如何处理jsps的复杂性

时间:2013-06-11 03:56:04

标签: java jsp refactoring jstl

这可能更像是一个实际可以回答的问题。我不肯定。我怀疑这可能是很多人遇到的情况,所以希望这是一个有用的问题。

我们有jsps,可以提供大约40种不同状态的信息。让我们说这是一个复杂的金融产品的状态。因此,我们希望输出依赖于状态的消息,例如状态10可能是“您的产品正在等待激活”,状态15可能是“您的产品处于活动状态”等等。

所以看起来我们可以有一个简单的查找,根据状态返回相应的消息,它们都可以很好地工作。

但实际上,仅凭地位还不足以确定正确的信息。如果它的状态为10(待激活),但它在激活后的1周内,那么我们想要将消息着色为红色。如果它的状态为10(待激活)但是有一个外部原因延迟它,我们需要一条消息,提供指向解释页面的链接。等等。

因此,itsef的状态不会捕获确定和创建消息所需的所有信息。还需要许多其他无关的信息。

遗留代码的工作方式,将所有这些信息加载到jsp中,然后jsp根据此非状态信息进行确定。

现在我们正在重做网站,我面临的情况是我们需要在多个不同的地方使用相同的状态逻辑,但输出不同的包装html。

简而言之,这是一个很大的混乱。

我认为理想的答案是重构事物,以便所有决定都从jsps中取出。呃,我不确定处理它的正确方法是什么。有很多棘手的复杂性,我不知道从哪里开始。

我不确定我是否已经提供了足够的细节来解决问题,但如果有人有任何建议,我将非常感激......

编辑:谢谢你的所有答案!代码是如此巧妙,以至于我通过将公共代码拉入包含文件来重构它,以便我可以将这些文件包含在需要它们的地方。我肯定会按照你的建议考虑使用函数进一步封装。很快就会回过头来回答你的问题。再次感谢。

3 个答案:

答案 0 :(得分:3)

我相信您现有的JSP正在使用大量<% // scriptlets %>来实现最终状态消息。我建议你编写一个自定义标记,它将所有Java逻辑从JSP中分解出来。

处理邮件内容

实施标记,以便生成消息所需的任何内容(例如您的Product对象本身)作为其属性之一。

WEB-INF / status.tld (标记库描述符)

<taglib ... >
  <uri>WEB-INF/status.tld</uri>
  <tag>
    <name>statusMesg</name>
    <tag-class>com.foo.StatusMesgTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>product</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>com.foo.beans.Product</type>
    </attribute>
  </tag>
</taglib>

使用当前存在于scriptlet中的Java代码实现Tag类。

pubic class StatusMesgTag extends SimpleTagSupport {

  private Product product;

  public void setProduct(Product product) {
    this.product = product;
  }

  public void doTag() throws JspException, IOException {
    StringBuilder statusMesg = new StringBuilder();

    // process Product info to generate mesg

    getJspContext().getOut().println(statusMesg);
  }
}

然后在JSP中调用它(Product对象映射为&#34;产品&#34;在任何一个页面,请求或会话范围中),如下所示

<custom:statusMesg product="${product}" />

taglib指令添加到JSP

之后
<%@ taglib prefix="custom" uri"WEB-INF/status.tld" %>

处理消息呈现(视图)

应该使用CSS样式表处理您需要确定消息应该呈现的颜色的部分。您可以让自定义标记确定邮件优先级,然后使用适当的CSS样式class返回您的邮件

<span class="priorityHigh">Needs activation within 1 week</span>

您的CSS会将不同的优先级映射到不同的颜色,如

.priorityHigh {color: red};
.priorityNormal {color: black};
.priorityLow {color: green};

答案 1 :(得分:0)

创建一个Util class,其方法是通过参数接收状态,日期等 ...因此,方法的返回将是一个具有所有信息属性的对象jsp需要渲染它。 像这样:

class MyStatusUtil{

    public static StatusInfo getStatusInfo(int status, Date date, etc...){
      StatusInfo info = new StatusInfo();
      if(status==10){
         info.setStatusName("....");
      }

      .....
     if(date==....){
       info.setColor("...");

     }

     if(somethinElse){
       info.setComment("....");
     }
     return info;
    }

}

StatusInfo类:

class StatusInfo{
    private String statusName;
    private String color;
    private String comment;

}

JSP:

<% StatusInfo info = MyStatusUtil.getStatusInfo(....) 
  //now render the html based on the StatusInfo data.
%>

答案 2 :(得分:0)

您可以使用带有几个参数的自定义jstl标记吗?