繁体   English   中英

在play框架中使用scala和java 2.1:会话使用

[英]Using scala and java in play framework 2.1 : Session usage

我目前正在我的模板中使用play框架的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>
}

此模板用于我的所有视图。 其中一些视图由Java控制器控制,一些视图由Scala控制器控制。

当我点击导致Java控制器的链接时,我没有问题,正确处理登录和注销的链接。

当我点击导致Scala控制器的链接时,我得到一个[ RuntimeException: There is no HTTP Context available from here.]

从我在这里读到的关于scala控制器的内容来看,我理解他们在渲染页面时没有返回http上下文,但我真的希望能够在我的模板中使用会话。

我想在我的视图,模板和控制器中使用参数session() ,但我相信java会话(play.mvc.http.session)和scala会话(play.api.mvc)之间会发生冲突。 session)play时会编译html页面。

我被困了? 是否有可能强制scala控制器回放http上下文?

根本原因可能是Java控制器和Scala控制器的处理方式不同。 我首先在Java中使用我的项目,然后尝试添加更多Scala控制器。 我也遇到过这个问题(BTW,我正在使用Play 2.3.2)。

我试图通过使用我自己的ActionBuilder在TheadLocal变量中设置我自己的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()/等。

我可能错了,但我认为您的Scala控制器应该如下所示:

  def myaction() = Action { implicit request =>
    ...
  }

代替:

  def myaction() = Action {
    ...
  }

即,您必须将请求添加到您的Action范围。

并将其添加到您的视图,在文件的开头:

@(...)(implicit session:Session)

好的,我找到了解决这个问题的方法。 这不是真正的美学,但它有效,并完全摆脱了问题。

我创建了两个不同的主模板: scalamain.scala.htmljavamain.scala.html

scalamain模板由Scala控制器控制的所有视图使用,并使用通常的技巧来使用会话(隐式参数,请参见此处 )。

javamain模板由Java控制器控制的所有视图使用。 (这些视图很容易使用会话)。

当然,这两个模板一旦通过播放呈现就相同。

我最终在代码中出现了一些冗余,并将所有操作分开,以便视图仅由一种类型的控制器(scala或java)控制。

我希望这会帮助其他人解决同样的问题。 我验证了这个答案,因为它解决了问题,但如果你找到一种更优雅的方法来解决它,请随时回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM