这可能更像是一个咆哮而不是一个可以实际回答的问题。我不肯定。我怀疑这可能是很多人遇到的情况,但希望这是一个有用的问题。
我们有 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/