典型 JSF 应用程序中的许多页面都是动态的,这意味着有一个模板视图可用于呈现给定类型的每个对象。对于这些页面,PrettyFaces 重写解决方案非常有效且轻松。一个示例是基于其 id 或其他唯一字段显示产品的 Web 应用程序。通常有一个与这样的显示相关的视图,比如product.xhtml
,和一个视图参数,保存产品的唯一字段,比如name
。
通过一个简单的设置,我们得到所有请求/product.xhtml?name=exact-product-name
,例如重写为/products/exact-product-name
:
网址映射:
<url-mapping id="viewProduct">
<pattern value="/products/#{ name : productBean.name }" />
<view-id value="/store/product.xhtml" />
<action> #{ productBean.loadData } </action>
</url-mapping>
风景:
<f:metadata>
<f:viewParam id="name" name="name" required="true" />
</f:metadata>
该模型:
public class ProductBean implements Serializable {
private ProductService productService;
private String name;
private Product product;
public String loadData() {
if(!((name == null) || (name.equals(""))) {
Product product = productService.findByName(name);
this.product = product;
return null;
}
return "error";
}
}
但是,也有许多具有静态数据的页面,它们没有以上述方式使用视图参数进行模板化。这些页面仅显示放入其中的内容。例如,可能有许多文章被创建为单独的视图(如/pages/articles/article1.xhtml
等)。使用 PrettyFaces,我们需要创建与此类页面数量一样多的 URL 映射。但是,实际上这种行为也可以在一个 URL 映射中进行模板化。不幸的是,当前 PrettyFaces 版本不支持此功能。
PrettyFaces 框架的建议增强功能如下:
<url-mapping id="viewArticle">
<pattern value="/articles/#{ articleName }" />
<view-id value="/store/#{ articleName }.xhtml" />
</url-mapping>
或者,使用ArticleBean
(例如,包含两个字段:articleName
和articleId
,其中 name 在 id 字段的设置器中定义为唯一值):
<url-mapping id="viewArticle">
<pattern value="/articles/#{ articleId : articleBean.articleId }" />
<view-id value="/store/#{ articleBean.articleName }.xhtml" />
</url-mapping>
或者使用基于 EL 表达式的其他预定义依赖关系,该 EL 表达式又基于唯一对应关系。
我想强调这不会是 a因为 view-id 中没有不确定性: a和 aDynaView
之间存在一对一的对应关系。<pattern>
<view-id>
您如何看待在 PrettyFaces 中实现此功能?