在页面中做了如下定义:
<%
String str= "hello";
pageContext.setAttribute("test", str);
%>
为什么用<c:out value="${test}" />能把值显示出来,
而用<c:out value="${str}" />就出问题了,
pageContext.setAttribute("test", str);到底做了什么,el表达式到底从哪里读的值啊

解决方案 »

  1.   

    pageContext.setAttribute("test", str); 
    键值对啊,前面是键,后面是值.
      

  2.   

    pageContext.setAttribute("test", str);
    将test定义到什么地方了,为什么String str= "hello"定义的EL表达式读不出来呢?
      

  3.   

    我个人的理解就是一个map .有请高手解答.
      

  4.   

    EL表达式是从标准范围内(page,request,session,application)<% 
    String str= "hello"; 
    pageContext.setAttribute("test", str); 
    %> String str= "hello"; 这句只是定义了一个变量,没有将它取入任务以一个标准范围内
    pageContext.setAttribute("test", str); 这句是将STR这个变量的值存入了当前页面pageContext中,所以用EL表达式${test}可以取出来,而<c:out value="${str}" />就取不出来,因为pageContext中根本没有存入str这个键。
      

  5.   

    哈哈 偶也是刚搞清楚这个
    如果EL表达式中包含变量名不对应EL隐含对象的标识符,则EL引擎将调用PageContext.findAttribute()方法在各个域中查找该变量名对应的属性值,
    这是书上原话 以前看书的时候没注意 
      

  6.   

    严格的讲这应该叫jstl的问题,jstl中只有一种给变量赋值的方式:<c:set var = "str" value = "test"/>
    而在scriplet中pageContext.setAttribute("test", str);与之等价。String str= "hello"; 
    不属于jstl的域,所以用cout 取不到。
      

  7.   

    这是变量的作用域问题,scriplet的变量,如果没有保存到隐式对象中的话,只能在scriplet中调用
    而EL表达式则是像4楼说的那样,他的取值范围是page,request,session,application这样的顺序由小到大取值的,而你在定义的str又不是这些范围之内的变量,所以取不到LZ可以试试下面这4种方式,就可以明白了<%
    String str= "hello"; 
    pageContext.setAttribute("test", str); 
    %> 
    <c:out value="${test}" /><c:out value="<%=str%>" /><c:out value="${str}" />${str}