JSTL使用的是公式语言(EL)的表示方法。为什么上面的代码中在用c:out输出时直接:users.userName就可以了呢?
答:users是一个TestBean对象,它有一个属性叫:userName,还有两个方法叫getUserName()和setUserName()。这样的命名规范符合javabean的命名规范,这个东东是强制的。必须这样做。然后jstl会使用java的反射机制调用getUserName()这个TestBean的方法。于是在JSP面页里的写法就会像你看到的<c:out value="${users.userName}"/>

解决方案 »

  1.   

    这样吧,我描述一下这个TestBeanpublic class TestBean{
      private String userName=null;  public void setUserName(String value){
        this.userName=value;
      }  public String getUserName(){
        return this.userName();
      }  ......
    }
      

  2.   

    不是啊users一个Collection对象啊
      

  3.   

    <c:forEach var="users" items="${users}">注意,右边的users是一个collection,左边的users是collection中的每一个对象。也就是说这句应该这样写:
    <c:forEach var="user" items="${users}">  user是testbean对象
      

  4.   

    EL语言可以从Collection取出数据,这很正常,你看一下jsp2的规范
      

  5.   

    可以这样的话写成var="users" 不是应该不对吗?怎么执行结果对呢?
      

  6.   

    应该这样写,否则让人有误解<c:forEach var="user" items="${users}">
      <tr>
      <td><c:out value="${user.userName}"/></td>
      <td><c:out value="${user.password}"/></td>
      <td><c:out value="${user.age}"/></td>
      </tr>
    </c:forEach>
      

  7.   

    多谢BillyW(阿弥陀佛) !
    这样写我就明白了,马上接贴。
    能再给我解释一下:为什么写成var=  "users  "  执行结果还对呢?
      

  8.   

    <c:forEach var="users" items="${users}">这样写不是不行,而是容易产生误解,以为users和users是一个东东。学过英语的人都会明白users是user的复数形式