我正在研究Scala中的一个小型MVC“框架”(它真的非常小)。我希望能够将我的视图文件编写为Scala代码,这样我就可以从编译器中获得很多帮助。预编译很棒,但我真正想要的是让servlet容器根据请求自动编译某些文件(我的视图文件),这样我就不必关闭Jetty并立即编译所有源文件,然后再次启动它只是为了看到我的HTML的小变化。
我在.NET中使用.ascx文件做了很多(该文件只包含一个带有一堆C#代码的scriptlet标记,其中使用XmlWriter写出标记)我喜欢这个工作流程。您只需进行更改然后刷新浏览器,但它仍在编译!
我没有很多Java经验,但似乎也可以用JSP来做这件事。我想知道Scala中是否有可能发生这种事情。
我已经考虑过自己构建这个(请参阅更多信息:http://www.nabble.com/Compiler-API-td12050645.html)但如果它在那里我宁愿使用别的东西。
答案 0 :(得分:9)
如果您想要类似于JSP / ASP / Erb但使用Scala代码的东西,您可能需要查看Scalate。
Scalate是一个基于Scala的模板引擎,允许您使用强大的Scala表达式而不是有限的JSP / JSF / JSTL EL表达式语言 - 同时完全静态类型化,以便在编辑/编译时检查模板是否存在错误 - 以及模板在编辑时即时重新加载。
对于JSP / ASP样式的模板,然后尝试使用Scalate中的Ssp模板,这些模板非常像JSP。
如果您主要生成HTML / XML标记,我还建议您尝试使用Scalate中的Scaml模板 - 它们是HAML的Scala版本,这会导致真正的DRY模板
答案 1 :(得分: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
}
}
我的解决方案有两个部分:
答案 2 :(得分:2)
有很多选择。例如,一种替代方法是使用JRebel(formely JavaRebel)和后台编译过程(例如,mvn scala:cc
与Maven)。