【问题标题】:Accessing servlet attributes using Expression Language使用表达式语言访问 servlet 属性
【发布时间】:2014-04-25 20:49:16
【问题描述】:

有两件事我很困惑.....

在我拥有的 servlet 类中:

    String name = "James Bond";
    Session.setAttribute("name", name);

为什么我读过的所有书的属性名和属性值都一样。我知道一个是字符串文字,一个是对象,但它必须相同吗?

我感到困惑的第二件事......假设我将 servlet 代码更改为

    String name = "James Bond";
    Session.setAttribute("hisname", name);

当我尝试使用 JSP 访问它时:

    ${sessionScope.name}

它工作正常。那么 Session.setAttribute() 中的第一个参数有什么意义呢?

【问题讨论】:

  • 名称和值不必相同。
  • 为什么我读过的所有书的属性名和属性值都一样,基本上是为了代码的可读性和维护目的。假设您通过所有应用程序将Dog 数据保存在一个名为login 的对象中,反之亦然,并且您必须对这个应用程序进行维护。如果你在一两页上工作,它不会那么痛苦......

标签: jsp servlets


【解决方案1】:

我的猜测,您仍然从会话中访问旧的“名称”,尝试使会话无效并且“名称”属性将被删除!

【讨论】:

    【解决方案2】:

    当您使用 setAttribute() 方法在作用域上存储数据时,第一个参数是您稍后将在 .jsp 中使用的名称。它可以是你想要的任何东西。第二个参数是要存储的对象,它将使用您在第一个参数中使用的名称进行访问。

    String name = "James Bond";
    request.setAttribute("007",name);
    

    然后在 .jsp 中你可以使用

    ${requestScope.007}
    

    EL表达式会按照这个顺序在所有范围内搜索007对象:

    1. 页面范围
    2. 请求范围
    3. 会话范围
    4. 应用范围

    您将数据存储在 Session 范围内,因此当您的会话处于活动状态时,您将拥有可用的数据。所以当你这样做时:

    String name = "James Bond";
    Session.setAttribute("name", name);
    

    然后将另一个属性存储在同一范围内(在同一会话中)

    String name = "James Bond";
    Session.setAttribute("hisname", name);
    

    访问第一个 ${sessionScope.name} 不会出现任何错误,因为您仍然可以使用它。尝试使用其他范围。

    【讨论】:

      【解决方案3】:

      名称和值不必相同。

      当您执行${sessionScope.name} 时,您仍然得到“詹姆斯邦德”。这一定是因为您在会话范围内仍然拥有您定义的“名称”属性。

      第二次改名字如下:

      String name = "James Bond";
      Session.setAttribute("name", name);
      String name = "The Bond";////////////////make this change. 
      Session.setAttribute("hisname", name);
      

      所以这次当你使用${sessionScope.name} 时,你会得到“詹姆斯邦德”而不是“邦德”。

      如果你这样做${sessionScope.hisname},你会得到“The Bond”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多