使用f:param发出传递日期类型

时间:2010-08-20 16:43:32

标签: java jsf seam

我正在尝试按日期和用户ID过滤listPage。从数据表中,选定的用户标识和日期值将使用f:param标记传递给listPage。列表页面显示错误,指出“值必须是日期”,并且过滤器不起作用。它只是在没有日期的情况下由userid过滤。我能做错什么?或者我怎样才能让它发挥作用?我也尝试过使用不起作用的JBoss接缝日期转换器。

继承我的代码:

firstPage.xhtml

<h:column>
    <f:facet name="header">Date</f:facet>
            <h:outputText value="#{_auditEventFact[3]}">
            </h:outputText>
</h:column>



    <rich:column styleClass="action">
        <f:facet name="header">Action</f:facet>  
    <s:link value="View" view="/AuditEventFactList.xhtml" action="# auditEventFactList.lookUpUserAuditRecords()}">
    <f:param name="userid" value="#{_auditEventFact[1]}"/>
    <f:param name="ntimestamp" value="#{_auditEventFact[3]}"/>
  </s:link>                                             
    </rich:column>

pages.xml中

<param name="from"/>
   <param name="userid" value="#{auditEventFactList.auditEventFact.userid}"/>
   <param name="ntimestamp" value="#{auditEventFactList.auditEventFact.ntimestamp}" converterId="javax.faces.DateTime"/>

ListAction.java

private static final String EJBQL = "select auditEventFact from AuditEventFact auditEventFact";
private static final String[] RESTRICTIONS = {
        "lower(auditEventFact.userid) like concat(lower(#{auditEventFactList.auditEventFact.userid}),'%')",
        "auditEventFact.ntimestamp = #{auditEventFactList.auditEventFact.ntimestamp}",
        "lower(auditEventFact.auditid) like concat(lower(#{auditEventFactList.auditEventFact.auditid}),'%')", };

private AuditEventFact auditEventFact = new AuditEventFact();   
public AuditEventFactList() {
    setEjbql(EJBQL);
    setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
    setMaxResults(25);
}

EntityBean.java

   @Temporal(TemporalType.TIMESTAMP)
    @Column(name="NTIMESTAMP#", length=11)
    public Date getNtimestamp() {
        return this.ntimestamp1;
    }

    public void setNtimestamp(Date ntimestamp1) {
        this.ntimestamp1 = ntimestamp1;
    }

2 个答案:

答案 0 :(得分:3)

我不做Seam,所以我无法给出以Seam为目标的答案。但基本上,f:param设置一个HTTP请求参数,该参数只能包含字符串,因为它们按照HTTP规范以ASCII风格传输。它没有像您期望的那样作为一个值得信赖的java.util.Date对象传递。相反,String.valueOf(date)的结果已通过。其格式在Date#toString()中指定。

在简单的JSF术语中,有两种解决方案:

  1. 使用<h:commandLink>代替f:setPropertyActionListener,它能够“传递”完整的非标准Java对象作为“参数”。

    <h:commandLink value="View" action="#{auditEventFactList.lookUpUserAuditRecords}">
        <f:setPropertyActionListener target="#{entityBean.ntimestamp}" value="#{_auditEventFact[3]}"/>
    </h:commandLink>
    
  2. String中使用Date代替ntimestamp或在其周围包含另一个String设置器,将String转换为Date并委托原始的Date二传手。 java.text.SimpleDateFormat可能对此有所帮助。

  3. 看看这是否可以与Seam结合使用。

答案 1 :(得分:0)

您可以在参数上使用<s:convertDateTime />标记吗?我自己从未尝试过,但值得一试。