热门IT资讯网

从Richfaces 4.5迁移到Primefaces 6.2

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,自2016年6月Richfaces已停止更新,最近将一项目迁移到了Primefaces。Primefaces提供了更丰富的组件,使用更简单,界面更美观,性能更高。JSF应用现在越来越少,仅供有需要者参

自2016年6月Richfaces已停止更新,最近将一项目迁移到了Primefaces。Primefaces提供了更丰富的组件,使用更简单,界面更美观,性能更高。JSF应用现在越来越少,仅供有需要者参考。

Richfaces版本: 4.5.14.Final
Primefaces版本: 6.2

第一步 删除Richfaces配置,引入Primefaces

如果您使用了maven,请从pom中删除richfaces配置,然后加入primefaces:

    org.primefaces    primefaces    6.2

然后将web.xml中的richfaces配置删除。

批量更新

  • xmlns:rich="http://richfaces.org/rich"xmlns:a4j="http://richfaces.org/a4j"

    替换为:

    xmlns:p="http://primefaces.org/ui"

    注意xmlns:p="http://primefaces.org/ui" 不能重复。

  • 将 rich: 和 a4j: 替换为 p:。
  • 将属性render替换为update,execute替换为process。
  • 删除属性limitRender、bypassUpdates。

同名组件

RichfacesPrimefaces

异名组件

RichfacesPrimefaces
Primefaces提供了十多种chart组件,自行选择

不存在的组件




说明:,虽然名称相同,但功能不同,一个是分页,一个是按需显示数据。

子组件、属性、事件

名称或功能相同的组件,子组件名称,支持的属性、事件可能不同,使用时需要仔细核对,如:

  • ->
    仅支持几个常用属性
    ->
    ->
    label -> value
  • ->
    要删除原定义的属性,增加子组件

Function

  • #{rich:component('id')} -> PF('widgetVar')
    ...
    ...
  • #{rich:clientId('id')} -> #{p:component('id')}
  • jQuery
    在Primefaces中可以直接使用jQuery,如:

    上面使用了转义字符,也可以使用PrimeFaces函数,注意不要加"#",如下:

Primefaces特有组件

Primefaces提供了很多新颖美观的组件,也可以替代Richfaces组件,大家可查看Primefaces showcase。
有一些比较常用的功能Richfaces没有提供,原来只能自己实现,现在不需要了,比如:


  • 自动为required增加*,为校验信息增加label

  • 支持复杂表格,使用Richfaces时只能借助较繁琐。

  • confirmDialog示例:

验证

    

不支持tooltip形式显示message,支持。

dataTable与LazyDataModel

实现了的所有功能,定义更简单,且复杂表头时仍支持排序,支持单选、复选框选择,提供emptyMessage属性,不必再使用noData facet。
LazyDataModel比ExtendedDataModel实现更简单,性能更高。
下面LazyDataModel和自定义dataTable示例(org.jason是自定义的一些实现):
PagingDataModel

