JSP或.ascx等效于Scala?

时间:2009-10-30 05:44:24

标签: jsp scala ascx

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

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

我没有很多Java经验,但似乎也可以用JSP来做这件事。我想知道Scala中是否有可能发生这种事情。

我已经考虑过自己构建这个(请参阅更多信息:http://www.nabble.com/Compiler-API-td12050645.html)但如果它在那里我宁愿使用别的东西。

3 个答案:

答案 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
}

}

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

  1. 使用fsc代替scalac
  2. 使用FireBug,特别是edit按钮。
  3. 我发现自己做的不断变化是样式表(不需要重新启动Jetty),或者使用可能的HTML替代品。最好的方法是右键单击HTML,单击Inspect Element,然后按下firebug控制台中的编辑按钮,并在现场进行编辑。这意味着每次进行更改时都不会再恢复网站的状态。

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

答案 2 :(得分:2)

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