Как вставить код Java на страницу jsf?

У меня есть: Управляемый компонент под названием «LoginBean». Страница JSF под названием «login.xhtml».

На этой странице jsf у меня есть форма входа.

Внутри managebean у меня есть функция loginCheck.

public void loginCheck(){
 if(logincorrect){
  //set user session 
 }else{
  //set lockout count session ++
 }
}

Что я хочу сделать на своей странице jsf, так это то, что когда сеанс блокировки счетчика == 2 (означает, что пользователи не смогли правильно войти в систему 2 раза, мне нужно, чтобы тег recaptcha отображался.

<td>
    <%
         if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("numberOfLogins") == 2){
         <p:captcha label="Captcha" requiredMessage="Oops, are you human?"/>
       }
     %>

Видимо, тег ‹% не работает. Будем признательны за любую помощь экспертов java/jsf.


person Slay    schedule 08.09.2012    source источник
comment
Еще одна ужасная идея. Код скриптлета в JSP — это винтаж 1998 года. Вы не должны этого делать. Изучите JSTL и не размещайте скриптлеты на своих страницах.   -  person duffymo    schedule 08.09.2012
comment
Кто мы такие, чтобы судить? Я думал, что ТАК должно быть фактической базой? Почему вопросы должны быть основаны на фактах, а ответы и комментарии субъективны? ржу не могу.   -  person cbmeeks    schedule 10.12.2013


Ответы (2)


Скриптлеты (эти PHP-подобные <% %> вещи) являются частью JSP, который является устарел, начиная с JSF 2.0, в пользу его преемника Facelets (XHTML). Facelets больше не поддерживает никаких альтернатив скриптлетам. Использование скриптлетов в JSP почти во всех случаях приводило к плохо спроектированная и плохо поддерживаемая кодовая база. Забудьте о них. Код Java принадлежит к полноценным классам Java. Просто подготовьте модель (некоторый класс Javabean) в контроллере (класс компонента поддержки JSF) и используйте taglibs и EL (язык выражений, эти #{} вещи) для доступа к модели в представлении.

Ваш конкретный вариант использования,

<%
     if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("numberOfLogins") == 2){
     <p:captcha label="Captcha" requiredMessage="Oops, are you human?"/>
   }
 %>

можно решить в полноценном JSF/EL следующим образом:

<p:captcha label="Captcha" requiredMessage="Oops, are you human?" rendered="#{numberOfLogins == 2}" />

Этот numberOfLogins, кстати, гораздо лучше сделать свойством JSF @SessionScoped @ManagedBean, чем какой-либо атрибут, помещаемый вручную в карту сеанса.

Смотрите также:

person BalusC    schedule 08.09.2012
comment
можем ли мы использовать скриптлет в jsf 1? - person Mahmoud Saleh; 15.05.2013
comment
Скриптлеты не относятся к JSF. Они специфичны для технологии представления JSP. Итак, если вы используете JSP, вы можете использовать скриптлеты. Однако они считаются плохой практикой и официально не рекомендуются. См. также stackoverflow.com/questions/3177733/ - person BalusC; 15.05.2013

Это не то, как работает JSF, по крайней мере, не с XHTML в качестве уровня представления вместо JSP. (<% — это часть JSP, которую вы здесь больше не используете.) Правильный способ сделать это — использовать управляемые компоненты. В качестве альтернативы вы можете использовать язык выражений (EL).

Я бы просмотрел главу "JavaServer Faces Technology" учебника Oracle по Java EE для некоторых дополнительная помощь.

person ziesemer    schedule 08.09.2012