1

我为学习目的开发了一个 Scala 和 JSF 应用程序。在这个应用程序中,我必须将所有 Scala 集合对象转换为 Java cllectios,然后才能在 JSF 中呈现。有没有什么简单的方法可以用 ScalaElResolver 之类的东西来实现,如果是的话,有人有 ScalaElResolver 的示例代码。在此先感谢菲利普

4

2 回答 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 回答