Saf*_*ron 5 java scala playframework playframework-2.1
我目前正在使用session()模板中的play框架:
@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>
}
Run Code Online (Sandbox Code Playgroud)
此模板用于我的所有视图.其中一些视图由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上下文?
小智 2
根本原因可能是 Java 控制器和 Scala 控制器的处理方式不同。我首先使用 Java 编写项目,然后尝试添加更多 Scala 控制器。我也遇到了这个问题(顺便说一句,我使用的是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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的 Scala 控制器操作只需使用此 ContextAction 即可:
class TestController extends Controller {
def test = ContextAction { implicit request =>
Ok(views.html.index())
}
}
Run Code Online (Sandbox Code Playgroud)
这样索引模板就可以访问所有 request() / session() / 等。
| 归档时间: |
|
| 查看次数: |
3658 次 |
| 最近记录: |