Probleme beim JSP, beim Hinzufügen, Löschen, Ändern und Abfragen von Datenbanken

Beim Hinzufügen, Löschen, Ändern und Abfragen von Datenbanken in JSP sind Probleme aufgetreten

1. Es gibt Unterschiede in den Darstellungsregeln von Dateisystempfaden und Servlet-Pfaden.

Diese Pfade stellen relative Pfade dar, die normalerweise in Dateisystemen oder URLs verwendet werden. Lassen Sie uns sie einzeln erklären:

  1. demo::

    • Dies ist ein relativer Pfad zu einem Verzeichnis oder einer Datei im aktuellen Verzeichnis demo. Wenn Sie sich in einem Dateisystem befinden, verweist dies auf demodas Verzeichnis oder die Datei im aktuellen Arbeitsverzeichnis.

    • Wenn Ihr aktueller Pfad beispielsweise lautet /home/user/, demowird auf verweisen /home/user/demo.

  2. ./demo::

    • ./Stellt das aktuelle Verzeichnis dar, also ./demoein Verzeichnis oder eine Datei im aktuellen Verzeichnis demo.

    • Tatsächlich ./kann es weggelassen werden, da die meisten Systeme standardmäßig im aktuellen Verzeichnis suchen. Also ./demound demosind in den meisten Fällen gleichwertig.

  3. /demo::

    • Dies ist ein absoluter Pfad zu einem Verzeichnis oder einer Datei im Stammverzeichnis demo. Unabhängig davon, wo sich das aktuelle Arbeitsverzeichnis befindet, beginnt die Suche im Stammverzeichnis.

    • Dies würde beispielsweise /demoauf ein Verzeichnis oder eine Datei unter dem Stammverzeichnis verweisen demo.

  4. ../demo::

    • ../Stellt das Verzeichnis der oberen Ebene dar und gibt daher ../demodas Verzeichnis oder die Datei im Verzeichnis der oberen Ebene an demo.

    • Wenn der aktuelle Pfad beispielsweise lautet /home/user/subdir/, ../demowird auf verwiesen /home/user/demo.

Im Allgemeinen werden diese Pfade im Dateisystem oder in URLs verwendet, abhängig vom aktuellen Arbeitsverzeichnis oder Basispfad. Jeder Punkt und Schrägstrich hat eine bestimmte Bedeutung, sodass die Interpretation des Pfads vom Kontext abhängt.

Aber im Servlet-Container stellt „/“ das Stammverzeichnis der Anwendung (Web-Demo) dar, nicht das Stammverzeichnis des Dateisystems (das Stammverzeichnis des Laufwerks C). Das Stammverzeichnis der JSP-Datei ist das Dateisystem, und das Stammverzeichnis in der Servlet-Klasse ist das Stammverzeichnis der Anwendung.

2.Tomcat integriertes Ideenpfadproblem

 <!--<a href="/brand-demo/selectAllServlet">Alle abfragen</a>-->
     <!--Dies bedeutet, dass es unter dem aktuellen virtuellen Pfad besser ist, da nach dem Packen in ein Kriegspaket
     brand-demo wird zu brand_demo_war. Verwenden Sie ./, um die Portabilität zu erhöhen
     ./kann auch weggelassen werden -->
     <!--<a href="./selectAllServlet">Alle abfragen</a>-->
     <a href="selectAllServlet">Alle abfragen</a>

3. Die wunderbare Verwendung von try

Im angegebenen Code gibt es einige Duplikate des Codes, insbesondere im Teil von get SqlSessionund BrandMapper. Das Extrahieren von doppeltem Code verbessert die Wartbarkeit und Lesbarkeit des Codes und reduziert gleichzeitig potenzielle Fehler.

Hier können Sie erwägen, den Prozess des Erhaltens in eine Methode zu extrahieren, SqlSessionum BrandMapperwiederholten Code zu reduzieren. Zum Beispiel:

 öffentliche Klasse BrandService {
     // Werkzeugklasse aufrufen
     private SqlSessionFactory Factory = SqlSessionFactoryUtils.getSqlSessionFactory();
 ​
     private SqlSession openSqlSession() {
         return Factory.openSession();
     }
 ​
     private BrandMapper getBrandMapper(SqlSession sqlSession) {
         return sqlSession.getMapper(BrandMapper.class);
     }
 ​
     /**
      * Suche alle
      */
     öffentliche Liste<Marke> selectAll() {
         try (SqlSession sqlSession = openSqlSession()) {
             BrandMapper-Mapper = getBrandMapper(sqlSession);
             return mapper.selectAll();
         }
     }
 ​
     /**
      * Daten hinzufügen
      */
     public void add(Brand brand) {
         try (SqlSession sqlSession = openSqlSession()) {
             BrandMapper-Mapper = getBrandMapper(sqlSession);
             mapper.add(marke);
             sqlSession.commit();
         }
     }
 }

