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