2013-12-18 7 views
0

Следующий код не засавить форму:JSF рендеринга не работает

XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" 
    template="/WEB-INF/templates/default.xhtml"> 
    <ui:define name="content"> 
     <h:form id="form"> 
      <rich:panel header="My Header"> 
       <h2> 
        <h:outputLabel value="#{tournamentBean.mode}" /> 
       </h2> 
       <a4j:commandButton value="Toggle" 
        action="#{tournamentBean.toggleMode()}" render="form" /> 
      </rich:panel> 
     </h:form> 
    </ui:define> 
</ui:composition> 

боб:

import java.io.Serializable; 
import javax.faces.view.ViewScoped; 
import javax.inject.Named; 

@SuppressWarnings("serial") 
@Named("tournamentBean") 
@ViewScoped 
public class TournamentBean implements Serializable { 

    private String mode = "A"; 

    public String getMode() { 
    return mode; 
    } 

    public void toggleMode() { 
    if (this.mode.equals("A")) 
     this.mode = "B"; 
    else 
     this.mode = "A"; 
    } 
} 

Я использую Wildfly 8.0 и поэтому JSF 2.2. Метод toggleMode вызывается при каждом нажатии кнопки. В IE 11 он никогда не отменяет форму. В Chrome он работает дважды, но не чаще.

Что мне не хватает?

+1

Хотя 'render =" form "' должен работать, хотя и с использованием RichFaces, поскольку он использует метод 'UIComponent # findComponent()' для поиска компонентов, он неэффективен, а 'render =" @ form "' всегда должен для повторной передачи текущей формы. – skuntsel

+0

Покажите свой «/WEB-INF/templates/default.xhtml», может ли он содержать случайную дополнительную h: форму вокруг ? – Andrey

+0

Спасибо за советы. 'render =" @ from "'не помогло. И default.xhtml очень прост. Никакой формы или ничего особенного. – Dave

ответ

-1

@Named является аннотацией CDI, @ViewScoped от JSF. Таким образом, у вас есть как CDI, так и JSF, пытающиеся управлять бобами, поэтому, конечно, эта привычная работа, а результат bean scope может быть singleton, если он вообще начнет работать.

Замените, пожалуйста, @ViewScoped с помощью примера @javax.enterprise.context.RequestScoped и попробуйте запустить код. Если вам нужно использовать область просмотра, посмотрите на реализацию CDI или conversationscope. Это можно сделать как-то, хотя CDI напрямую не поддерживает viewscope.

Или перейдите на JSF и его @ManagedBeans, но те, которые были выбраны, будут разграблены.

+0

Не должно быть проблем с объявлением ViewScoped, которое использовал OP. Есть две аннотации ViewScoped - одна из которых принадлежит javax.faces.bean (old) и javax.faces.view (новый и совместимый с CDI). –

+1

Прежде всего, аннотации '@ ViewScoped' обрабатываются с помощью JSF только тогда, когда они идут с' @ ManagedBean', что не так (области JSF могут использоваться вместе с аннотациями CDI). Appart из этого, есть Omnifaces собственный ['@ ViewScoped'] (http://wiki.omnifaces.googlecode.com/hg/javadoc/org/omnifaces/cdi/ViewScoped.html) аннотация, которая должна работать с CDI (даже не обязательно в случае OP, поскольку он использует JSF 2.2). И для вашего последнего предложения о управляемых bean-компонентах JSF, которые должны быть устаревшими, вам не хватает ссылки, которая на самом деле подтверждает это. Бесполезный ответ ИМХО: -1. –

Смежные вопросы