JFinal学习笔记

来源:互联网 发布:淘宝助理5.7.9.0下载 编辑:程序博客网 时间:2024/06/07 01:05

在论坛逛,偶然看到这个框架,抱着学习的态度准备探索一下。主要记录一些平时遇到的问题,以做随时查询。
1.问题:数据库查询到结果集后,传值到页面,页面无法用EL表达式取到值。

例如:我在页面用EL表达式${book.id},当查询后跳转到页面的时候会报错,无法找到”id“属性。

分析:用JFinal操作数据库,有两种方式,一种是创建与表对应的实体类并继承Model抽象类,定义一个static final 的dao对象,dao对象并不能用于承载数据,只是方便对数据库的查询操作。

public class Book extends Model<Book>{    /**     *      */    private static final long serialVersionUID = 1L;    public static final Book dao=new Book().dao();}

创建dao对象的过程

String sql="select * from book";

当我们使用dao对象的find(String sql)方法时,依次调用find(String sql,Object.. paras),find(Connection conn, String sql, Object… paras),此时已经执行了查询操作并获得了ResultSet结果集,继续调用ModelBuilder类的build(ResultSet rs, Class < ? extends Model> modelClass)方法封装结果集中的数据。

public static final <T> List<T> build(ResultSet rs, Class<? extends Model> modelClass) throws SQLException, InstantiationException, IllegalAccessException {        List<T> result = new ArrayList<T>();        //获取结果集中列的类型和属性。        ResultSetMetaData rsmd = rs.getMetaData();        //获取列的数量        int columnCount = rsmd.getColumnCount();        //至于这里为什么要+1,因为源码中的for循环都是从1开始的        String[] labelNames = new String[columnCount + 1];        int[] types = new int[columnCount + 1];        //这个方法中,表中的列名与类型已分别存入labelNames,types        buildLabelNamesAndTypes(rsmd, labelNames, types);        while (rs.next()) {            Model<?> ar = modelClass.newInstance();            Map<String, Object> attrs = ar.getAttrs();            //将根据数据类型的判断,将表中的数据装入对象的Map<String,Object>中            for (int i=1; i<=columnCount; i++) {                Object value;                if (types[i] < Types.BLOB)                    value = rs.getObject(i);                else if (types[i] == Types.CLOB)                    value = handleClob(rs.getClob(i));                else if (types[i] == Types.NCLOB)                    value = handleClob(rs.getNClob(i));                else if (types[i] == Types.BLOB)                    value = handleBlob(rs.getBlob(i));                else                    value = rs.getObject(i);                attrs.put(labelNames[i], value);            }            result.add((T)ar);        }        return result;    }

执行完上述代码后,查询到的结果被存放在一个Map < String,Object>中,也就是上述图例中的创建对象时设置的Map < String,Object>,数据不直接存放在对象中,这也就是为什么我们用${book.id}拿不到值的原因了。
解决办法:在实体类Book中重写Model类get(String)方法。

@Override    public <T> T get(String attr) {        return super.get(attr);    }
0 0