在页面中做了如下定义:
<%
String str= "hello";
pageContext.setAttribute("test", str);
%>
为什么用<c:out value="${test}" />能把值显示出来,
而用<c:out value="${str}" />就出问题了,
pageContext.setAttribute("test", str);到底做了什么,el表达式到底从哪里读的值啊
<%
String str= "hello";
pageContext.setAttribute("test", str);
%>
为什么用<c:out value="${test}" />能把值显示出来,
而用<c:out value="${str}" />就出问题了,
pageContext.setAttribute("test", str);到底做了什么,el表达式到底从哪里读的值啊
键值对啊,前面是键,后面是值.
将test定义到什么地方了,为什么String str= "hello"定义的EL表达式读不出来呢?
String str= "hello";
pageContext.setAttribute("test", str);
%> String str= "hello"; 这句只是定义了一个变量,没有将它取入任务以一个标准范围内
pageContext.setAttribute("test", str); 这句是将STR这个变量的值存入了当前页面pageContext中,所以用EL表达式${test}可以取出来,而<c:out value="${str}" />就取不出来,因为pageContext中根本没有存入str这个键。
如果EL表达式中包含变量名不对应EL隐含对象的标识符,则EL引擎将调用PageContext.findAttribute()方法在各个域中查找该变量名对应的属性值,
这是书上原话 以前看书的时候没注意
而在scriplet中pageContext.setAttribute("test", str);与之等价。String str= "hello";
不属于jstl的域,所以用cout 取不到。
而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}