我刚刚开始使用play框架,我正在尝试理解java应用程序代码和基于scala的模板框架之间的交互(注意:到目前为止我对Scala一无所知,除了它是另一个编译为JVM上的字节码的语言,以及您的Scala和Java类可以交互的语言.
我有一个test1.scala.html模板,如下所示:
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
</head>
<body>
@content
</body> </html>
Run Code Online (Sandbox Code Playgroud)
从顶行可以看出,模板需要一个String和一个Html参数,但我无法弄清楚如何从Java调用者代码构造Html参数!
我在我的控制器类中尝试了一些变体:
return ok(test1.render("My Title","It <em>finally</em> works!"));
Run Code Online (Sandbox Code Playgroud)
显然这很失败,因为第二个参数是String而不是Html,所以我的参数不匹配.(有一个运行时错误: actual argument String cannot be converted to Html by method invocation conversion- 这是有道理的,但我希望这里有一些魔法.:))
所以我尝试从String中创建一些Html,认为这可能是包中的某个帮助类,这可能"只是工作":
return ok(test1.render("My Title",new Html("It <em>finally</em> works!")));
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为javac找不到Html类.好,可以.扫描播放文档,似乎有一个play.api.templates.Html类(用Scala编写)带有一个带String的构造函数,所以我尝试完整的包限定名:
return ok(test1.render("My Title",new play.api.templates.Html("It <em>finally</em> works!")));
Run Code Online (Sandbox Code Playgroud)
这也不会编译:我在包play.api.templates中找不到'Html'的符号.
那么:什么是让我将我的String(其中包含HTML片段)转换为我可以传递到模板的HTML对象的神奇酱油?
对不起,如果这个问题变得愚蠢,但我根本找不到我的错误,我在SO和其他网站上已经检查了很多帖子.我使用Java设置了一个Play 2.3.7项目.我在app目录下的common包中创建了一个Global.java文件.在该文件中我覆盖onStart(和其他钩子),但我没有让它们工作.他们根本就不执行.这是Global.java文件:
package common;
import play.Application;
import play.GlobalSettings;
import play.Logger;
public class Global extends GlobalSettings {
@Override
public void beforeStart(Application application) {
Logger.error("good bye cruel world");
super.beforeStart(application);
throw new RuntimeException("WTF");
}
@Override
public void onStart(Application application) {
Logger.error("good bye cruel world");
super.onStart(application);
throw new RuntimeException("WTF");
}
@Override
public void onStop(Application application) {
Logger.error("good bye cruel world");
super.onStop(application);
throw new RuntimeException("WTF");
}
}
Run Code Online (Sandbox Code Playgroud)
在application.conf中,这是相关部分,默认情况下注释:
# Define the common.Global object class for this application.
# Default to common.Global in the root package. …Run Code Online (Sandbox Code Playgroud) 我基本上寻找类型类的反面Prepend[A, B].
如果我有类似的东西:
type A = String :: Int :: HNil
type B = Boolean :: Double :: HNil
val a: A = "a" :: 1 :: HNil
val b: B = false :: 2.1 :: HNil
scala> val ab = a ++ b
ab: shapeless.::[String,shapeless.::[Int,shapeless.::[Boolean,shapeless.::[Double,shapeless.HNil]]]] = a :: 1 :: false :: 2.1 :: HNil
Run Code Online (Sandbox Code Playgroud)
我有一个HList a类型A和HList b类型B,我可以找到一个prepend: Prepend[A, B]这样我可以连接它们a ++ b.
但如果我有一个HList ab …
我一直在阅读一些帖子,并想知道是否有人可以提出TrieMap何时比使用HashMap更可取的情况.
基本上什么架构决策应该激励使用TrieMap?
在Play框架2.0.8中使用Java可以进行详细的编译吗?
目前我只看到:
[info]编译131个Scala源和10个Java源代码到......
我正在尝试确定更改控制器时为什么会重新编译这么多文件的原因.
提前致谢
我在运行Typesafe Activator时遇到问题.我在1.1.3版本上运行了一段时间.这是一个Java Play项目.最近它自动更新到1.2.1并且已停止工作.首先,我的Java版本是1.7.0_25-b17.我正在运行Windows 8.1并从PowerShell运行激活器.
这是错误输出:
The system cannot find the file C:\Users\[my name]\.activator\1.2.3\activatorconfig.txt.
The system cannot find the file C:\Users\[my name]\.activator\activatorconfig.txt.
Checking for a newer version of Activator (current version 1.2.1)...
java.lang.NoSuchMethodError: scala.util.matching.Regex.unapplySeq(Ljava/lang/CharSequence;)Lscala/Option;
at activator.ActivatorLauncher.downloadLatestVersion(ActivatorLauncher.scala:164)
at activator.ActivatorLauncher.checkForUpdatedVersion(ActivatorLauncher.scala:206)
at activator.ActivatorLauncher.run(ActivatorLauncher.scala:27)
at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:109)
at xsbt.boot.Launch$.withContextLoader(Launch.scala:129)
at xsbt.boot.Launch$.run(Launch.scala:109)
at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:36)
at xsbt.boot.Launch$.launch(Launch.scala:117)
at xsbt.boot.Launch$.apply(Launch.scala:19)
at xsbt.boot.Boot$.runImpl(Boot.scala:44)
at xsbt.boot.Boot$.main(Boot.scala:20)
at xsbt.boot.Boot.main(Boot.scala)
Error during sbt execution: java.lang.NoSuchMethodError: scala.util.matching.Reg
ex.unapplySeq(Ljava/lang/CharSequence;)Lscala/Option;
Run Code Online (Sandbox Code Playgroud)
这也是一个新的下载激活剂.每当我尝试运行激活器或激活器ui时就会发生这种情况.其他命令失败了类似的消息,除了激活器帮助,运行正常.有谁知道这里有什么问题吗?我错过了什么吗?只要我有JDK6 +,理论上Activator应该运行,对吗?我正在使用应该包含依赖项的版本,据我所知,丢失的方法实际上确实存在.由于我必须回到Play项目的工作,这真的让我感到高兴.
从Play Framework 2.3.x开始,Play WS是一个依赖库.参考:
http://playframework.com/documentation/2.3.x/Migration23
如何将其包含在SBT项目中?
回答:
"com.typesafe.play" %% "play-ws" % "2.3.1"
Run Code Online (Sandbox Code Playgroud) 我正在使用带有play2的java8,具有此配置.
name := """shipping"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayJava)
scalaVersion := "2.11.1"
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
javaWs,
"org.apache.axis" % "axis" % "1.4",
"net.sf.barcode4j" % "barcode4j" % "2.1",
"xml-apis" % "xml-apis" % "1.4.01",
"javax.xml" % "jaxrpc-api" % "1.1",
"org.webjars" % "flot" % "0.8.0",
"org.webjars" % "bootstrap" % "2.3.1",
"commons-discovery" % "commons-discovery" % "0.4",
"postgresql" % "postgresql" % "9.1-901.jdbc4",
"wsdl4j" % "wsdl4j" % "1.6.2",
"org.apache.xmlgraphics" % "fop" % "1.0"
)
javacOptions ++= Seq("-source", "1.8", "-target", …Run Code Online (Sandbox Code Playgroud) 如果我们有一个接受匿名函数A => B作为参数的方法,我们可以A在调用中隐式.
def impl(a: Int)(f: Int => Int): Int = f(a)
impl(a) { implicit z =>
...
}
Run Code Online (Sandbox Code Playgroud)
但是我们可以使用具有多个参数的匿名函数来执行此操作吗?
def impl(a: Int, b: Int)(f: (Int, Int) => Int): Int = f(a, b)
Run Code Online (Sandbox Code Playgroud)
理想情况下,这将工作如下:
impl(1, 2) { implicit (a, b) => // wrong
...
}
Run Code Online (Sandbox Code Playgroud)
要么
impl(1, 2) { (implicit a, implicit b) => // also wrong
...
}
Run Code Online (Sandbox Code Playgroud)
我可以使用A => B => C相反的方法解决这个问题:
def impl(a: Int, b: Int)(f: Int => Int => Int): …Run Code Online (Sandbox Code Playgroud) 下列:
val add = (a: Int, b: Int) => a + b
Run Code Online (Sandbox Code Playgroud)
转换为:
object add extends Function2[Int, Int, Int] {
def apply(a: Int, b: Int) = a + b
}
Run Code Online (Sandbox Code Playgroud)
而
val a1 = add(_: Int, 3)
Run Code Online (Sandbox Code Playgroud)
转换为:
object a1 extends Function1[Int, Int] {
def apply(x: Int): Int = {
add(x, 3)
}
}
Run Code Online (Sandbox Code Playgroud)
但当我这样做时:
scala> val a2 = add _
a2: () => (Int, Int) => Int = <function0>
Run Code Online (Sandbox Code Playgroud)
然后调用a2,它会抛出一个错误:
scala> a2(1, 2)
<console>:11: error: too many …Run Code Online (Sandbox Code Playgroud)