如何在JSP页面中直接编写scala脚本?
有没有scala JSP引擎,或者将来会有吗? 我知道scala web框架提升,但它看起来更像标签。 我正在寻找一种像PHP一样编写脚本的方法如何在JSP页面中直接编写scala脚本?,jsp,scala,Jsp,Scala,有没有scala JSP引擎,或者将来会有吗? 我知道scala web框架提升,但它看起来更像标签。 我正在寻找一种像PHP一样编写脚本的方法 谢谢。编辑:检查:Scala模板引擎:像JSP一样,没有垃圾,但增加了Scala的酷度。我只是在查看#scala twitter提要时偶然发现了这一点 你可以看看。它看起来像是一个活动项目,只需编写Scala代码与xhtml代码混合即可。我不知道你是否能像PHP那样编写脚本。其中一个不同之处是,使用JSP/PHP时,在HTML页面中包含一个程序,其中
谢谢。编辑:检查:Scala模板引擎:像JSP一样,没有垃圾,但增加了Scala的酷度。我只是在查看#scala twitter提要时偶然发现了这一点
你可以看看。它看起来像是一个活动项目,只需编写Scala代码与xhtml代码混合即可。我不知道你是否能像PHP那样编写脚本。其中一个不同之处是,使用JSP/PHP时,在HTML页面中包含一个程序,其中与使用
step
时一样,在Scala文件中包含一些xml
Scala将会有一些学习曲线,但我认为利用Scala是值得的
您可以做的另一件事是编写一个自定义JSP标记,让您通过解释器运行一些Scala代码。我做了概念验证,这似乎有效:
/**
* Proof of concept, you can run Scala code in a JSP tag.
* Works with jetty and sbt.
*/
class ScalaScriptTag extends BodyTagSupport {
override def doAfterBody():Int = {
try {
val settings = new Settings(str => println(str))
// interpreter classloader does not seem to pick up classes from the parent
settings.classpath.value =
"lib_managed/compile/jsp-api-2.1-6.1.14.jar;" +
"lib_managed/compile/servlet-api-2.5-6.1.14.jar"
var i = new Interpreter(settings) {
override def parentClassLoader():ClassLoader = {
return Thread.currentThread().getContextClassLoader();
}
}
i.bind("pageContext", "javax.servlet.jsp.PageContext", pageContext)
val source = Source.fromString(getBodyContent.getString)
for (line <- source.getLines) { i.interpret(line) }
} catch {
case ioe: IOException =>
throw new JspException(ioe.getMessage())
}
Tag.SKIP_BODY
}
}
/**
*概念证明,您可以在JSP标记中运行Scala代码。
*与码头和sbt合作。
*/
类ScalaScriptTag扩展了bodyTag支持{
重写def doAfterBody():Int={
试试{
val设置=新设置(str=>println(str))
//解释器类加载器似乎无法从父类中提取类
settings.classpath.value=
“lib_managed/compile/jsp-api-2.1-6.1.14.jar;”+
“lib_managed/compile/servlet-api-2.5-6.1.14.jar”
var i=新解释器(设置){
重写def parentClassLoader():ClassLoader={
返回Thread.currentThread().getContextClassLoader();
}
}
i、 绑定(“pageContext”、“javax.servlet.jsp.pageContext”、pageContext)
val source=source.fromString(getBodyContent.getString)
为了(线路)
抛出新的JspException(ioe.getMessage())
}
Tag.SKIP_BODY
}
}
具有scala模式。Play非常适合rails。可能适合您的需要。是一个基于scala的模板引擎,它允许您使用功能强大的scala表达式,而不是有限的JSP/JSF/JSTL EL表达式语言,同时完全静态键入,以便在编辑/编译时检查模板是否存在错误
Scalate中的模板可以让您编写真正干净利落的模板,这些模板特别适合XML/HTML(Rails的粉丝倾向于喜欢Haml,Scaml是Haml的Scala端口)
虽然如果您喜欢JSP样式的模板,那么最好从Scalate中类似JSP的模板开始。Play也通过Scalate模块支持Scalate模板: