Перенаправление с помощью JSF и prettyFaces

У меня проблема с перенаправлением с JSF и красивыми лицами. Я новичок в этом, и мне нужна помощь, так как я не могу перенаправить на работу, как я этого хочу.

В основном у меня есть это в моей красивой конфигурации:

<url-mapping id="newProject">
    <pattern value="/newProject/" />
    <view-id value="/faces/project/newProject.xhtml" />
    <action>#{projectController.initNewProject}</action>    
</url-mapping>

<url-mapping id="project">
    <pattern value="/project/" />
    <view-id value="/faces/project/projectIdx.xhtml" />
</url-mapping>

Функция initNewProject выглядит так:

public String initNewProject() throws IOException {

    project = this.createProject(123415, "1234578943148", "KB25");

    System.out.println(project);

    return "pretty:project";
}

где проект — это поле в ProjectController:

  @Named
  @ConversationScoped
  public class ProjectController implements Serializable {
     private transient Project project;
     ...

Перенаправление работает так, как я хочу, поскольку URL-адрес меняется с ../newProject/ на ../project/ и отображается содержимое /faces/project/newProject.xhtml. Но иногда во время перенаправления вызывается конструктор ProjektController и обнуляет проект поля.

Если я изменюсь

    return "pretty:project";

to

    return "/project/projectIdx.xhtml";

все работает нормально. Содержимое проекта отображается на веб-странице. Однако URL-адрес не меняется. Он остается ../newProject/, и если пользователь нажимает F5, он создает новый проект, что плохо.

По некоторым другим причинам я не могу сохранить проект в сеансе, поэтому для меня это не вариант.

Я не хочу, чтобы перенаправление воссоздавало контроллер, поскольку я хочу, чтобы newProject.xhtml отображал содержимое проекта, созданного во время initNewProject.

Как этого добиться?

Большое спасибо!

Майкл


person user2942523    schedule 31.10.2013    source источник


Ответы (2)


Я думаю, что проблема вызвана тесной связью между двумя отображениями. По сути, вы используете действие страницы в своем первом сопоставлении для инициализации свойства компонента, а затем хотите получить доступ к этому свойству на странице, отображаемой вторым сопоставлением. URL-адреса RESTful, созданные с помощью PrettyFaces, работают иначе.

Вместо этого ваше второе сопоставление должно быть полностью независимым от другого. Это гарантирует, что URL-адрес RESTful работает, даже если он добавлен в закладки, скопирован в другое окно браузера или что-то еще.

Обычный способ создания такого URL-адреса RESTful с помощью PrettyFaces — использовать такой параметр пути:

<url-mapping id="project">
    <pattern value="/project/#{projectController.projectId}/" />
    <view-id value="/faces/project/projectIdx.xhtml" />
    <action>#{projectController.loadProject}</action>
</url-mapping>

Таким образом, идентификатор проекта вводится в ваш контроллер, и вы можете загрузить соответствующий объект из базы данных в методе действия страницы:

public void loadProject() {
  this.project = projectDao.getById( projectId );
}

Как обрабатывать вариант использования «новый проект» для вашего примера, зависит от ваших требований к сохранению и общему процессу.

Теоретически код, который вы предоставили, также должен работать. Я предполагаю, что параметр запроса cid, который требуется для поддержания области преобразования, по какой-то причине теряется. На форумах PrettyFaces есть несколько тем, посвященных этой проблеме. Но, насколько мне известно, это обычно вызвано ошибками в старых реализациях CDI.

person chkal    schedule 04.11.2013

Исправлено перенаправление с использованием следующего синтаксиса:

public String create(final Post post) {
        postService.save(post);
        return "pretty:posts";
}
person belgoros    schedule 15.05.2014