Verbesserte Wiederverwendbarkeit des Codes. Dadurch wird auch sichergestellt, dass die Methode nach Abschluss ihrer Ausführung geschlossen wird SqlSession, was eine bessere Ressourcenverwaltung ermöglicht.

Bei Verwendung des Try-with-Resources-Konstrukts in Java werden Ressourcen (z. B. Objekte, die AutoCloseableeine Schnittstelle implementieren) am Ende des Codeblocks automatisch geschlossen. In MyBatis SqlSessionist die Schnittstelle implementiert java.io.Closeable, sodass sie in einer Try-with-Resources-Struktur verwendet werden kann, um sicherzustellen, dass der Codeblock nach der Ausführung geschlossen wird.

Bei Verwendung einer Struktur wie der folgenden:

 javatry (SqlSession sqlSession = Factory.openSession()) {
     //Datenbankoperationen durchführen
     // Am Ende dieses Codeblocks wird SqlSession automatisch geschlossen
 } Catch (Ausnahme e) {
     //Ausnahmebehandlung
 }

SqlSessionIn diesem Fall wird die Methode nach dem Ende des Codeblocks automatisch aufgerufen, um die Ressource zu schließen, unabhängig davon, ob im Codeblock eine Ausnahme auftritt close(). Dadurch wird sichergestellt, dass die Datenbankverbindung rechtzeitig nach Abschluss der Methodenausführung freigegeben wird, wodurch Ressourcenlecks und eine langfristige Belegung der Datenbankverbindung vermieden werden.

SqlSessionDiese Struktur ist eine sehr sichere und empfehlenswerte Möglichkeit , mit solchen Ressourcen umzugehen und sicherzustellen, dass sie ordnungsgemäß geschlossen werden, wenn sie nicht mehr benötigt werden.

In der Try-with-Resources-Struktur von Java können Sie einfach Try ohne Catch oder Final Block verwenden. Dies liegt daran, dass die Try-with-Resources-Struktur dafür sorgen soll, dass Ressourcen am Ende des Codeblocks automatisch geschlossen werden, unabhängig davon, ob eine Ausnahme auftritt. Dieser Ansatz hilft dem Code, Ressourcen klarer zu verwalten.

In dem von Ihnen bereitgestellten Code-Snippet:

 javatry (SqlSession sqlSession = openSqlSession()) {
     BrandMapper-Mapper = getBrandMapper(sqlSession);
     mapper.add(marke);
     sqlSession.commit();
 }

Auch wenn kein expliziter Catch-Block vorhanden ist, SqlSessionruft die Ressource (in diesem Fall) automatisch die Methode zum Schließen der Ressource auf, nachdem die Ausführung des Codeblocks abgeschlossen ist close(). Diese Schreibweise eignet sich für Szenarien, in denen keine explizite Ausnahmebehandlung erforderlich ist, und stellt sicher, dass Ressourcen am Ende des Codeblocks freigegeben werden. Wenn Ausnahmen auftreten, werden diese Ausnahmen zur Verarbeitung an den Aufrufer weitergeleitet.

Beachten Sie jedoch, dass bei Verwendung der Try-with-Resources-Struktur auch ohne einen expliziten Catch-Block, wenn bestimmte Vorgänge (z. B. sqlSession.commit()) Ausnahmen auslösen, diese Ausnahmen an die obere aufrufende Methode geworfen oder zur entsprechenden Verarbeitung abgefangen werden. Verarbeitung. Obwohl es keinen expliziten Catch-Block gibt, müssen daher dennoch Strategien zur Ausnahmebehandlung in Betracht gezogen werden, um Ausnahmen angemessen zu behandeln.

Je suppose que tu aimes

Origine blog.csdn.net/m0_67574793/article/details/134586009
conseillé
Classement