Как сделать перенаправление при загрузке страницы в JSF 1.x

Попробуйте SerializerMethodField

Пример (не проверено):

class MySerializer(serializers.ModelSerializer):
    thumbnail_url = serializers.SerializerMethodField('get_thumbnail_url')

    def get_thumbnail_url(self, obj):
        return self.context['request'].build_absolute_uri(obj.thumbnail_url)

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

serializer = MySerializer(account, context={'request': request})

30
задан BalusC 17 April 2019 в 14:19
поделиться

2 ответа

Установите параметры запроса GET как управляемые свойства в faces-config.xml, чтобы вам не нужно было собирать их вручную:

<managed-bean>
    <managed-bean-name>forward</managed-bean-name>
    <managed-bean-class>com.example.ForwardBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>action</property-name>
        <value>#{param.action}</value>
    </managed-property>
    <managed-property>
        <property-name>actionParam</property-name>
        <value>#{param.actionParam}</value>
    </managed-property>
</managed-bean>

Таким образом, запрос forward.jsf?action=outcome1&actionParam=123 позволит JSF установить action и actionParam параметры как action и actionParam свойства ForwardBean.

Создайте маленькое представление forward.xhtml (настолько маленькое, что оно помещается в буфер ответов по умолчанию (часто 2 КБ), чтобы его можно было сбросить обработчиком навигации, в противном случае необходимо увеличить буфер ответов в конфигурации сервлет-контейнера), что вызывает метод bean-компонента в beforePhase из f:view:

<!DOCTYPE html>
<html xmlns:f="http://java.sun.com/jsf/core">
    <f:view beforePhase="#{forward.navigate}" />
</html>

ForwardBean может выглядеть следующим образом:

public class ForwardBean {
    private String action;
    private String actionParam;

    public void navigate(PhaseEvent event) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        String outcome = action; // Do your thing?
        facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
    }

    // Add/generate the usual boilerplate.
}

navigation-rule говорит само за себя (примечание <redirect /> записей, которые делали бы ExternalContext#redirect() вместо ExternalContext#dispatch() под обложками):

<navigation-rule>
    <navigation-case>
        <from-outcome>outcome1</from-outcome>
        <to-view-id>/outcome1.xhtml</to-view-id>
        <redirect />
    </navigation-case>
    <navigation-case>
        <from-outcome>outcome2</from-outcome>
        <to-view-id>/outcome2.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>

Альтернативой является использование forward.xhtml в качестве

<!DOCTYPE html>
<html>#{forward}</html>

и обновите метод navigate(), который будет вызываться в @PostConstruct (который будет вызван после построения бина и установки всех управляемых свойств):

@PostConstruct
public void navigate() {
    // ...
}    

Он имеет тот же эффект, однако сторона вида не совсем самодокументируемый. Все, что он в основном делает - это печатает ForwardBean#toString() (и тем самым неявно создает бин, если его еще нет).


Обратите внимание, что для пользователей JSF2 есть более чистый способ передачи параметров с <f:viewParam> и более надежный способ обработки перенаправления / навигации с помощью <f:event type="preRenderView">. См. Также среди прочих:

30
ответ дан 28 November 2019 в 00:14
поделиться

Предположим, что foo.jsp - это ваш файл jsp. и следующий код - это кнопка, которую вы хотите перенаправить.

<h:commandButton value="Redirect" action="#{trial.enter }"/>  

И теперь мы проверим метод для направления в вашем классе java (службы)

 public String enter() {
            if (userName.equals("xyz") && password.equals("123")) {
                return "enter";
            } else {
                return null;
            }
        } 

, и теперь это часть файла Face-config.xml

<managed-bean>
        <managed-bean-name>'class_name'</managed-bean-name>
        <managed-bean-class>'package_name'</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>


    <navigation-case>
                <from-outcome>enter</from-outcome>
                <to-view-id>/foo.jsp</to-view-id>
                <redirect />
            </navigation-case>
0
ответ дан 28 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: