没有从jsp中的pageContext对象获取属性

时间:2017-07-19 07:00:40

标签: java jsp servlets

我没有从jsp中的pageContext对象获取属性,代码:

<%

    String username =request.getParameter("name");
    if(username!=null){
        //session.setAttribute("sessionUsername", username);
        //application.setAttribute("appUsername", username);
        pageContext.setAttribute( "requestParams",username );
        pageContext.setAttribute("requestScope", username, PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("sessionScope", username, PageContext.SESSION_SCOPE);
        pageContext.setAttribute("applicationScope", username, PageContext.APPLICATION_SCOPE);
    }
    /* String sessionName =(String)session.getAttribute("sessionUsername");

    String applicaString = (String)application.getAttribute("appUsername");
     */
    %>
<%-- <br>
the name is : <%=username%>
<br>
the session name is : <%=sessionName%>
<br>
the application name is : <%=applicaString%>
 --%>
<br>
the request Scope  name is : <%=pageContext.getAttribute("requestScope")%>

<br>
the sessionScope name is : <%=pageContext.getAttribute("sessionScope")%>

<br>
the appication Scope name is : <%=pageContext.getAttribute("applicationScope")%>

<br>
the page Scope name is : <%=pageContext.getAttribute("requestParams")%>

我在应用程序范围和请求范围内变为null,但是当我使用具有默认页面范围的setAttribute方法时,这工作正常。

2 个答案:

答案 0 :(得分:0)

尝试将代码更改为:

<%

    String username =request.getParameter("name");
    if(username!=null){
        //session.setAttribute("sessionUsername", username);
        //application.setAttribute("appUsername", username);
        pageContext.setAttribute( "requestParams",username );
        pageContext.setAttribute("requestScope", username, PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("sessionScope", username, PageContext.SESSION_SCOPE);
        pageContext.setAttribute("applicationScope", username, PageContext.APPLICATION_SCOPE);
    }
    /* String sessionName =(String)session.getAttribute("sessionUsername");

    String applicaString = (String)application.getAttribute("appUsername");
     */
    %>
<%-- <br>
the name is : <%=username%>
<br>
the session name is : <%=sessionName%>
<br>
the application name is : <%=applicaString%>
 --%>
<br>
the request Scope  name is : <%=request.getAttribute("requestScope")%>

<br>
the sessionScope name is : <%=session.getAttribute("sessionScope")%>

<br>
the appication Scope name is : <%=application.getAttribute("applicationScope")%>

<br>
the page Scope name is : <%=pageContext.getAttribute("requestParams")%>

我改变了以下三行代码:

the request Scope  name is : <%=pageContext.getAttribute("requestScope")%>
the sessionScope name is : <%=pageContext.getAttribute("sessionScope")%>
the appication Scope name is : <%=pageContext.getAttribute("applicationScope")%>

为:

the request Scope  name is : <%=request.getAttribute("requestScope")%>
the sessionScope name is : <%=session.getAttribute("sessionScope")%>
the appication Scope name is : <%=application.getAttribute("applicationScope")%>

答案 1 :(得分:0)

包含<。> 运算符的字符串键用于映射键和对象属性访问。

pageContext.setAttribute(“ my_namespace.VAR_NAME”,VAR_NAME); 将字符串解析为单个令牌。但是检索将不起作用,因为: items =“ $ {my_namespace.VAR_NAME}” 正在将其解析为具有属性“ VAR_NAME”的对象“ my_namespace”。

因此,您不能动态分配键名的名称空间。 :(

作品

MY_MAP.put("MY_VAR_NAME",(Object)MY_VAR_NAME);
pageContext.setAttribute("MY_MAP",MY_MAP); 
items="${MY_MAP.MY_VAR_NAME}"

失败

pageContext.setAttribute("my_namespace.MY_VAR_NAME", MY_VAR_NAME );
items="${my_namespace.MY_VAR_NAME}"

工作原理,但使用Unicode汉字而不是Unicode的HACK。 :

pageContext.setAttribute("my_namespace丶MY_VAR_NAME");
items="${my_namespace丶MY_VAR_NAME}"

最好对名称空间进行命名以避免混淆:

不清楚:


pageContext.setAttribute("AMBIGIOUS_02",AMBIGIOUS_01 );
items="${AMBIGIOUS_02}"

清除,但不起作用:


pageContext.setAttribute("DOES_NOT_WORK.MyVar",MyVar );
items="${DOES_NOT_WORK.MyVar}"

完整的代码上下文:

<%@ page contentType="text/html; charset=UTF-8" %>
<!--meta tag used to be safe on older browsers.-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map"     %>

<%
    String[] MY_VAR_NAME = {"C01","C02","C03"};

    Map<String,Object> MY_MAP =(
    new HashMap<String,Object>());

    pageContext.setAttribute(
        "my_namespace.MY_VAR_NAME",MY_VAR_NAME
    );

    MY_MAP.put("MY_VAR_NAME",(Object)MY_VAR_NAME);
    pageContext.setAttribute("MY_MAP",(Object)MY_MAP);
%>

<html lang="en">
<head>
    <title> ForEachSimpleTest </title>
</head>
<body>
    FOR_EACH_STARTS_HERE
    <c:forEach 
        var="current_item" 
        items="${MY_MAP.MY_VAR_NAME}"
    >
        ${current_item} <br/>
    </c:forEach>
    FOR_EACH_ENDS_HERE
</body>
</html>

我尝试过的其他操作:


密钥:

  • SF:静默失败:
  • IV:表达式无效
  • LIT:不会失败,但不会失败。
  • ESE:期望符号相等
  • QSE:应使用引号

SF: items="#{my_namespace.MY_VAR_NAME}"
SF: items="${my_namespace.MY_VAR_NAME}"

SF: items="${my_namespace.MY_VAR_NAME}"
SF: items="#{my_namespace.MY_VAR_NAME}"

SF: items='${my_namespace[MY_VAR_NAME]}'
SF: items='#{my_namespace[MY_VAR_NAME]}'

SF: items="${param['my_namespace.MY_VAR_NAME']}"
SF: items="#{param['my_namespace.MY_VAR_NAME']}"

SF: items="${param['sessionScope.MY_VAR_NAME']}"
SF: items="#{param['sessionScope.MY_VAR_NAME']}"

SF: items="${param[my_namespace.MY_VAR_NAME]}"
SF: items="#{param[my_namespace.MY_VAR_NAME]}"

SF: items="${sessionScope.MY_VAR_NAME}"
SF: items="#{sessionScope.MY_VAR_NAME}"

SF: items='${my_namespace["MY_VAR_NAME"]}'
SF: items='#{my_namespace["MY_VAR_NAME"]}'

IV : items="${${param['my_namespace.MY_VAR_NAME']}}"
ESE: items="${'#{param["my_namespace.MY_VAR_NAME"]}'}"

QSE: items=${my_namespace["MY_VAR_NAME"]}
QSE: items=#{my_namespace["MY_VAR_NAME"]}

LIT: items="${'my_namespace.MY_VAR_NAME'}"

也值得一提:

  

保留字:以下字保留给EL和   不应用作标识符:

     
      
  1.   
  2.   
  3. 不是
  4.   
  5. eq
  6.   
  7. ne
  8.   
  9. lt
  10.   
  11. gt
  12.   
  13. le
  14.   
  15. ge
  16.   
  17. true
  18.   
  19. false
  20.   
  21.   
  22. instanceof
  23.   
  24.   
  25. div
  26.   
  27. mod
  28.   

来源: https://docs.oracle.com/cd/E19798-01/821-1841/gjddd/index.html

$ {}与#{}

  

那些立即求值的表达式使用$ {}语法。   推迟计算的表达式使用#{}语法。

来源: https://docs.oracle.com/cd/E19226-01/820-7627/gjddd/

已使用堆栈:

  • 记事本++
  • 行家
  • Tomcat 9
  • Heroku