Форма не отправляется на страницу с условиями фрагмента и пользовательским интерфейсом: param - PullRequest
0 голосов
/ 18 июня 2019

Я создаю своего рода интернет-магазин с JSF. У меня есть страница product.xhtml, которая отображает продукт по идентификатору. Я передаю этот идентификатор в качестве параметра (... / product.xhtml? Id = 3) и получаю идентификатор с <ui:param name="productID" value="#{request.getParameter('id')}" />

Это все работает хорошо.

Далее я показываю и , скрывающие определенные элементы на странице с <f:subview> (раньше я использовал <ui:fragment>). Причина в том, что если пользователь удаляет параметр ?id=3 ID, на странице будет отображаться ошибка (например, код <f:subview id="main" rendered="#{productID != null and productID != ''}">). Другая причина заключается в том, что если товар принадлежит покупателю, кнопка КУПИТЬ не появится, а если пользователь не прошел проверку подлинности, кнопка КУПИТЬ не появится.

Проблема с кнопкой «Купить». Он находится в форме, и действие кнопки представляет собой простой (пока что) метод тестирования из bean-компонента CDI, который печатает что-то на консоли сервера и перенаправляет пользователя. К сожалению , это не работает. Страница (/product.xhtml) перезагружается без параметра ID.

Я пробовал несколько вещей, таких как это и это , и ничего не работает.

Я пытался использовать ViewScoped и SessionScoped для моего компонента CDI вместо RequestScoped, но это ничего не дает. ViewScoped не удается построить.

Я также изменил <ui:fragment> на <f:subview>

Вот код ...

Контроллер компонентов CDI

@Named
@RequestScoped
public class ProductManager {
    ...
    public String buy(Product product) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            HttpSession session = Util.getSession();
            User buyer = (User)session.getAttribute("user");

            Date date = new Date();

            System.out.println("TEST DATA: ");
            System.out.println("sale product: "+product.getTitle());
            System.out.println("sale buyer:   "+buyer.getUsername());
            System.out.println("sale date:    "+date);
        }
        catch(Exception ex) {
            System.err.println("ProductManager#buy -> "+ex.getMessage());
        }
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "An error occured", null));
        return "index";
    }
    ...
}

Products.xhtml

...
<ui:param name="productID" value="#{request.getParameter('id')}" />
...
<f:subview id="buyBtn" rendered="#{user.username != login.username and login.regUser}">
    <h:form style="margin-top: 30px;">
        <b:navCommandLink styleClass="btn btn-info btn-block" disabled="#{!product.status}" value="Buy" action="#{productManager.buy(product)}"></b:navCommandLink>
    </h:form>
</f:subview>
...

При необходимости могу предоставить полный код.

Я ожидаю, что код будет делать то, что всякий раз, когда я нажимаю кнопку «КУПИТЬ», я перенаправляюсь на свою страницу, и ТЕСТОВЫЕ ДАННЫЕ будут напечатаны на консоли сервера.

1 Ответ

0 голосов
/ 19 июня 2019

после многих.Много попыток я решил это.Я не могу найти точное объяснение, поскольку я прочитал тонну статей на эту тему.

Я использовал OmniFaces .Далее в products.xhtml я изменил h:form на o: форму (из OmniFaces) и установил для этих двух значение true includeRequestParams="true" includeViewParams="true".Мой боб затем стал org.omnifaces.cdi.ViewScoped

Этот также отличная статья

...