博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从Richfaces 4.5迁移到Primefaces 6.2
阅读量:6226 次
发布时间:2019-06-21

本文共 8727 字,大约阅读时间需要 29 分钟。

自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="" 不能重复。

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

同名组件

Richfaces Primefaces
<a4j:ajax> <p:ajax>
<a4j:commandButton> <p:commandButton>
<a4j:commandLink> <p:commandLink>
<a4j:log> <p:log>
<a4j:outputPanel> <p:outputPanel>
<a4j:poll> <p:poll>
<a4j:repeat> <p:repeat>
<rich:calendar> <p:calendar>
<rich:contextMenu> <p:contextMenu>
<rich:dataGrid> <p:dataGrid>
<rich:dataTable> <rich:dataScroller> <p:dataTable>
<rich:extendedDataTable> <rich:collapsibleSubTable> <p:dataTable>
<rich:editor> <p:editor>
<rich:fileUpload> <p:fileUpload>
<rich:message> <p:message>
<rich:messages> <p:messages>
<rich:panel> <p:panel>
<rich:panelMenu> <p:panelMenu>
<rich:pickList> <p:pickList>
<rich:progressBar> <p:progressBar>
<rich:toolbar> <p:toolbar>
<rich:tooltip> <p:tooltip>
<rich:tree> <p:tree>

异名组件

Richfaces Primefaces
<a4j:jsFunction> <p:remoteCommand>
<a4j:mediaOutput> <p:media>
<a4j:region> <p:fragment>
<a4j:status> <p:ajaxStatus>
<rich:validator> <p:clientValidator>
<rich:accordion> <rich:collapsiblePanel> <p:accordionPanel>
<rich:autocomplete> <p:autoComplete>
<rich:chart> Primefaces提供了十多种chart组件,自行选择
<rich:dragSource> <p:draggable>
<rich:dropTarget> <p:droppable>
<rich:dropDownMenu> <p:menubar>
<rich:list> <p:dataList>
<rich:inplaceInput> <rich:inplaceSelect> <p:inplace>
<rich:inputNumberSlider> <p:slider>
<rich:inputNumberSpinner> <p:spinner>
<rich:notify> <p:notificationBar>
<rich:notifyMessage> <rich:notifyMessages> <p:growl>
<rich:orderingList> <p:orderList>
<rich:popupPanel> <p:dialog>
<rich:select> <p:selectOneMenu>
<rich:tabPanel> <rich:togglePanel> <p:tabView>

不存在的组件

<a4j:param>

<a4j:actionListener>
<a4j:push>
<a4j:queue>

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

子组件、属性、事件

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

  • <rich:panelMenu> -> <p:panelMenu>
    <p:panelMenu> 仅支持几个常用属性
    <rich:panelMenuGroup> -> <p:submenu>
    <rich:panelMenuItem> -> <p:menuitem>
    label -> value
  • <rich:collapsiblePanel> -> <p:accordionPanel>
    要删除原定义的属性,增加子组件<p:tab>

Function

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

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

Primefaces特有组件

Primefaces提供了很多新颖美观的组件,也可以替代Richfaces组件,大家可查看Primefaces showcase。

有一些比较常用的功能Richfaces没有提供,原来只能自己实现,现在不需要了,比如:

  • <p:outputLabel>
    自动为required增加*,为校验信息增加label
  • <p:panelGrid>
    支持复杂表格,使用Richfaces时只能借助<rich:dataTable>较繁琐。
  • <p:confirmDialog>
    confirmDialog示例:

验证

<rich:message>不支持tooltip形式显示message,<p:message>支持。

dataTable与LazyDataModel

<p:dataTable>实现了<rich:dataTable>、<rich:extendedDataTable>、<rich:dataScroller>的所有功能,定义更简单,且复杂表头时仍支持排序,支持单选、复选框选择,提供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

参考文档

附录 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.modules
    deltaspike-servlet-module-api
    1.8.1
    org.apache.deltaspike.modules
    deltaspike-servlet-module-impl
    1.8.1

    在web.xml中增加:

    EventBridgeContextListener
    org.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="", 可以使用JSF 2或Primefaces标签替换

Seam JSF 2/Primefaces
<s:div> <p:outputPanel>
<s:span> <p:outputPanel layout="inline">
<s:enumItem> <f:selectItem> label -> itemLabel enumValue -> itemValue
<s:convertDateTime> <f:convertDateTime>
<s:fragment> <ui:fragment>
<s:conversationId> <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/>

参考文档

转载于:https://blog.51cto.com/7308310/2092925

你可能感兴趣的文章
从零开始撸一个Fresco之硬盘缓存
查看>>
0901 - 虽已马不停蹄,无奈时光飞逝
查看>>
keep-loader for webpack
查看>>
padding-使用必记
查看>>
Vue教程12:多视图
查看>>
Express 与 koa 中间件模式对比
查看>>
Go 1.12 版本的新特性
查看>>
Servlet第三篇【request和response简介、response的常见应用】
查看>>
Mybatis第五篇【Mybatis与Spring整合】
查看>>
[译]PEP 380--子生成器的语法
查看>>
优雅的类写法
查看>>
ReactNative开发必备ES6知识
查看>>
基于BIGINT溢出错误的SQL注入
查看>>
Burp Suite使用介绍(二)
查看>>
Struts2 Tomcat class.classLoader.resources.dirContext.docBase赋值造成的DoS及远程代码执行利用!...
查看>>
当失控的预装行为以非正当手段伸向行货机时_北京鼎开预装刷机数据统计apk(rom固化版)分析...
查看>>
最近招聘的一些思考
查看>>
PHP 单元测试
查看>>
魔幻特效,慢放世界,nova 3带你玩转抖音新技能
查看>>
声明式调用---Feign
查看>>