7

我正在Scala中开发一个小型MVC“框架”(它真的非常小)。我希望能够将我的视图文件编写为 Scala 代码,这样我就可以从编译器那里获得很多帮助。预编译很棒,但我真正想要的是让 servlet 容器根据请求自动编译某些文件(我的视图文件),这样我就不必关闭 Jetty 并立即编译所有源文件,然后再次启动它只是为了查看我的 HTML 的微小变化。

我在 .NET 中经常使用 .ascx 文件(该文件将只包含一个 scriptlet 标记,其中包含一堆 C# 代码,其中使用 XmlWriter 写出标记),我喜欢这个工作流程。您只需进行更改,然后刷新浏览器,但它仍在编译!

我对 Java 没有太多经验,但似乎也可以使用 JSP 来做到这一点。我想知道这种事情在 Scala 中是否可行。

我已经研究过自己构建它(在此处查看更多信息:http: //www.nabble.com/Compiler-API-td12050645.html)但如果它在那里,我宁愿使用其他东西。

4

3 回答 3

9

如果你想要一些有点像 JSP/ASP/Erb 但使用 Scala 代码的东西,你可能想看看Scalate

Scalate 是一个基于 Scala 的模板引擎,它允许您使用强大的 Scala 表达式而不是有限的 JSP/JSF/JSTL EL 表达式语言 - 同时完全静态类型化,以便在编辑/编译时检查模板是否有错误 - 并重新加载模板在编辑它们时即时进行。

对于 JSP/ASP 样式的模板,请尝试Scalate 中非常类似于 JSP的Ssp模板。

如果您主要生成 HTML/XML 标记,我还建议您尝试使用 Scalate 中的 Scaml模板 - 它们是HAML的 Scala 版本,可以生成真正 DRY 模板

于 2010-03-31T18:28:59.257 回答
3

当我通过在 Scala 中编写带有嵌入式 xml 模板的 servlet 来跳过 JSP/框架时,这会出现在我身上:

class MyServlet extends HttpServlet {

def get(req) = {
 var title = "hello world"
 var link = "somepage"
 <html>
   <head><title>{ title }</title></head>
   <body><a href={ "/" + link }>Click</a></body>
 </html>
}

def doGet(req: HttpServletRequest, res: HttpServletResponse) = {
 val out = new PrintWriter(res.getOutputStream())
 out.println(get(req))
 out.close
}

}

我的解决方案有两个部分:

  1. 使用fsc代替scalac
  2. 使用FireBug,特别是它的edit按钮。

我发现自己不断进行的小改动是对样式表(不需要重新启动 Jetty),或者使用可能的 HTML 替代方案。最好的方法是右键单击 HTML,单击 Inspect Element,然后按 firebug 控制台中的编辑按钮,并在现场进行编辑。这意味着每次您进行更改时都不再需要恢复站点的状态。

当你让它看起来正确时,将更改复制到 scala 并点击 make。

于 2009-10-30T21:24:04.340 回答
2

有很多选择。例如,一种替代方法是使用 JRebel(以前称为 JavaRebel)和一个后台编译过程(例如mvn scala:cc使用 Maven)。

于 2009-10-30T11:43:33.463 回答