这可能更像是一个实际可以回答的问题。我不肯定。我怀疑这可能是很多人遇到的情况,所以希望这是一个有用的问题。
我们有jsps,可以提供大约40种不同状态的信息。让我们说这是一个复杂的金融产品的状态。因此,我们希望输出依赖于状态的消息,例如状态10可能是“您的产品正在等待激活”,状态15可能是“您的产品处于活动状态”等等。
所以看起来我们可以有一个简单的查找,根据状态返回相应的消息,它们都可以很好地工作。
但实际上,仅凭地位还不足以确定正确的信息。如果它的状态为10(待激活),但它在激活后的1周内,那么我们想要将消息着色为红色。如果它的状态为10(待激活)但是有一个外部原因延迟它,我们需要一条消息,提供指向解释页面的链接。等等。
因此,itsef的状态不会捕获确定和创建消息所需的所有信息。还需要许多其他无关的信息。
遗留代码的工作方式,将所有这些信息加载到jsp中,然后jsp根据此非状态信息进行确定。
现在我们正在重做网站,我面临的情况是我们需要在多个不同的地方使用相同的状态逻辑,但输出不同的包装html。
简而言之,这是一个很大的混乱。
我认为理想的答案是重构事物,以便所有决定都从jsps中取出。呃,我不确定处理它的正确方法是什么。有很多棘手的复杂性,我不知道从哪里开始。
我不确定我是否已经提供了足够的细节来解决问题,但如果有人有任何建议,我将非常感激......
编辑:谢谢你的所有答案!代码是如此巧妙,以至于我通过将公共代码拉入包含文件来重构它,以便我可以将这些文件包含在需要它们的地方。我肯定会按照你的建议考虑使用函数进一步封装。很快就会回过头来回答你的问题。再次感谢。答案 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标记吗?