在play framework 2.1中使用scala和java:会话使用
我目前正在模板中使用play framework的在play framework 2.1中使用scala和java:会话使用,java,scala,playframework,playframework-2.1,Java,Scala,Playframework,Playframework 2.1,我目前正在模板中使用play framework的session(): @if(session().get("email")==null){ <li><a href="@controllers.routes.General.login">Login</a></li> }else{ <li><a href="@controllers.routes.General.logout">Logout</a>
session()
:
@if(session().get("email")==null){
<li><a href="@controllers.routes.General.login">Login</a></li>
}else{
<li><a href="@controllers.routes.General.logout">Logout</a></li>
}
@if(session().get(“email”)==null){
}否则{
}
我的所有视图都使用此模板。其中一些视图由Java控制器控制,另一些视图由Scala控制器控制
当我点击指向Java控制器的链接时,我没有问题,登录和注销的链接都得到了正确的处理
当我点击指向Scala控制器的链接时,我得到一个[RuntimeException:这里没有可用的HTTP上下文。]
从我在这里读到的有关scala控制器的内容中,我了解到它们在呈现页面时不会返回http上下文,但我确实希望能够在模板中使用会话
我曾考虑在我的视图、模板和控制器中使用一个参数session()
,但我相信当play编译html页面时,java会话(play.mvc.http.session)和scala会话(play.api.mvc.session)之间会有冲突
我卡住了吗?是否有可能强制scala控制器返回http上下文?我可能错了,但我认为您的scala控制器应该如下所示:
def myaction() = Action { implicit request =>
...
}
而不是:
def myaction() = Action {
...
}
也就是说,您必须将请求添加到操作的范围中
并在文件开头将其添加到视图中:
@(...)(implicit session:Session)
好的,我找到了解决这个问题的方法。
这不是真正的审美,但它的工作,并摆脱了问题完全
我创建了两个不同的主模板:scalamain.scala.html
和javamain.scala.html
Scala控制器控制的所有视图都使用scalamain
模板,并使用通常的技巧使用会话(隐式参数,请参阅更多)
javamain
模板由Java控制器控制的所有视图使用。(这些视图很容易使用会话)
当然,这两个模板在播放时呈现相同
我的代码中有一些冗余,需要分离所有操作,以便视图只由一种类型的控制器(scala或java)控制
我希望这能帮助其他有同样问题的人。我验证了这个答案,因为它解决了这个问题,但是如果你找到一个更优雅的方法来解决它,请随意回答。根本原因可能是Java控制器和Scala控制器的处理方式不同。
我先用Java编写了我的项目,然后尝试添加更多的Scala控制器。我也遇到了这个问题(顺便说一句,我正在使用Play2.3.2)
我试图通过使用自己的ActionBuilder在ADLOCAL变量中设置自己的Http.Context来解决这个问题
import play.api.mvc._
import scala.concurrent.Future
import play.mvc.Http.Context
import play.core.j.JavaHelpers
object ContextAction extends ActionBuilder[Request] {
def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
Context.current.set(JavaHelpers.createJavaContext(request))
block(request)
}
}
然后,我的Scala控制器操作只需使用此ContextAction即可:
class TestController extends Controller {
def test = ContextAction { implicit request =>
Ok(views.html.index())
}
}
通过这种方式,索引模板可以访问所有request()/session()/等。我认为它也可以解决这个问题,而隐式请求
实际上为控制器提供了在http上下文中使用数据的可能性。不幸的是,scala控制器没有使用这些数据来构建HTML页面。(当执行Ok(…)
时,数据没有提供给页面,因此问题仍然存在)我还认为#with session
就是为了这个,但它似乎只在构建HTML页面后返回HTTP头…正如我所说的,我不能使用这个解决方案。我使用会话对象的scala和java版本:play.api.mvc.Session
和play.mvc.Http.Session
,因为当我在模板中声明其中一个会话时,我只能在scala或java控制器中检索其中一个(java控制器返回java会话,scala控制器返回scala会话)(隐式会话:play.mvc.Http.session)
另一个没有工作。我不能简单地放置一个(隐式会话:session)
,因为找不到对象会话。