2008-12-21 10 views
1

Je voudrais échanger une requête sql: pour du code Java qui construit une requête complexe avec plusieurs paramètres. Le sql actuel est un select simple.Comment créer un Java ResultSet disponible dans mon jsp?

 
<sql:query 
    var="result" 
    dataSource="${dSource}" 
    sql="select * from TABLE "> 
</sql:query> 

Comment puis-je prendre mon Java ResultSet (ie rs = stmt.executeQuery (sql);.) Et rendre les résultats disponibles dans mon JSP je peux faire ce manuel JSP?

Pour être plus clair, je veux supprimer la requête ci-dessus et le remplacer par Java.

 
<% 
    ResultSet rs = stmt.executeQuery(sql); // Messy code will be in some Controller 
%> 
 
<c:forEach var="row" items="${result.rows}"> 
    <c:out value="${row.name}"/> 
</c:forEach> 

dois-je configurer la variable séance/page dans la section Java ou est-il un truc EL que je peux utiliser pour accéder à la variable?

+0

Quelle tristesse que toutes les réponses vont dans toutes les directions, mais juste pour répondre à la question. J'ai demandé la même chose et y ai répondu quand je faisais J2EE, mais je ne m'en souviens pas. Il n'y a peut-être aucun moyen d'obtenir l'étiquette pour utiliser votre variable rs, mais je pense qu'il y a un moyen. –

Répondre

6

Modèle (Ligne):

public class Row { 
    private String name; 
    // Add/generate constructor(s), getters and setters. 
} 

OAC:

public List<Row> list() throws SQLException { 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    List<Row> rows = new ArrayList<Row>(); 

    try { 
     connection = database.getConnection(); 
     statement = connection.createStatement(); 
     resultSet = statement.executeQuery(SQL_LIST); 
     while (resultSet.next()) { 
      Row row = new Row(); 
      row.setName(resultSet.getString("name")); 
      // ... 
      rows.add(row); 
     } 
    } finally { 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} 
     if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 

    return rows; 
} 

Controller (servlet):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    try { 
     List<Row> rows = someDAO.list(); 
     request.setAttribute("rows", rows); 
    } catch (SQLException e) { 
     request.setAttribute("error", "Retrieving rows failed."); 
     e.printStackTrace(); 
    } 
    request.getRequestDispatcher("page.jsp").forward(request, response); 
} 

Voir (page.jsp):

<c:forEach items="${rows}" var="row"> 
    <c:out value="${row.name}" /> 
    ... 
</c:forEach> 
<c:if test="${not empty error}">Error: ${error}</c:if> 
0

Si vous utilisez un framework web comme mvn printemps ou entretoises, vous avez une classe de contrôleur qui est exécuté avant la jsp réelle. Cela peut avoir une méthode

ResultSet getResult() 

Cette méthode sera disponible en $ {result} dans votre jsp.

Si vous n'êtes pas utiliser ces cadres vous pouvez toujours utiliser useBean jsp et lier un JavaClass à une variable (vérifier la documentation usebean). Si vous utilisezbean à une variable de myBean vous y accédez avec $ {myBean.result}

Enfin, vous pouvez également lier le résultat aux paramètres de la demande "ailleurs". Dans ce cas, vous l'appelez $ {param.result}

0

Vous ne le faites pas. D'abord, placer SQL dans JSP, même via des balises, est révélateur d'un choix de conception horrible. La page JSP est la "vue" dans le modèle Model View Controller. Son travail consiste à afficher votre modèle, ne pas faire quoi que ce soit avec d'autres que l'afficher.

Dans votre classe contrôleur, exécutez SQL et récupérer des objets Java réels qui peuvent être affichées via la page JSP. Ensuite, dans votre JSP, affichez-les. Laissez votre SQL à votre contrôleur, et laissez le JSP se concentrer sur simplement l'affichage des données. Non seulement vous obtenez une séparation nette des problèmes, mais votre JSP devient beaucoup plus simple et il est beaucoup plus facile de refactoriser le code Java que le code JSP plus tard s'il est nécessaire de le faire (il est beaucoup plus simple de tester Java code aussi bien).

+1

Je n'ai pas demandé de leçon sur MVC, j'ai demandé comment résoudre un problème spécifique avec lequel je luttais dans le code JSP. Nous devrions probablement tous vider Java/JSP pour Squeak et Seaside, mais bon, parfois, nous essayons simplement de faire un travail. –

1

Vous définissez un attribut de session/requête à partir du code Java.

Cependant, je suggérerais pas en utilisant un ResultSet, car il a quelques problèmes de cycle de vie (c'est-à-dire doit être fermé). Je suggérerais d'aller chercher l'objet ResultSet dans le code Java, de l'itérer sur la construction, de dire une liste, de fermer le ResultSet et de passer la liste au JSP. Si vous utilisez Spring, les JdbcTemplates fournissent des méthodes qui prennent une chaîne et des paramètres SQL et retournent une List> avec les résultats de la requête, ce qui peut être très utile pour cela.

+0

Il n'y a rien de mal à utiliser ResultSet dans une JSP tant que l'utilisateur le déclare et son PreparedStatement en dehors de try/catch/finally et s'assure de fermer et de tout annuler (y compris la Connection) dans le. – Amalgovinus

Questions connexes