使用JSF + PrettyFaces处理导航和bean操作时,Java Web App出现问题。
使用版本:
JSF - 2.1
PrettyFaces - 3.3.3
使用PrettyFaces Filter从链接处理导航时发生错误:
<div class="product_img">
<pretty:link mappingId="viewProduct">
<img src="#{request.contextPath}/image?id=#{product.mainImage.fileReference.id}" />
<f:param value="#{productMB.filters.productCategoryName}" />
<f:param value="#{product.name}" />
</pretty:link>
</div>
pretty-config.xml映射是:
<url-mapping id="viewProduct">
<pattern value="/shop/product/#{ productCategoryName : productMB.filters.productCategoryName }/#{ productName : productMB.filters.productName }/" />
<view-id value="/pages/productDetails.faces" />
<action>#{productMB.openProductDetails}</action>
</url-mapping>
bean动作:
public String openProductDetails() {
if (filters.getProductCategoryName() != null && !filters.getProductName().equals("")) {
loadProductDetailsByName(filters.getProductCategoryName());
}
return "/pages/productDetails.faces";
}
用户登陆产品详情页面,在那里他可以选择产品颜色,尺寸等特征......
<ui:fragment rendered="#{productMB.productVO.featureColorAvailable}">
<span class="productFeatureLabel">#{msg.color}</span>
<h:selectOneMenu id="colorSelect"
value="#{productMB.productVO.colorSelected}"
valueChangeListener="#{productMB.colorSelectedValueChanged}">
<f:selectItem itemLabel="#{msg['select']}" noSelectionOption="true" />
<f:selectItems value="#{productMB.productFeatureAvailableApplMap['color']}" var="colorItem" itemValue="#{colorItem}"
itemLabel="#{msg[colorItem.name]}" />
<f:ajax event="valueChange"
listener="#{productMB.colorSelectedValueChanged}"
render="@this productDetailImage productSubImage productSubImage2 productSubImage3 sizeSelect"></f:ajax>
</h:selectOneMenu>
</ui:fragment>
// ... Bean动作方法
public void colorSelectedValueChanged(ValueChangeEvent event) {
if (null != event.getNewValue()) {
ProductFeatureAppl prodFeatureAppl = (ProductFeatureAppl) event.getNewValue();
filterProductFeatureSelectItem(AppConstants.SIZE, prodFeatureAppl.getProductFeature().getName() );
} else {
filterProductFeatureSelectItem(AppConstants.SIZE, null );
}
}
public void colorSelectedValueChanged(AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException {
try {
if (null != productVO.getColorSelected()) {
ProductFeatureAppl prodFeatureAppl = productVO.getColorSelected();
filterProductFeatureSelectItem(AppConstants.SIZE, prodFeatureAppl.getProductFeature().getName() );
String prodFeatName = prodFeatureAppl.getProductFeature().getName();
// switch selected pics.
productVO.setCurrentDetailImageName(productVO.getProduct().getProductImageByTypeAndFeatureName(
NameConstants.DETAIL, prodFeatName).getFileReference().getId());
productVO.setCurrentBigImageName(productVO.getProduct().getProductImageByTypeAndFeatureName(
NameConstants.BIG, prodFeatName).getFileReference().getId());
} else {
filterProductFeatureSelectItem(AppConstants.SIZE, null );
filterProductFeatureSelectItem(AppConstants.COLOR, null );
// reset to default
productVO.setCurrentDetailImageName(productVO.getProduct().getProductImageByType(ProductImageType.DETAIL1.toString()).getFileReference().getId());
productVO.setCurrentBigImageName(productVO.getProduct().getProductImageByType(ProductImageType.BIG1.toString()).getFileReference().getId());
}
} catch (Exception ex) {
addErrorMessage(getMessage("error"));
if (screenComponent.isDisplayException()) {
addErrorMessage(ex.getMessage());
}
}
}
首次导航到产品详细信息页面后,每当从中选择一个值时 selectOneMenu id =“colorSelect”不调用valueChangeListener和ajax侦听器。除此之外,还调用productMB.openProductDetails操作。
ajax调用完成,没有错误,我可以在日志中看到,但没有调用监听器方法。 有人知道为什么要跳过这些JSF ajax监听器吗?
提前致谢。
答案 0 :(得分:1)
如果您直接从网址访问该页面,该页面是否有效?如果禁用PrettyFaces会有效吗?
我怀疑这是链接或PrettyFaces的问题。我认为它更多地与AJAX和部分状态保存有关。
它可能与此有关:
public String openProductDetails() {
if (filters.getProductCategoryName()
!= null && !filters.getProductName().equals("")) {
loadProductDetailsByName(filters.getProductCategoryName());
}
return "/pages/productDetails.faces"; // why is this being returned?
}
您正在返回页面名称。 PrettyFaces实际上可能尝试在此String上导航。如果要显示已在映射中配置的页面,只需返回null,返回“”空字符串或不返回任何内容。
希望这有帮助。