javascript
java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用
java jsf
如果您將Java 8與Java EE 7一起使用,則在嘗試利用某些Java 8新功能時可能會遇到一些怪癖。 一個這樣的怪癖是,默認情況下,新的Date-Time API不適用于許多Java EE 7 API,因為它們是為與java.util.Date和/或更舊的Date API一起使用而構建的。 但是,這不是障礙,因為有許多方法可以解決此類問題。 在本文中,我將演示如何調整JSF應用程序,以允許將Java 8 Date-Time API與JPA和日期轉換器一起使用。
首先,如果您希望使用新的LocalDate類(或Java 8 Date-Time API中的其他類)來保留日期,則需要開發一個轉換器,該轉換器將自動從java.time.LocalDate轉換為java.util.Date ,反之亦然,以便使用JPA 2.1。 這很容易做到,尤其是因為不需要配置任何XML即可建立轉換器。 以下代碼是用于為JPA提供Java 8 Date-Time支持的轉換器:
import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; import java.time.ZoneId; import java.util.Date; import javax.persistence.AttributeConverter; import javax.persistence.Converter;/*** Converter to provide Java 8 Date/Time API Support to JPA* * @author Juneau*/ @Converter(autoApply = true) public class LocalDatePersistenceConverter implements AttributeConverter<LocalDate, Date> {@Overridepublic Date convertToDatabaseColumn(LocalDate entityValue) {LocalTime time = LocalTime.now();Instant instant = time.atDate(entityValue).atZone(ZoneId.systemDefault()).toInstant();return Date.from(instant);}@Overridepublic LocalDate convertToEntityAttribute(Date databaseValue) {Instant instant = Instant.ofEpochMilli(databaseValue.getTime());return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();} } 查看代碼, convertToDatabaseColumn()方法接受一個
來自實體,類的LocalDate,然后利用某些Java 8 Date-Time API實用程序將其轉換為java.util.Date以便可以將其存儲到數據庫中。 第二種方法convertToEntityAttribute()從JPA中獲取一個java.util.Date并將其沿相反的方向轉換為LocalDate對象,以與基于Java 8的應用程序一起使用。 @Converter批注將類注冊為轉換器,并且實現AttributeConverter將該轉換器應用于實體類,以便將狀態轉換為數據庫列,然后再次返回。
接下來,如果您嘗試將JSF轉換器應用于應用程序中的Java 8 LocalDate (例如在視圖中),則將遇到問題,除非您編寫特殊的FacesConverter實現以應用于要轉換為LocalDate的組件。 編寫FacesConverter就像實體類屬性轉換器一樣簡單,注冊就像將注釋應用到轉換器一樣容易。 下列類是FacesConverter的示例,該示例會將java.time.LocalDate轉換為java.util.Date ,以便在JSF組件中使用。
注意:這也適用于流行的JSF組件庫,例如PrimeFaces。
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.FacesConverter;/*** Faces converter for support of LocalDate* @author Juneau*/ @FacesConverter(value="localDateTimeConverter") public class LocalDateTimeConverter implements javax.faces.convert.Converter {@Overridepublic Object getAsObject(FacesContext context, UIComponent component, String value) {return LocalDate.parse(value);}@Overridepublic String getAsString(FacesContext context, UIComponent component, Object value) {LocalDate dateValue = (LocalDate) value;return dateValue.format(DateTimeFormatter.ofPattern("MM/dd/yyyy"));}} 現在讓我們看一下代碼。 這個FacesConverter類是通過@FacesConverter批注注冊的,該類可以簡單地實現javax.faces.convert.Converter接口。 接下來,看一下實現。 getAsObject()方法用于解析組件中的String并將其作為java.time.LocalDate返回,而getAsString()方法接受LocalDate對象并以指定的日期格式將其作為String返回。 這展示了Java 8的另一個不錯的功能……
DateTimeFormatter類,可輕松格式化java.time.*對象。
就是這樣……在Java EE 7應用程序中使用漂亮的Java 8 Date-Time API并不是太困難。 現在,將轉換器應用于日期組件。 以下標記演示了如何將轉換器應用于PrimeFaces日歷組件。
<p:calendar id="enterDate" converter="localDateTimeConverter" style="width: 100%;"readonly="true" value="#{myExcellentJsfController.current.enterDate}"></p:calendar>翻譯自: https://www.javacodegeeks.com/2015/06/utilizing-the-java-8-date-time-api-with-jsf-and-java-ee-7.html
java jsf
總結
以上是生活随笔為你收集整理的java jsf_将Java 8日期时间API与JSF和Java EE 7结合使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 佛山犬只备案要审批多久(佛山犬只备案)
- 下一篇: linux组成部分(linux 组成)