【问题标题】:attribute with same name but different scopes can be overridden or maintained?可以覆盖或维护具有相同名称但不同范围的属性?
【发布时间】:2015-09-26 08:53:39
【问题描述】:

在 JSP 中,如果添加两个具有相同名称但范围不同的属性会发生什么。当我尝试此代码时,我将页面范围属性值设为空,而会话范围值与我存储的一样。

   <%  pageContext.setAttribute("kumar", "MCA", PageContext.PAGE_SCOPE);
      pageContext.setAttribute("kumar", "BSc", PageContext.SESSION_SCOPE);
    %>

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    我测试了这段代码,发现了预期的结果。

    <% 
    pageContext.setAttribute("kumar", "MCA", PageContext.PAGE_SCOPE);
    pageContext.setAttribute("kumar", "BSc", PageContext.SESSION_SCOPE); 
    pageContext.setAttribute("kumar", "Inter", PageContext.APPLICATION_SCOPE); 
    %>
     attribute in page scope:       <%=pageContext.getAttribute("kumar", PageContext.PAGE_SCOPE)%>
     attribute in session scope:    <%=pageContext.getAttribute("kumar", PageContext.SESSION_SCOPE)%>
     again attribute in application scope: <%=pageContext.getAttribute("kumar",PageContext.APPLICATION_SCOPE)%>
    

    输出

    attribute in page scope: MCA 
    attribute in session scope: BSc 
    again attribute in application scope: Inter 
    

    每个范围都是不同的。正如在 cmets 中已经指定的那样,在高级范围和低级范围中没有这样的东西覆盖。为了更好地理解,请参阅 org.apache.jasper.runtime.PageContextImpl 中 getAttribute 方法的具体实现

     private Object doGetAttribute(String name, int scope) {
             switch (scope) {
             case PAGE_SCOPE:
                 return attributes.get(name);
    
             case REQUEST_SCOPE:
                 return request.getAttribute(name);
    
             case SESSION_SCOPE:
                 if (session == null) {
                     throw new IllegalStateException(Localizer
                             .getMessage("jsp.error.page.noSession"));
                 }
                 return session.getAttribute(name);
    
              case APPLICATION_SCOPE:
                 return context.getAttribute(name);
    
             default:
                 throw new IllegalArgumentException("Invalid scope");
             }
         }
    

    另见

    【讨论】:

      【解决方案2】:

      如果它们在相同的范围内,可以覆盖具有相同名称的属性。调用这些属性时可以看到区别如下:

        attribute in page scope:       <%=pageContext.getAttribute("kumar", PageContext.PAGE_SCOPE)%>
        attribute in session scope:    <%=pageContext.getAttribute("kumar", PageContext.SESSION_SCOPE)%>
        again attribute in page scope: <%=pageContext.getAttribute("kumar")%>
      

      【讨论】:

      • 我添加了一个具有相同名称的应用程序范围的属性,例如 pageContext.setAttribute("kumar", "Inter", PageContext.APPLICATION_SCOPE);但是这个属性没有覆盖它的任何低级范围属性,只有页面范围属性被会话范围覆盖。怎么可能。
      • 不,没有这样的事情可以在具有相同名称的更高范围的低级范围中覆盖属性。即使您从 application_scope 中删除属性,它也不会影响较低的范围。 Jsp允许你在不同的范围内拥有同名的属性。
      • 没有老板,我确信正如最后的评论所说,当打印所有 3 个属性值时,页面上下文属性值为 null,剩下的 2 个是正确的。如我所说,请测试一次。这是我的示例代码。
      • pageContext.setAttribute("kumar", "BSc", pageContext.SESSION_SCOPE); pageContext.setAttribute("kumar", "MCA", PageContext.PAGE_SCOPE); pageContext.setAttribute("kumar", "Inter", PageContext.APPLICATION_SCOPE);
      • String bsc = String.valueOf(pageContext.getAttribute("kumar", PageContext.SESSION_SCOPE)); String mca = String.valueOf(pageContext.getAttribute("kumar", PageContext.PAGE_SCOPE)); String inter = String.valueOf(pageContext.getAttribute("kumar", PageContext.APPLICATION_SCOPE))
      猜你喜欢
      • 2019-04-23
      • 2015-04-09
      • 2012-04-14
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      相关资源
      最近更新 更多