JSF 2 и Post / Redirect / Get? - PullRequest
       33

JSF 2 и Post / Redirect / Get?

22 голосов
/ 24 марта 2011

Пожалуйста, исправьте меня, если я ошибаюсь, но я думаю, что все мои не-AJAX-представления должны использовать способ Post / Redirect / Get (PRG), поскольку GET должен использоваться для обновления / запроса данных, и в моем случае страницы приложений, о которых я могу думать, действительно только обновляют данные, а затем обновляют страницу, поэтому я думаю, что PRG здесь подходит.

Я полагаю, что могу сделать это, используя face-config.way, где я использую <redirect/>, или я могу использовать return "myview.xhtml?faces-redirect=true";

Теперь вопрос ...

Есть ли способ настроить это глобально, чтобы при вызовах / отправках не-AJAX автоматически использовался face-redirect = true, чтобы мой источник был таким простым:

return "myview";

1 Ответ

27 голосов
/ 24 марта 2011

Вы можете сделать это с помощью пользовательского ConfigurableNavigationHandler. Вот пример начала:

package com.example;

import java.util.Map;
import java.util.Set;

import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.NavigationCase;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;

public class RedirectNavigationHandler extends ConfigurableNavigationHandler {

    private NavigationHandler parent;

    public RedirectNavigationHandler(NavigationHandler parent) {
        this.parent = parent;
    }

    @Override
    public void handleNavigation(FacesContext context, String from, String outcome) {
        if (!outcome.endsWith("?faces-redirect=true")) {
            outcome += "?faces-redirect=true";
        }

        parent.handleNavigation(context, from, outcome);        
    }

    @Override
    public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) {
        if (parent instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) parent).getNavigationCase(context, fromAction, outcome);
        } else {
            return null;
        }
    }

    @Override
    public Map<String, Set<NavigationCase>> getNavigationCases() {
        if (parent instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) parent).getNavigationCases();
        } else {
            return null;
        }
    }

}

Зарегистрируйте это следующим образом в faces-config.xml:

<application>
    <navigation-handler>com.example.RedirectNavigationHandler</navigation-handler>
</application>  
...