import org.jason.base.dao.Filter;import org.jason.base.dao.IQuery;import org.jason.base.dao.Order;import org.jason.base.dao.Pagination;import org.jason.base.service.PagingService;import org.jason.entity.BaseEntity;import org.primefaces.model.LazyDataModel;import org.primefaces.model.SortOrder;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import static org.primefaces.model.SortOrder.ASCENDING;//public class PagingDataModel extends LazyDataModel {    private PagingService service;    private IQuery query;       private List data;    private List selectedItems = new ArrayList<>();    private T selectedItem;    @SuppressWarnings("rawtypes")    public PagingDataModel(PagingService service, IQuery query) {        this.service = service;        this.query = query;    }    @Override    public T getRowData(String rowKey) {        for (T entity : data) {            if (entity.getId() == Integer.parseInt(rowKey)) {                return entity;            }        }        return null;    }    @Override    public Object getRowKey(T object) {        return object.getId();    }    @Override    public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {        data = service.find(query, new Pagination(first, pageSize, createFilter(filters), createOrders(sortField, sortOrder)));        setRowCount(service.count(query, createFilter(filters)));        return data;    }    public void refresh() {        setSelectedItem(null);        setSelectedItems(null);        load(0, getPageSize(), null, null, null);    }    private List createFilter(Map filters) {        if (filters == null) {            return Collections.emptyList();        }        return filters.entrySet().stream().map(filter -> new Filter(filter.getKey(), filter.getValue())).collect(Collectors.toList());    }    private List createOrders(String sortField, SortOrder sortOrder) {        if (sortField == null || sortOrder == null) {            return Collections.emptyList();        }        List orders = new ArrayList<>();        orders.add(new Order(sortField, sortOrder == ASCENDING));        return orders;    }    public List getSelectedItems() {        return selectedItems;    }    public void setSelectedItems(List selectedItems) {        this.selectedItems = selectedItems;    }    public T getSelectedItem() {        return selectedItem;    }    public void setSelectedItem(T selectedItem) {        this.selectedItem = selectedItem;    }}

自定义dataTable

                                                                                                                                                                                                                                                                                                                                                                    

参考文档

PrimeFaces Showcase
PrimeFaces Documentation
Migrating From RichFaces 4 to PrimeFaces 3
Patching RichFaces 3.3.3 AJAX.js for IE11

附录 Seam升级到CDI

替换Annotation

  • @Name -> @Named
    import org.jboss.seam.annotations.Name; -> import javax.inject.Named;
  • @In -> @Inject
    import org.jboss.seam.annotations.In; -> import javax.inject.Inject;
  • 删除@Out
    import org.jboss.seam.annotations.Out;
    改为@Inject相应Scope的组件
  • @Scope(ScopeType.APPLICATION) -> @ApplicationScoped
    @Scope(ScopeType.SESSION) -> @SessionScoped
    @Scope(ScopeType.CONVERSATION) -> @ConversationScoped
    @Scope(ScopeType.EVENT) -> @RequestScoped(或删除)
  • @Create -> @PostConstruct
    import org.jboss.seam.annotations.Create; -> import javax.annotation.PostConstruct;
    @Destroy -> @PreDestroy
    import org.jboss.seam.annotations.Destroy; -> import javax.annotation.PreDestroy;
  • @Observer("org.jboss.seam.postInitialization")
    可以使用DeltaSpike Servlet module,替换如下:
    public void init(@Observes @Initialized ServletContext context) {...}

    引入DeltaSpike Servlet module:

    org.apache.deltaspike.modulesdeltaspike-servlet-module-api1.8.1org.apache.deltaspike.modulesdeltaspike-servlet-module-impl1.8.1

    在web.xml中增加:

    EventBridgeContextListenerorg.apache.deltaspike.servlet.impl.event.EventBridgeContextListener
  • @Startup可使用ejb Singleton替换:
    @Singleton@Startup
  • @RequestParameter和页面参数
    可以替换为这样的组合:
  • @Logger 建议替换为slf4j
    @Loggerprivate Log log;

    替换为:
    private Logger log = LoggerFactory.getLogger(Test.class);
    日志中的{0} {1} 均替换为{}。

  • FacesMessages和StatusMessages改为使用javax.faces.application.FacesMessage

更新配置

  • 删除components.xml
  • seam.properties替换为beans.xml,内容如下:
  • 删除page.xml
    navigation调整到JSF 2 faces-config.xml中(navigation-rule)。
    action可以调整到页面中:

    页面参数上面已提到过。

页面

xmlns:s="http://jboss.com/products/seam/taglib", 可以使用JSF 2或Primefaces标签替换

SeamJSF 2/Primefaces
label -> itemLabel enumValue -> itemValue

参考文档

seam migration
Migration from Seam 2 to Java EE and Alternatives

0