Доступ к методам JavaBean с использованием EL из JSP - PullRequest
1 голос
/ 18 марта 2011

Я перевожу старое приложение из JSP 1.1 в JSP 2.1 и пытаюсь сделать все без скриплетов. У меня есть 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;
}

Такое ощущение, что преобразование этого (и примерно 10 других методов, подобных этому) полностью в JSTL в JSP может испортить мою страницу JSP.

Поскольку я уже делаю большой рефакторинг, я не против кардинальных изменений; тем не менее я не могу придумать, как избавиться от необходимости в некоторых методах, использующих условные выражения для определения возвращаемых значений, создания небольших фрагментов HTML и т. д.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

В зависимости от вашего сервера приложений / инфраструктуры и т. Д. Вы можете просто переопределить реализацию EL по умолчанию для EL2.2 (я успешно использовал Tomcat 7 EL 2.2 в веб-приложении Tomcat 6.0.20 / JSF 2.0) , Кроме этого вы можете создать тег <call-method object="..." method=""><param=".."/>...</call-method> и заменить скриптлеты.

В любом случае, если вы не возражаете против радикальных изменений, вам следует исключить эти вызовы из своих JSP и перейти на архитектуру MVC . Вы бы имели:

  • Компоненты контроллера (обычно сервлеты / фильтры), которые получают запросы клиентов, декодируют их и вызывают соответствующие действия, которые обновляют модель приложения.

  • Просмотр компонентов (обычно страниц JSP), которые пересылают запрос после завершения действий, поэтому им нужно только прочитать обновленную модель и вывести ее в ответ клиенту.

Большинство популярных веб-фреймворков Java поддерживают эту архитектуру (Struts, JSF, Spring MVC, ...)

1 голос
/ 18 марта 2011

Посмотрите на JSTL .Он предлагает как минимум базовый набор тегов core для управления потоком на странице.Используйте это вместо if / else / switch независимо от скриптлетов .Он также предлагает несколько служебных методов в functions taglib.Этим предлагаются основные String операции, такие как подстрока и т. Д.Вы также можете самостоятельно создать собственные EL-функции, которые могут вызывать public static методы с аргументами.

См. Также:


Обновление согласно информации вкомментарий

Они принимают решения на основе переменных экземпляра в классе и отвечают соответственно

Вы можете добавить геттеры для этих переменных и использовать этов <c:if> или в любом другом месте.

<c:if test="${bean.property == 'somevalue' && bean.otherproperty != 'foo'}">

Вы можете даже обернуть это в логический метод получения в бине, если эти значения являются, например, константами.

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; }
...