Session 在Scala中存储会话变量

Session 在Scala中存储会话变量,session,scala,variables,lift,Session,Scala,Variables,Lift,我试图存储一个会话变量,然后使用它修改Boot.scala中的菜单。以下是如何将变量存储在代码段中: object sessionUserType extends SessionVar[String](null) def list (xhtml : NodeSeq) : NodeSeq = { Helpers.bind("sendTo", xhtml, "provider" -> SHtml.link("/providerlogin",(

我试图存储一个会话变量,然后使用它修改Boot.scala中的菜单。以下是如何将变量存储在代码段中:

object sessionUserType extends  SessionVar[String](null)
  def list (xhtml : NodeSeq) : NodeSeq = {

    Helpers.bind("sendTo", xhtml, 
                 "provider" -> SHtml.link("/providerlogin",() => sessionUserType("provider"), Text("Provider")),
                 "student" -> SHtml.link("/studentlogin",() => sessionUserType("student"), Text("Student")))
    }
然后在Boot.scala中执行以下操作:

val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
            "not a student session") 
我还尝试按名称调用对象(sessionUserType),但它永远找不到它,因此我认为这可能会起作用,但当我访问它时,我一直会得到一个空框,即使实际的绑定和函数在菜单呈现之前执行

任何帮助都将不胜感激


谢谢

为了从
SessionVar
RequestVar
中获取值,调用
is
方法,即
sessionUserType.is

顺便问一下,你读过“”吗

旁注 我相信
RequestVar
更适合您的情况。我不确定我是否能在没有上下文的情况下正确地捕获您的代码,但它至少可以重写如下:

case class LoginType
case object StudentLogin extends LoginType
case object ProviderLogin extends LoginType

object loginType extends RequestVar[Box[LoginType]](Empty)
// RequestVar is a storage with request-level scope

...
"provider" -> SHtml.link("/providerlogin",() => loginType(Full(ProviderLogin)), Text("Provider")),
// `SHtml.link` works in this way. Your closure will be called after a user
// transition, that is when /providerlogin is loading.
...

val studentSessionType = If(() => { loginType.is map {_ == StudentLogin} openOr false },
                "not a student session")
// As a result, this test will be true if our RequestVar holds StudentLogin,
// but it will be so for one page only (/studentlogin I guess). If you want
// scope to be session-wide, use SessionVar

我认为脱节之处在于,您假设a Session属性将匹配您的SessionVar,而事实并非如此。Lift是一个非常好的框架,如果它的特点是Lift创建不透明的guid来引用平台上的组件,那么它就是一个框架 服务器端


如果希望
getSessionAttribute
返回一些内容,请考虑如何调用
setSessionAttribute

Alexander-谢谢。不幸的是,我认为我需要使用SessionVar,因为我将在整个用户会话中根据用户类型相应地修改菜单和视图。我遇到的问题是,当我尝试访问SessionVar(比如Boot.scala中的StudentLogin)时,编译器找不到它。这就是为什么我首先使用S对象的原因。是否有一些技巧(除了导入我尝试过的类之外)来获取SessionVar,它位于snippets.LoginType(例如)的Boot.scala范围内?谢谢,我想我拿到了。对象需要位于代码段的类定义之外。谢谢是的,Lift会创建代码段实例,因此在snippet类中声明的任何对象都将在代码段实例存在的时间内存在,这不是会话作用域存储所需的时间。是否存在声明所有会话变量的默认位置?比如Boot.scala?如果是这样,其他代码段、模型等是否可以通过调用VariableName来访问它们…?如果合适,您可以在顶层(包)或对象中声明它们