表单未在具有片段 'rendered' 条件和 ui:param 的页面上提交
Form not submitting on a page with fragment 'rendered' conditions and ui:param
我正在使用 JSF 创建某种在线商店。我有一个按 ID 显示产品的 product.xhtml
页面。我将该 ID 作为参数 (.../product.xhtml?id=3) 传递,并且我使用 <ui:param name="productID" value="#{request.getParameter('id')}" />
获取 ID
一切正常。
接下来,我 显示 和 隐藏 页面中带有 <f:subview>
的某些元素(我使用 <ui:fragment>
之前)。原因是如果用户删除了?id=3
ID 参数,页面将显示错误(例如代码<f:subview id="main" rendered="#{productID != null and productID != ''}">
)。另一个原因是,如果产品属于买家,则不会出现购买按钮,如果用户未通过身份验证,则不会出现购买按钮。
问题出在 BUY 按钮上。它采用一种形式,按钮的操作只是来自 CDI bean 的一个简单测试方法(目前),该方法将某些内容打印到服务器控制台并重定向用户。 不幸的是,这不起作用。页面 (/product.xhtml
) 重新加载时没有 ID 参数。
我已经尝试了几种方法,例如 this and this,但没有任何效果。
我已经尝试对我的 CDI bean 使用 ViewScoped
和 SessionScoped
而不是 RequestScoped,但这没有任何作用。 ViewScoped
构建失败。
我也将 <ui:fragment>
更改为 <f:subview>
这是一些代码..
CDI bean 控制器
@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>
...
如果需要,我可以提供完整的代码。
我期望代码做的是,每当我单击“购买”按钮时,我都会被重定向到我的页面,并且测试数据将打印在服务器控制台上。
我正在使用 JSF 创建某种在线商店。我有一个按 ID 显示产品的 product.xhtml
页面。我将该 ID 作为参数 (.../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 != ''}">
)。另一个原因是,如果产品属于买家,则不会出现购买按钮,如果用户未通过身份验证,则不会出现购买按钮。
问题出在 BUY 按钮上。它采用一种形式,按钮的操作只是来自 CDI bean 的一个简单测试方法(目前),该方法将某些内容打印到服务器控制台并重定向用户。 不幸的是,这不起作用。页面 (/product.xhtml
) 重新加载时没有 ID 参数。
我已经尝试了几种方法,例如 this and this,但没有任何效果。
我已经尝试对我的 CDI bean 使用 ViewScoped
和 SessionScoped
而不是 RequestScoped,但这没有任何作用。 ViewScoped
构建失败。
我也将 <ui:fragment>
更改为 <f:subview>
这是一些代码..
CDI bean 控制器
@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>
...
如果需要,我可以提供完整的代码。
我期望代码做的是,每当我单击“购买”按钮时,我都会被重定向到我的页面,并且测试数据将打印在服务器控制台上。