我为学习目的开发了一个 Scala 和 JSF 应用程序。在这个应用程序中,我必须将所有 Scala 集合对象转换为 Java cllectios,然后才能在 JSF 中呈现。有没有什么简单的方法可以用 ScalaElResolver 之类的东西来实现,如果是的话,有人有 ScalaElResolver 的示例代码。在此先感谢菲利普
问问题
631 次
2 回答
3
此代码基于Werner Punz的 ScalaElResolver。我已经把它剥离了,所以它只处理从 ScalaIterable
到 a的转换java.lang.Iterable
:
class SimpleScalaElResolver extends ELResolver {
override def getValue(elContext: ELContext, base: AnyRef,
prop: AnyRef): AnyRef = {
println(s"SimpleElResolver: getValue: Entering: $base.$prop")
if (base == null) {
null
} else {
val method = base.getClass.getDeclaredMethod(prop.toString)
if (method != null) {
val res = method.invoke(base)
if (res.isInstanceOf[Iterable[_]]) {
val iter = res.asInstanceOf[Iterable[_]]
println("getValue: Wrapping as Java iterable")
elContext.setPropertyResolved(true)
JavaConversions.asJavaIterable(iter)
} else {
null
}
} else {
null
}
}
}
即使所有其他方法仍然“尚未实现”,这足以让它使用sbt
及其 Web 插件(在后台使用)运行,如下所示:jetty
override def getCommonPropertyType(elContext: ELContext, o: AnyRef): Class[_] = {
???
}
在我的情况下没有调用其他方法。
我只在.jspx
; 据我所知,这也应该适用JSF
。
示例:如果您有课程
class Model(val list: List[Int])
在你的控制器中
val model = new Model(List(1))
httpRequest.setAttribute("model", model)
您可以在 EL 中访问实例
<ul>
<c:forEach var="i" items="${ model.list }">
<li>
<c:out value="${ i }"/>
</li>
</c:forEach>
</ul>
因此 EL 中的属性名称与val
模型类中的名称完全匹配。否则你会得到一个java.lang.NoSuchMethodException
.
于 2013-07-05T09:21:38.053 回答
0
嗨,我刚刚在 github 上打开了一个 scalaelresolver 项目,https://github.com/werpu/scalaelresolver除了解析 scala 属性之外,解析器还可以进行集合转换。包括一个例子。
于 2013-08-24T07:29:12.273 回答