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:
-
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 aufdemo
das Verzeichnis oder die Datei im aktuellen Arbeitsverzeichnis. -
Wenn Ihr aktueller Pfad beispielsweise lautet
/home/user/
,demo
wird auf verweisen/home/user/demo
.
-
-
./demo
::-
./
Stellt das aktuelle Verzeichnis dar, also./demo
ein Verzeichnis oder eine Datei im aktuellen Verzeichnisdemo
. -
Tatsächlich
./
kann es weggelassen werden, da die meisten Systeme standardmäßig im aktuellen Verzeichnis suchen. Also./demo
unddemo
sind in den meisten Fällen gleichwertig.
-
-
/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
/demo
auf ein Verzeichnis oder eine Datei unter dem Stammverzeichnis verweisendemo
.
-
-
../demo
::-
../
Stellt das Verzeichnis der oberen Ebene dar und gibt daher../demo
das Verzeichnis oder die Datei im Verzeichnis der oberen Ebene andemo
. -
Wenn der aktuelle Pfad beispielsweise lautet
/home/user/subdir/
,../demo
wird 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 SqlSession
und 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, SqlSession
um BrandMapper
wiederholten 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 AutoCloseable
eine Schnittstelle implementieren) am Ende des Codeblocks automatisch geschlossen. In MyBatis SqlSession
ist 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 }
SqlSession
In 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.
SqlSession
Diese 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, SqlSession
ruft 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.