1

私がやろうとしているのは、timeMillis時間をミリ秒単位で保存するプロパティを取得し(使用して取得したSystem.currentTimeMillis()もの)、現在の時刻から減算した後、同等の日数、時間、分、秒に変換することです。主な問題は、コンバーターが呼び出されるたびに関数timeConverter のみが呼び出され、呼び出されないことです。getAsStringgetAsObject

これは、コンバーターが正しく実行されない原因となっている xhtml ファイルの一部です。

<c:forEach var="p" items="#{statusBean.statusList}">
    <h:form>
        <div class="status">
            <h:commandLink action="#{friendBean.gotoFriendProfile(p.email)}">
                <img src="../images/profilePicture/#{p.picture}" style="height: 29px; width: 29px; "/>
                <h:outputText value="#{p.statusBy}:"/>
            </h:commandLink>
            <h:outputText value="#{p.statusmsg}"/>
            <h:outputText value="#{p.timeMillis}">
                <f:converter converterId="timeConverter"/>
            </h:outputText>
            <br/>
            <c:forEach var="q" items="#{statusBean.commentList(p.statusId)}">
            <div class="barcomment">
                <br/>
                <h:commandLink action="#{friendBean.gotoFriendProfile(q.email)}">
                    <img src="../images/profilePicture/#{q.picture}" style="height: 29px; width: 29px; "/>
                    <h:outputText value="#{q.commentBy}:"/>
                </h:commandLink>
                <h:outputText value=" #{q.comment}"/>
            </div>
        </c:forEach>
        <br/>
        <div class="comment">
            <p:inputText value="#{statusBean.comment.comment}" styleClass="box"  />
            <p:commandLink  value="Views" action="#{statusBean.update(p.statusId)}" ajax="false" styleClass="link"/>
        </div> 

これが私が書いた timeConverter クラスです。

package com.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

public class TimeConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        System.out.println("inside getAsObject");
        long time=Integer.parseInt(arg2);
        long currentTime=System.currentTimeMillis();
        long eclapseTime=time-currentTime;
        long secs=eclapseTime/1000;
        long days=secs/(60*60*24);
        long hours=(secs%(60*60*24))/60*60;
        long mins=(secs%(60*60*24)%(60*60))/60;
        long secs2=(secs%(60*60*24)%(60*60)%(60));
        StringBuffer sb = new StringBuffer();
        sb.append(days).append("days").append(hours).append("hours").append(mins).append("mins").append(secs2).append("secs");
        String object1 = sb.toString();
        return object1;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        System.out.println("inside getAsString");
        String value1 = value.toString();
        return value1;

    }

}
4

1 に答える 1

1

なぜそれが問題なのですか?

ここでは、UIOutputコンポーネントでのみコンバーターを使用しています。

<h:outputText value="#{p.timeMillis}">
    <f:converter converterId="timeConverter"/>
</h:outputText>

は、生成された HTML 出力に埋め込むことができるモデル値をgetAsString()に変換するために呼び出されました (ご存知のように、Java オブジェクトをそのまま HTML 文字列に入れることはできません)。ObjectString

ただし、 のUIInputようなコンポーネントで使用してい<h:inputText>ないため、送信された値をモデルでString目的の値に変換する必要がないため、が呼び出されることはありません。ObjectgetAsObject()

すべてが設計どおりに機能しています。あなたの具体的な問題は、代わりに行った仕事を実際に実行する必要があることです。getAsObject()getAsString()

メソッドにもう少し賢明な引数名を付けると役立つと思います。

@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {
    // Write code here which converts the model value to display value.
    // This method will be used when generating HTML output.
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) throws ConverterException {
    // Write code here which converts the submitted value to model value.
    // This method will be used when processing submitted input values.
}
于 2012-09-27T19:32:29.287 に答える