Java 如何处理JSP中的复杂性

Java 如何处理JSP中的复杂性,java,jsp,refactoring,jstl,Java,Jsp,Refactoring,Jstl,这与其说是一个可以回答的问题,不如说是一个咆哮。我还不确定。我怀疑这可能是很多人都会遇到的情况,所以希望这是一个有用的问题 我们有JSP,它可以提供大约40种不同状态的信息。假设这是一个复杂金融产品的状态。因此,我们希望输出依赖于状态的消息,例如,状态10可能是“您的产品正在等待激活”,状态15可能是“您的产品正在激活”,等等 因此,我们似乎可以有一个简单的查找,根据状态返回适当的消息,并且所有这些都可以灵活地工作 但在现实中,光靠地位还不足以确定正确的信息。如果状态为10(待定激活),但在激活

这与其说是一个可以回答的问题,不如说是一个咆哮。我还不确定。我怀疑这可能是很多人都会遇到的情况,所以希望这是一个有用的问题

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

因此,我们似乎可以有一个简单的查找,根据状态返回适当的消息,并且所有这些都可以灵活地工作

但在现实中,光靠地位还不足以确定正确的信息。如果状态为10(待定激活),但在激活后1周内,则我们希望将消息涂成红色。如果状态为10(待定激活),但有外部原因延迟,我们需要一条消息,提供指向解释页面的链接。等等

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

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

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

简言之,这是一个大烂摊子

我认为理想的答案是重构事物,以便所有的决策都来自JSP。呃,我不知道正确的处理方法是什么。这里有很多复杂的东西,我不知道从哪里开始

我不确定我是否提供了足够的细节,甚至不能把问题弄清楚,但如果有人有任何建议,我将不胜感激


编辑:谢谢你的回答!代码非常复杂,我已经通过将普通代码拉入包含文件中对其进行了一些重构,这样我就可以在需要的地方包含这些文件。我肯定会按照您的建议,进一步使用函数封装东西。我很快就会回到你的答案上来。再次感谢。

创建一个
Util类
,方法是通过参数接收状态、日期等。。。因此,该方法的返回将是一个对象,其中包含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:



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

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

处理消息内容 实现标记,使其将生成消息所需的任何内容(如
产品
对象本身)作为其属性之一

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

然后在JSP中调用它(在任何一个页面、请求或会话范围中将
Product
对象映射为“Product”),如下所示

<custom:statusMesg product="${product}" />
处理消息呈现(视图) 您需要决定消息呈现颜色的部分应使用
CSS
样式表进行处理。您可以让自定义标记确定消息优先级,然后使用适当的CSS样式
返回消息,如

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

不管谁否决了投票给我。。。你能至少解释一下原因吗?
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);
  }
}
<custom:statusMesg product="${product}" />
<%@ taglib prefix="custom" uri"WEB-INF/status.tld" %>
<span class="priorityHigh">Needs activation within 1 week</span>
.priorityHigh {color: red};
.priorityNormal {color: black};
.priorityLow {color: green};