集合:private list<map<String,String>> list;
//getter&setter
.......
map 存储有一个字段 name页面遍历: 
<c:foreach item="${list}" var="item">
    ${item.name}
</c:foreach>这样居然也能输出map.get("name")的值item.name不是默认调用item.getName();这个方法在struts2中咋就这么智能呢?它能自动识别调用哪个啊?高手们请解释下什么原因吧!!

解决方案 »

  1.   

    数据底层是这样封装的,一个map就相当于一行数据。
    ui层直接遍历 list<map>  并没封装到实体类。。 public List<Map<String,String>> query(String sql) throws SQLException {
    List<Map<String,String>> result = new ArrayList<Map<String,String>>();
    Connection conn = getConnection();
    Statement stmt=null;
    ResultSet rs=null;
    try {
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    // 数据库的行循环
    while (rs.next()) {
    ResultSetMetaData meta = rs.getMetaData();
    Map<String, String> coloum = new HashMap<String, String>();
    // 当前行的列循环
    for (int i = 1; i <= meta.getColumnCount(); i++) {
    coloum.put(meta.getColumnName(i), rs.getString(i));// 注意:这边的index
    //coloum.put(meta.getColumnName(i).toLowerCase(), rs.getString(i));
    // 必须从1开始
    }
    result.add(coloum);
    }
    } finally {
    close(conn, stmt, rs);
    }
    return result;
    }
      

  2.   

    <c:foreach item="${list}" var="item">
      ${item.name}
    </c:foreach>我咋看这像是 JSTL 的标签?还能让你更奇怪的,这样也行!<c:foreach item="${list}" var="item">
      ${item['name']}
    </c:foreach>
      

  3.   

    楼上说得对啊
    <c:foreach item="${list}" var="item">
      ${item.name}
    </c:foreach>
    是jstl的标签
    struts2迭代标签是
    <s:iterator></s:iterator>
    不过这个标签可以迭代map。只要是实现了iterator的类都可以迭代。
      

  4.   

    JSTL感觉在Struts2里用的不多,Struts2标签+OGNL就已经很强大了。
      

  5.   

    楼主的例子如果是用在JSP上的话, 不是struts2的功劳, 是EL的功劳.
      

  6.   


    是哦..这里是jstl标签哦...
      

  7.   

    我也记得struts2里面的迭代用
    <s:iterator></s:iterator>很喜欢ognl表达式
      

  8.   

    如果action中有多个返回list的方法呢? struts2能输出要的结果吗? 
    <c:foreach item="result" var="item">
      ${item.name}
    </c:foreach>
    用s标签亦如此。
      

  9.   

    一般很少用struts的这些东西 呵呵
      

  10.   

    ${ }分明就是EL标签,上面的用法很常用,也是EL标签最实用的地方,跟struts2无关。