我想要做的是我正在使用timeMillis
属性以毫秒为单位存储时间(我使用System.currentTimeMillis()
)并将其转换为等效的天数,小时数,分钟数和秒数从当前时间减去它。主要问题是无论何时转换器timeConverter
仅调用getAsString
函数,不调用getAsObject
。
以下是我的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;
}
}
答案 0 :(得分:1)
为什么这是一个问题?
您只在UIOutput
组件中使用转换器:
<h:outputText value="#{p.timeMillis}">
<f:converter converterId="timeConverter"/>
</h:outputText>
调用getAsString()
将Object
模型值转换为String
,它可以嵌入到生成的HTML输出中(你知道,你不能明白地放置Java对象)在HTML字符串中。)
但是,您无法在<h:inputText>
组件String
中使用它,因此无法提交Object
值,需要将其转换为所需的getAsObject()
1}}在模型中,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.
}
中执行的工作。
我认为如果你给方法一些更明智的参数名称会有所帮助:
{{1}}