spa*_*rkr 11 session scala playframework-2.1
我有一个基于Play框架和Scala构建的Web应用程序.它是关于向用户呈现一组问题,每个问题都有一组答案.有些问题的单选按钮类型有答案,有些有复选框作为答案.当用户单击开始测试时,我调用控制器,获取问题列表及其答案,并将结果作为案例类返回到视图模板.我现在需要在用户回答每个问题时保持测试状态.他可以前一个,下一个,我需要跟踪他回答的所有问题.
来自Java EE背景,我以为我可以在会话中存储case类并在我的控制器中操作它.但遗憾的是,由于Play框架的会话是一个String,String而不是String,Object的键值对,所以看起来并不像那样.我现在坚持使用我的应用程序,因为我对Play框架的经验有限,我想征求意见.
B. *_*ski 11
在Play框架中根本没有任何状态,因此如果您想在多个HTTP请求之间保留一些数据,则可以使用会话范围实际创建具有键/值对(String,String)的cookie,并且它们的大小限制为4KB.
我的建议是用Json做,Play-json库真棒.如果您的模型具有JSON 读/写/格式组合器而不是简单.
Ok(render(Questions)).withSession("answers" -> Json.prettyPrint(Json.toJson(Answer)))
Run Code Online (Sandbox Code Playgroud)
读取会话值可以这样做:
def index = Action { implicit request =>
session.get("answers").map { answers =>
val jsValueAnswers: JsValue = Json.parse(answers)
val answersModel: YourAnswerModel = Json.fromJson(jsValueAnswers)
Ok("Got previous answers and created session cookie with them")
.withSession("answers2" -> Json.prettyPrint(Json.toJson(answersModel)))
}
}
Run Code Online (Sandbox Code Playgroud)
希望这对你有所帮助.
干杯
Play仅支持会话字符串,因为它将所有会话状态存储在cookie中 - 这意味着Play节点可以扩展而无需任何类型的群集/状态共享技术.
如果您要存储的数据很小(小于2k),那么只需将其序列化为JSON,或者听起来就像您的情况一样,更简单的是将其序列化为逗号分隔的答案列表.
否则,您可以将其存储在缓存中,例如memcached或redis.