Vorwort: Dies ist ein Kursdesign für das zweite Studienjahr (oder ein Studentenverwaltungssystem ...) Obwohl es theoretisch von einer Gruppe von vier Personen durchgeführt wurde, beachten Sie bitte dieses „aber“, ich bin immer noch für den gesamten Code und die Dokumente verantwortlich ... Ich habe den Code und die Dokumente im Grunde selbst geschrieben und war so besorgt dass ich Blut erbrochen habe. Was ist der Grund, warum einige Funktionen der späteren Webversion nicht abgeschlossen sind?
Das Projekt ist in eine in JavaSwing geschriebene GUI-Desktopanwendung und eine halbfertige Webanwendung unterteilt. Das Bild unten zeigt die Gesamtfunktionsstruktur des Projekts#. 🎜🎜##🎜 🎜#
JavaSwing
Darüber hinaus kann es in der JavaSwing-Version zu einigen unbekannten logischen Fehlern kommen.
Funktionsanzeige
2. Systemeinstellungsmodul#🎜🎜 #
3. Studentenverwaltungsmodul
Student Add#🎜 🎜#Schülerliste
4. Klassenverwaltungsmodul
Klassenzusatz
#🎜🎜 #Klassenverwaltung 5, Punkteverwaltung Punktestatistik# 🎜🎜#
6, Webversion
Nach dem Klicken können Sie zum
#🎜 des Browsers springen 🎜#
Gebrauchsanweisung
Verwenden Sie IDEA, um das Projekt zu öffnen: http://localhost:8080 网址
# 🎜🎜##🎜🎜 #Um das Projekt zu starten, führen Sie LoginFrm im Ansichtspaket aus Verwendung von Spring für die Abhängigkeitsinjektion Das Problem
Swing ist ein Java-Paket für die GUI-Entwicklung. Im Kursdesign verwende ich Spring zur Verwaltung des Containers, aber bei der Verwendung von Spring-Annotationen für die Container-Abhängigkeitsinjektion tritt ein Problem auf. Die Injektion ist null und der Fehler wird wie folgt gemeldet:Exception in thread „AWT-EventQueue-0“ java.lang.NullPointerException
at com .view.LoginFrm.loginAct (LoginFrm.java:187)
at com.view.LoginFrm$2.actionPerformed(LoginFrm.java:96)I Ich konnte es lange Zeit nicht auf Baidu finden. Das Problem besteht darin, dass ich, nachdem ich ausgeschlossen hatte, dass die Spring-Konfigurationsdatei falsch geschrieben wurde oder die @Service-Annotation usw. nicht hinzugefügt wurde, online eine Erklärung wie folgt gefunden habe:
Die Verwendung von @Autowired im Multithreading bringt immer weniger als Bohnen. Der Grund ist: Der neue Thread befindet sich nicht im Spring-Container, daher kann das Bean-Objekt im Spring nicht abgerufen werden. JavaSwing ist nicht threadsicher und an einigen Stellen im Projekte werden von mehreren Threads ausgeführt, viele UI-Threads werden gleichzeitig darin ausgeführt, sodass die Verwendung von Spring-Injection in diesen Threads fehlschlägt, weil es sich nicht um von Spring verwaltete Threads handelt und Spring die Verwendung von Annotationen zum Injizieren nicht zulässt Abhängigkeiten in Multithread-Situationen, daher können wir das gewünschte Bean-Objekt nur manuell abrufen. Der Code lautet wie folgt:private final ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); private final AdminService adminService = (AdminServiceImpl)context.getBean("AdminServiceImpl");Tatsächlich kann es auch durch die Konfiguration des Thread-Pools verwaltet werden Ich kenne Swing nicht und weiß nicht, wie es zu diesem Zeitpunkt läuft.
Dieses Problem hatte ich zunächst nicht erwartet, wenn ich davon gewusst hätte, hätte ich Spring on Swing nicht verwendet, da ich Abhängigkeiten für jede Ansichtsebene manuell abrufen muss Klasse, was viel schlimmer ist als die tatsächliche Verwendung von Spring. Es macht keinen Unterschied, einen Singleton-Modus zu verwenden, um MyBatis-Abhängigkeiten zu erhalten, aber es ist schwieriger, Spring zu verwenden. Bei der Angabe der Check-in-Methode habe ich List
> als Rückgabewert, aber es wurde ein Fehler angezeigt. Beim ersten Mal wurde ein Nullzeigerfehler angezeigt, dann habe ich die @Results-Ergebnismenge wie folgt konfiguriert: @Results({
@Result(property = "key",column = "attendance_num",jdbcType = JdbcType.INTEGER),
@Result(property = "value",column = "attendance_date",jdbcType = JdbcType.VARCHAR )})Aber es wurde ein Formatkonvertierungsfehler angezeigt, also habe ich die Abfrageergebnisse auf der Konsole ausgegeben und festgestellt, dass die Ergebnisse so aussahen
[{value=2018-05-17, key=1}, { Wert=17.04.2018, Schlüssel=1}, {Wert=18.04.2018, Schlüssel=1}, {Wert=19.04.2018, Schlüssel=3}, {Wert=20.04.2018, key= 1}, {value=21.04.2018, key=1}, {value=03.05.2018, key=1}]
Der Wert in HashMap hat sich von der Form einer JSON-Zeichenfolge in xxx geändert =xxx In der Form des obigen Ergebnisses. Fragen Sie nicht, warum Sie die XML-Datei nicht verwenden. Ich hatte damals nicht genug Zeit, also habe ich der Einfachheit halber nur Anmerkungen verwendet. Lösung:
Verarbeiten Sie den obigen Ergebniswert erneut und weisen Sie ihn HashMap zu die Zuordnung mit Fremdschlüsseln Probleme, die beim Extrahieren von Daten auftreten
Die Serviceschicht im Projekt meldet Fehler wie folgt:
Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (`ttms`.`s_attendance`, CONSTRAINT `student_attendance_foreign` FOREIGN KEY (`student_id`) REFERENCES `s_student` (`id`)); verschachtelte Ausnahme ist java.sql.SQLIntegrityConstraintViolationException: Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (`ttms`.`s_attendance `, CONSTRAINT `student_attendance_foreign` FOREIGN KEY (`student_id`) REFERENCES `s_student` (`id`))Ich habe die Fehlermeldung überprüft und festgestellt, dass das Problem in der Dao-Ebene lag. Es gab ein Problem mit einer Löschanweisung Nach der Analyse des Grundes stellte ich fest, dass eine Fremdschlüsselzuordnung festgelegt wurde. Dies verhindert, dass wir die Daten löschen. Lösung:Stellen Sie den Fremdschlüssel wie folgt auf ungültig ein, bevor Sie die Daten löschen:
set Foreign_key_checks = 0;Dann können Sie zu diesem Zeitpunkt die Löschanweisung ausführen.Setzen Sie nach dem Löschen den Fremdschlüssel ein Der Schlüssel muss wie folgt gültig sein:set Foreign_key_checks = 1;Dadurch wird dieser Datensatz vollständig gelöscht. JavaWebJavaWeb Hier wird die Framework-Kombination von SpringBoot + Spring Data JPA verwendet. Die Seite verwendet Thymeleaf für die Datenanzeige. Auf der Seite gibt es eine Statistikseite, die ECharts für die Datenvisualisierung verwendet.
Wie bereits erwähnt, ist das Web ein halbfertiges Produkt. Die implementierten Funktionen umfassen hauptsächlich die folgenden Funktionsmodule: Anmeldung, Abmeldung, Passwortänderung, Schülerverwaltung, Klassenverwaltung und Punkteverwaltung. Darüber hinaus ist die verwendete Datenbank dieselbe wie die JavaSwing-Version, sodass ihre vorherigen Daten tatsächlich interoperabel sind.
Zusammenfassung: Obwohl die Seite etwas hässlich ist, kann sie als Vorlage für die weitere Entwicklung verwendet werden.
Funktionsanzeige
1. Anmeldeschnittstelle
Schülerliste Schülerzusatz
Klasse hinzugefügt
4. Respektstatistiken 说 Beschreibung verwenden
Projektstrukturdiagramm: Direkt in die DemoApplication-Klasse einfügen und mit der rechten Maustaste starten.Aufgetretene Probleme
Bei der Verwendung von JPA zum Aktualisieren der Datenbank sind Probleme aufgetreten
Bei der Verwendung von Spring Data JPA zum Erstellen des Inhalts der Persistenzschicht auf der Webseite ist ein Fehler wie folgt aufgetreten:Eine Aktualisierungs-/Löschabfrage wird ausgeführt
Nachdem ich auf Baidu gesucht habe, habe ich festgestellt, dass es sich um JPA handelt. Beim Ausführen von Vorgängen wie Aktualisieren oder Löschen muss die Annotation @Transactional zur Dao- oder Service-Ebene hinzugefügt werden, was bedeutet, dass es sich um einen Vorgang auf Transaktionsebene handelt entspricht der Verwendung von JPA. Aufgrund der JPA-Anforderungen können Aktualisierungs- und Löschvorgänge ohne Transaktionsunterstützung nicht durchgeführt werden.
Das obige ist der detaillierte Inhalt vonAnalysieren Sie den Fall eines in Java implementierten Studentenverwaltungssystems.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!