使用JSP中的EL访问JavaBean方法

时间:2011-03-18 17:07:01

标签: java jsp java-ee jsp-tags el

我正在将旧的应用程序从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片段等的某些方法的需求。

2 个答案:

答案 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,...)