2013-05-03 4 views
1
@Named 
@RequestScoped 
@URLMapping(id = "unblock", pattern = "/unblock", viewId = "/unblock.xhtml") 
public class Unblock { 

@URLAction 
public void load(){ 
    //initialize some values.. 
} 

public void sendRequest(){ 

} 

и в xhtml файле;JSF bean URLAction вызывается каждый раз

<h:commandButton id="submit action="#{unblockAccount.sendRequest}" 

Теперь, когда первая страница времени загружает мой метод загрузки получает правильно называется, но когда я нажимаю кнопку отправки на странице и вызвать метод «SendRequest», метод загрузки вызывается снова.

Как я могу остановить это? Я также пытался использовать @ViewScope, но не помог

+0

является 'load()' привязанным к любому компоненту? – kolossus

+0

@kolossus Как я могу проверить, что – Spring

+0

Проверьте, есть ли какой-либо компонент JSF, связанный с действием 'load()' прямо или косвенно (через другой метод) – kolossus

ответ

4

Добавить onPostBack=false в @URLAction, чтобы остановить действие от вызова по обратной передаче.

Столб обратно любой запрос инициирован на представлении JSF после нового запроса для вида

@URLAction(onPostback=false) 
    public void load(){ 
     //initialize some values.. 
    } 
+0

tnx, есть ли преимущество использования urlaction с onPostBack = false над использованием конструктора или postconstruct? – Spring

+0

@Spring [Я не советую использовать конструктор] (http://stackoverflow.com/a/15774143/1530938). '@ PostConstruct' будет делать в основном одно и то же, но вам нужно быть осторожным с его использованием с помощью компонента' @ RequestScoped'. – kolossus

+0

@PostConstruct будет выполняться ПЕРЕД параметрами пути вводятся – chkal

1

вы могли бы использовать @PostConstruct и, возможно, настроить свой bean-компонент на ViewScoped.

+1

Вы могли бы быть более наглядными в своем ответе и объяснить проблема или это должен быть комментарий – Spring

+0

Вы правы, я мог бы быть более наглядным. Не хватило времени, чтобы оставлять комментарии до сих пор, хотя ;-). Надеюсь, в любом случае это помогло. – howiewylie

1

В случае, если вы хотите сделать свою работу в @PostConstruct методе вы найдете следующий метод полезен , Это в основном инициализирует данные только тогда, когда вид загружается первоначально и пропускает инициализацию на постбэков:

@PostConstruct 
public void initialize() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     //load your data 
    } 
} 

Или иногда мы можем использовать JSF слушателя событий. Это позволяет инициализировать данные непосредственно перед тем, вид должен быть воспроизведен:

<f:event type="preRenderView" listener="#{bean.initialize}" /> 

с тем же способом, но без @PostConstruct аннотацию:

public void initialize() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     //load your data 
    } 
} 

Наконец, когда JSF 2.2 из можно использовать <f:viewAction> вместо <f:event> с тем же способом, но без проверки, как:

<f:viewAction action="#{bean.initialize}" onPostback="false" /> 

с

public void initialize() { 
    //load your data 
} 

Но в случае, если вы используете PrettyFaces, просто придерживаться ответа на Kolossus. Но на всякий случай, когда вам не понравится использовать PrettyFaces для работы, три метода выше всегда для вас. Конечно, они будут работать с «простым» JSF.

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

  • Нет связанных вопросов^_^