JSF - сформировать в бине HtmlDataTable

Потратил некоторое продолжительное время на поиск решения ... Java мир domain objects не изобилует примерами по работе с ResultSet/RowSet, и после Delphi часто приходится тратить много времени на изучение как это может быть сделано. Литературы по JSF на русском языке тоже нету. Рабочее решение найдено в примерах Shale Framework и немного изменено для своих потребностей.
На самом деле примеров много, но они очень конкретные, что означает много лишней работы. Для того чтобы отобразить выборку предлагается создать объекты Domain, Dao и конкретную страницу для конкретной выборки. Часто же подобные страницы выборок не отличаются друг от друга. Зачем делать лишнюю работу!?

-------------------------------
"Dao" для получения RowSet:
-------------------------------
public class RowSetDao {
static public RowSet getRowSet(String sqlText, Object[] params) {
CachedRowSet rowSet = null;
try {
rowSet = new CachedRowSetImpl();
rowSet.setDataSourceName("java:/comp/env/jdbc/Dk");
rowSet.setCommand(sqlText);
if (params != null) {
for (int i = 0; i < params.length; i++) {
rowSet.setObject(i + 1, params[i]);
}
}
rowSet.execute();
} catch (SQLException e) {
e.printStackTrace();
}
return rowSet;
}
}

BackingBean

import edu.nvoynov.jsf.dao.RowSetDao;

public class SelectBean {
private RowSet rowSet = null;
private boolean completed = false;
private String sqlText = null;
private HtmlDataTable results = new HtmlDataTable();
private ResultSetDataModel resultSetDataModel = null;

public String execute() {
prerender();
return "result";
}

public void prerender() {
if (sqlText == null) return;
if (sqlText.equals("")) return;

FacesContext context = FacesContext.getCurrentInstance();
try {
rowSet = RowSetDao.getRowSet(sqlText, null);

ResultSetMetaData rsmd = rowSet.getMetaData();
resultSetDataModel = new ResultSetDataModel(rowSet);
results.setFirst(0);

List <Object> children = results.getChildren();
children.clear();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
UIColumn column = new UIColumn();
column.setId("column" + i);
children.add(column);
HtmlOutputText header = new HtmlOutputText();
String label = rsmd.getColumnLabel(i);
if ((label == null) || (label.length() < 1)) {
label = rsmd.getColumnName(i);
}
header.setValue(label);
column.setHeader(header);
HtmlOutputText data = new HtmlOutputText();
data.setId("data" + i);
data.setValueBinding("value", context.getApplication()
.createValueBinding(
"#{current['" + rsmd.getColumnName(i) + "']}"));
column.getChildren().add(data);
}
completed = true;
} catch (Exception e) {
context.addMessage(null, new FacesMessage(
"Exception executing this query: " + e));
while (e != null) {
context.getExternalContext().log(
"Exception executing this query", e);
if (e instanceof SQLException) {
e = ((SQLException) e).getNextException();
} else {
e = null;
}
}
setCompleted(false);
}
}

public void destroy() {
if (rowSet != null) {
try {
rowSet.close();
} catch (SQLException e) {
}
}
}
}

И наконец объявление таблицы в странице

<h:dataTable id="results" binding="#{selectBean.results}"
rendered="#{selectBean.completed}"
value="#{selectBean.resultSetDataModel}" var="current" />

Довольно просто все на самом деле оказалось. Теперь можно быстро sql-выборки без Dao/Domain объектов, где единственный параметр это сиквел! На основе этого бина можно сделать шаблон таблицы для любых страниц выборок, декорировать по желанию CRUD операциями и стандартными стилями.

PS. Форматирование кода это ужас. Как с этим справляться?

 

Решили перепланировать внутреннее пространство квартиры с целью создания уникального дизайна комнат? В этом деле вам поможет гипсокартон - универсальный материал для быстрого возведения стен и монтажа подвесных потолков.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • OLTP первые проблемы
  • Интересная штука- индексируемые свойства С# и Pascal(Delphi)
  • Сказки Java and Web-services
  • Оставить комментарий