séparation vue et couche d'accès aux données
Bsr à tous!
La question que je m'en vais vous poser a déjà été posée dans un autre sujet de discussion (par moi d'ailleurs). Mais vu qu'elle était au millieu d'autres questions, je prefere créer une nvelle discussion dédiée.
Pour être bref, je voudrais pouvoir séparer proprement le code de ma vue de celui de mes accès à la base de données, sans pour autant utiliser des solutions du type hibernate.
Je dispose en effet d'une vue qui contient une tableviewer dans la quelle j'affiche des données provenant d'une base de données. Pour l'instant, malgré le fait que je dispose de classes me permettant de gerer ma base de données, j'effectue mon acces a la base de données ainsi que ma reqûete dans le code de ma vue (méthode createPartControl). Sachant qu' à terme, - cette vue sera composée de plusieurs onglets, avec pour chaque onglet un
tableviewer me permettant d'afficher des données de requêtes différentes;
- je disposerais d'une autre vue qui afficherais des données dépendament de la même requête,
Je pense qu'il est plus propre de séparer complement ma vue de mes données (modèle MVC?) de telle sorte que, dans le main de mon appli, j'instancie ma connexion (qui est un singleton), jeffectue mes requetes, et jne passe que les résultats pour la construction de mes vues.
Mais seulement, dans la pratique, jne sais pas si faire ainsi est une bonne idée, s'il ya une solution meuilleure et plus facile à mettre en oeuvre.
Le code source de ma vue est le suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
public class View extends ViewPart {
public static final String ID = "simpleExplorer.view";
private TableViewer viewer;
private TblRowFilter filter;
private TableSorter tableSorter;
private DbBean myDbBean;
private ProcStock myProcStock;
/**
* Méthode permettant de définir le contenu de la vue
*/
public void createPartControl(Composite parent) {
ResultSet rs = null;
myProcStock = new ProcStock("rep_getAnnouncePendingAcknowledgement");
// ouverture de la connexion
try {
myDbBean = new DbBean();
myDbBean.connect();
} catch (Exception e) {
e.printStackTrace();
}
// on récupère le résulSset
try {
rs = myDbBean.executeProc(myProcStock.getName());
} catch (SQLException e) {
System.out.println("Erreur lors de l'éxécution de la requête");
} catch (Exception e) {
e.printStackTrace();
}
GridLayout layout = new GridLayout(2, false);
parent.setLayout(layout);
Label searchLabel = new Label(parent, SWT.NONE);
searchLabel.setText("Search: ");
final Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH);
searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
| GridData.HORIZONTAL_ALIGN_FILL));
searchText.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
filter.setSearchText(searchText.getText());
viewer.refresh();
}
});
createTableViewer(parent, rs);
// on ferme les connexions
try {
rs.close();
myDbBean.disConnect();
} catch (SQLException e) {
System.out.println("Erreur lors de la fermeture de la connexion");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* cette méthode permet de créer un tableViewer
* @param parent
* @param resultset
*/
private void createTableViewer(final Composite parent, final ResultSet resultset){
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
createColumns(viewer, resultset);
viewer.setContentProvider(new TblRowContentProvider());
viewer.setLabelProvider(new TblRowLabelProvider());
viewer.setInput(ModelProvider.getInstance().getTblRows());
getSite().setSelectionProvider(viewer);
tableSorter = new TableSorter();
viewer.setSorter(tableSorter);
filter = new TblRowFilter();
viewer.addFilter(filter);
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalSpan = 2;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
viewer.getControl().setLayoutData(gridData);
}
/**
* les colonnes sont crées avec des noms vennant de la base de données
* @param viewer
*/
private void createColumns(final TableViewer viewer, ResultSet resultset) {
Table table = viewer.getTable();
String[] titles = null;
String[] types = null;
ResultSetMetaData metaData = null;
int colCount = 0;
// à gérer dynamiquement
int[] bounds = { 100, 100, 100, 100, 100, 100, 100, 100, 100 };
/*Récupération des info métadata sur la table. Penser à le faire plus dynamiquement*/
try {
metaData = resultset.getMetaData();
colCount = metaData.getColumnCount();
int j = 0;
titles = new String[colCount];
types = new String[colCount];
//Remplissage de titles
for (j = 0 ; j < colCount ; j++){
titles[j] = metaData.getColumnName(j+1);
types[j] = metaData.getColumnTypeName(j+1);
}
}
catch (Exception e) {
System.err.println(e);
}
for (int i = 0; i < titles.length; i++) {
final int index = i;
final TableViewerColumn viewerColumn = new TableViewerColumn(
viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(titles[i]);
column.setWidth(bounds[i]);
column.setResizable(true);
column.setMoveable(true);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tableSorter.setColumn(index);
int dir = viewer.getTable().getSortDirection();
if (viewer.getTable().getSortColumn() == column) {
dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
} else {
dir = SWT.DOWN;
}
viewer.getTable().setSortDirection(dir);
viewer.getTable().setSortColumn(column);
viewer.refresh();
}
});
}
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
public void setFocus() {
viewer.getControl().setFocus();
}
} |
Je m'en remet donc à vos précieux conseils et suggestions.