2

我需要使用 servlet 来验证登录名/密码。那已经很好了。

我在 DAO 类中有一个方法,它通过 prepareStatement 返回值的结果集列表。

我正在使用一个带有 where 子句(按用户名)的过滤结果的查询。

问题是:如何获取 servlet 参数(登录用户的名称)并将其设置在 prepareStatement 上?

代码如下:

public class DaoPojoJoin extends Dao {

public List<PojoJoin> listUserDegrees() {
    List<PojoJoin> dg = new ArrayList<PojoJoin>();
    if (openConnection()) {
        try {
            st = cn.prepareStatement("SELECT USER, MATTER, DEGREE FROM DEGREES x "
                    + "right outer join USERS y on x.idUser=y.idUser "
                    + "right outer join MATTER z on idMatter=z.idMatter "
                    + "where x.iduser=?"); // filter result by user's name

            // How can I have something like this:
            // st.setString(1,usr.request.getParameter("user"));

            // or this:
            // st.setString(1,.getAttribute(user));

            rs = st.executeQuery();
            while (rs.next()) {
                PojoJoin pj = new PojoJoin();
                rs.getString("USER"); 
                rs.getString("MATTER");
                rs.getDouble("DEGREE");
                pj.setUsuario(rs.getString("USER"));
                pj.setDisciplina(rs.getString("MATTER"));
                pj.setNota(rs.getDouble("DEGREE"));
                nota.add(pj);
            }
        } catch (Exception ex) {
            err = ex.getMessage();
        } finally {
            closeConnection();
        }
    }
    return dg;
}

}

提前致谢。

4

1 回答 1

0

要求它作为方法参数。DAO 不应该关心它所在的上下文,并且应该可以在其他任何地方重用(例如,不使用 servlet 的普通 Java 应用程序)。

就这样

public List<PojoJoin> listUserDegrees(String username) {
    // ...
}

或者

public List<PojoJoin> listUserDegrees(Long userId) {
    // ...
}

或者

public List<PojoJoin> listUserDegrees(User user) {
    // ...
}

最后让调用者(servlet)把它传入。


与具体问题无关,您的数据库资源处理似乎不是线程安全的。每当您的 webapp 开始被多个用户使用时,我都会努力避免出现严重问题。

于 2012-05-28T00:05:59.017 回答