JSP 在< Record>jOOQ的结果中循环< c:forEach>

nhhxz33t  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(126)

有没有办法在<c:forEach>中从jOOQ循环通过Result<Record>
下面是getter方法:

public Vector<Map<String, String>> getUsers() {
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL);
    Result<Record> results = sql.select().from("users").fetch();

    Vector<Map<String, String>> v = new Vector<Map<String, String>>();
    for(Record item: results) {
        Map<String, String> m = new HashMap<String, String>();
        m.put("login", item.getValueAsString("login"));
        // other columns
        v.add(m);
    }
    return v;
}

以下是视图:

<c:forEach var="u" items="${users}">
   ${u.login} <br />
</c:forEach>

有没有办法让我的getter方法更简单,比如:

public Result<Record> getUsers() {
    Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL);
    reutrn sql.select().from("users").fetch();
}

但是正如前面提到的,我不知道如何在<c:forEach>中循环通过它,或者这是不可能的?

afdcj2ne

afdcj2ne1#

看起来您希望像操作Map一样操作记录。下面是使用jOOQ实现这一点的方法:

public List<Map<String, Object>> getUsers() {
    DSLContext sql = DSL.using(Database.getInstance().connect(), SQLDialect.MYSQL);
  return sql.select().from("users").fetchMaps();
}

请参阅此处的相关Javadoc:

  • ResultQuery.fetchMaps()
  • Result.intoMaps()
  • Record.intoMap()
jbose2ul

jbose2ul2#

public List<String> getUsers() {
  Factory sql = new Factory(Database.getInstance().connect(), SQLDialect.MYSQL);
  Result<Record> results = sql.select().from("users").fetch();

  return results.getValues(loginFieldIndex);
}

然后将返回的List放在请求属性(例如属性名称“users”)和jsp:

<c:forEach var="u" items="${users}">
  ${u} <br />
</c:forEach>
tpgth1q7

tpgth1q73#

这是Google对“jooq jsp”的最佳答案,因此(经过一些实验)这是另一种将JOOQ与JSP结合的方法,同时保留了JOOQ的类型安全和性能。

<%@ page isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page import="static com.example.jooq.tables.TblCats.*" %>
<%@ page import="org.jooq.Result, org.jooq.Record" %>

<h2>Length: ${fn:length(cats)}</h2>

<c:forEach var="cat" items="${cats}">
 <% Record cat = (Record) pageContext.getAttribute("cat"); %>

 <%= cat.getValue(TBL_CATS.TITLE) %>,
 <%= cat.getValue(TBL_CATS.POSITION) %>

 <br>

</c:forEach>
brccelvz

brccelvz4#

如果您经常将JOOQ与JSP一起使用,那么添加一个能够理解RecordELResolver是值得的。
下面是一个简单的实现:https://gist.github.com/dbichko/074641915157ac21996c
然后您需要将其注册到JSP引擎中。在ServletContextListener中是一个很好的位置:

public void contextInitialized(ServletContextEvent sce) {
    ServletContext ctx = sce.getServletContext();
    JspFactory.getDefaultFactory()
        .getJspApplicationContext(ctx).addELResolver(new RecordResolver());
}

这样,您就可以将记录字段用作属性:

<c:forEach var="user" items="${users}">
  ${user.login} <br />
</c:forEach>
5ssjco0h

5ssjco0h5#

我会使用一个ORM库,比如Hibernate,这样您只需遍历一个普通的对象列表。
如果你只是在做JDBC操作的话,它可能看起来有点沉重,但是看起来你已经达到了它对你有用的地方。

@Entity
@Table(name = "users")
class User {
    private String login;
    ...
}

然后像这样的DAO类...

public List<Users> getUsers() {
    return (List<Users>)sessionFactory.getCurrentSession().createQuery("from Users").list();
}

显然,将Hibernate引入您的项目需要进行大量的设置,但我认为好处远远超过了这些。
编辑:我不认为JOOQ可以做ORM,但它似乎有一个行Map系统。如果你想坚持使用JOOQ,试着创建一个RecordHandler并使用fetchInto()方法。

相关问题