3

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

我们有 jsps 可以呈现大约 40 种不同状态的信息。假设这是一个复杂的金融产品的状态。所以我们想要输出依赖于状态的消息,例如状态 10 可能是“您的产品正在等待激活”,状态 15 可能是“您的产品处于活动状态”等等。

所以看起来我们可以有一个简单的查找,根据状态返回适当的消息,这一切都很好。

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

因此,通过 itsef 获得的状态并未捕获确定和创建消息所需的所有信息。还有许多其他无关的信息也是必需的。

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

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

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

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

我不确定我是否提供了足够的细节以使问题变得清晰,但是如果有人有任何建议,我将非常感激..

编辑:感谢您的所有回答!代码是如此的复杂,以至于我通过将通用代码拉入包含文件中对其进行了一些重构,以便我可以在需要它们的地方包含这些文件。我肯定会按照您的建议使用函数进一步封装事物。很快就会回到你的答案。再次感谢。

4

3 回答 3

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的任何一个页面、请求或会话范围中将对象映射为“产品”),如下所示

<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};
于 2013-06-11T05:22:20.413 回答
0

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

于 2013-06-11T05:12:14.040 回答
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;
    }

}

状态信息类:

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.
%>
于 2013-06-11T04:42:14.070 回答