我正在将旧的应用程序从JSP 1.1迁移到JSP 2.1,并尝试在没有scriptlet的情况下执行所有操作。我有一个JavaBean,我通过CustomTag创建,填充并插入页面范围。这个JavaBean公开了一些基于它的实例变量转换数据,生成HTML片段等的方法。
当我需要访问JavaBean中的属性时,我使用:
${mybean.property}
但是由于JSP 2.1 / EL 2.1不支持对bean的调用方法(这需要JSP 2.2 / EL 2.2),我试图确定将这些实用程序方法暴露给我的JSP页面的最佳方法,而不是诉诸于小脚本。
以下是我需要访问的JavaBean上的方法示例:
public String getThumbColor() {
String tbgcolor = "#FF0000";
if (this.getJavaBuildTotal() > 0 &&
this.getJavaBuildBroke() == 0 &&
this.getCeeBuildBroke() == 0 &&
this.getJavaBuildInvalid() == 0 &&
!this.hasBuildException()) {
tbgcolor = "#00FF00";
}
else if (this.getJavaBuildTotal() == 0 && this.getCeeBuildTotal() == 0) {
tbgcolor = "#f7f814";
}
return tbgcolor;
}
感觉就像在JSP中将这个(以及像它一样的10个左右的其他方法)完全转换为JSTL会让我的JSP页面变得混乱。
由于我已经进行了大规模的重构,我不介意大幅改变;然而我无法想到消除我对使用条件来决定返回值,生成小HTML片段等的某些方法的需求。
答案 0 :(得分:1)
看看JSTL。它至少提供了一组基本的core标签来控制页面中的流量。在 scriptlet 中使用此代替if
/ else
/ switch
。它还在functions taglib中提供了几种实用方法。这提供了基本的String
操作,例如子字符串等。您也可以自己创建自定义EL函数,可以使用参数调用public static
方法。
更新
他们根据班级中的实例变量做出决定并做出相应的回应
您可以为这些变量添加getter,并在<c:if>
或其他任何内容中使用它。
<c:if test="${bean.property == 'somevalue' && bean.otherproperty != 'foo'}">
如果这些值是例如常量,你甚至可以将它包装在bean中的布尔getter中。
public boolean isCondition() {
return "somevalue".equals(property) && !"foo".equals(otherproperty);
}
您使用如下:
<c:if test="${bean.condition}">
有很多方法取决于具体的功能要求,在你的问题中仍然含糊不清。
更新2 :根据您问题中的新示例,演示文稿细节应该放在视图中(JSP)。 bgcolor是演示文稿的一部分。我建议用枚举替换它。
public enum Status {
OK, FAIL, NONE;
}
public Status getStatus() {
if (this.getJavaBuildTotal() > 0 &&
this.getJavaBuildBroke() == 0 &&
this.getCeeBuildBroke() == 0 &&
this.getJavaBuildInvalid() == 0 &&
!this.hasBuildException()) {
return OK;
}
else if (this.getJavaBuildTotal() == 0 && this.getCeeBuildTotal() == 0) {
return NONE;
}
return FAIL;
}
并在视图中声明颜色
<c:set var="bgcolor" value="${(build.status == 'OK') ? '#00ff00' : (build.status == 'FAIL') ? '#ff0000' : '#f7f814'}" />
...
<tr bgcolor="${bgcolor}">
或者,更好的是,制作一个CSS类
<tr class="build ${build.status}">
带有样式(表格)
tr.build.OK { background: #00ff00; }
tr.build.FAIL { background: #ff0000; }
tr.build.NONE { background: #f7f814; }
答案 1 :(得分:1)
根据您的应用程序服务器/框架等,您可能只能覆盖EL2.2的默认EL实现(我已经在Tomcat 6.0.20 / JSF 2.0 Web应用程序上成功使用了Tomcat 7 EL 2.2) 。除此之外,您可以创建<call-method object="..." method=""><param=".."/>...</call-method>
标记并替换scriptlet。
无论如何,如果你不介意大幅改变,你应该消除来自你的JSP的这些调用,然后去MVC architecture。你会:
接收客户端请求的控制器组件(通常是servlet /过滤器),解码它们并调用更新应用程序模型的适当操作。
查看在动作完成后转发请求的组件(通常是JSP页面),因此他们只需要读取更新的模型并将其转储到对客户端的响应中。
大多数流行的Java Web框架都支持这种架构(Struts,JSF,Spring MVC,...)