java - 如何处理jsps中的复杂性

标签 java jsp refactoring jstl

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

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

所以看起来我们可以进行一个简单的查找,根据状态返回适当的消息,并且一切正常。

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

因此状态本身并没有捕获确定和创建消息所需的所有信息。还需要许多其他无关的信息。

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

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

简而言之,就是乱七八糟。

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

我不确定我是否提供了足够的细节来阐明问题,但如果有人有任何建议,我将不胜感激..

编辑:感谢您的所有回答!代码太复杂了,我通过将通用代码拉入包含文件来对它进行了一些重构,这样我就可以在需要的地方包含这些文件。我肯定会按照您的建议进一步封装功能。很快就会回到你的答案。再次感谢。

最佳答案

我相信您现有的 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>

实现Tag使用您的 Scriptlet 中当前存在的 Java 代码进行分类。

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

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

添加 taglib 后指令到你的 JSP

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

处理消息渲染( View )

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

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

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

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

关于java - 如何处理jsps中的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17036258/

相关文章:

java - 安卓Java : How do I update an object inside a method?

visual-studio - Visual Studio 2015 中缺少重构菜单

java - Eclipse 重构 - 用直接字段访问替换 Java getter 和 setter

c# - 几乎重复的单元测试

java - 使用openssl解密用java加密的aes-gcm

java - 序列化二叉搜索树

java - 在另一个 if 语句中获取库存

java - 无法从servlet到jsp获取对象

java - 如何在FTL(Freemarker)中访问列表映射

java - 当对象的状态发生变化时如何通知 JSP?