Das mit Java Web implementierte MVC -Strukturdiagramm ist wie folgt, wobei der Controller -Teil mithilfe von Servlet implementiert wird, der Modellteil mit JavaBean implementiert wird und die meisten Ansichten mit JSP -Seiten implementiert werden.
Ideologische Grundlage
Das Arbeitsprinzip der zweischichtigen Struktur von JSP+JavaBean sollte relativ vertraut und leicht zu verstehen sein.
Eines muss jedoch klar sein, dass der Benutzer eine Webseitenanforderung über den Browser sendet. Nachdem diese Anfrage auf dem Server eintrifft, befindet sich die entsprechende Webseite auf der Serverseite. Wenn es sich um die erste Anfrage handelt (das zweite Mal wird nicht erläutert und ausgeführt) für den JSP ist es erforderlich, ein Servlet zu generieren und das Servlet dann über die Servlet -Engine auszuführen.
Die Essenz der dreischichtigen Struktur von JSP+Javaban+Servlet besteht darin, dass es einen zusätzlichen Controller: Servlet gibt, um Client-Browser-Anforderungen zu verteilen. Es wird eine große Hilfe sein, die Rolle eines Servlets zu verstehen, das als Controller als Vorverarbeitung der Anfrage des Kunden fungiert. Die entsprechende Beziehung zwischen Benutzeranforderungen und bestimmten Servlets finden Sie in der Konfigurationsdatei web.xml. Jedes Servlet verfügt über ein bestimmtes Servlet -Objekt, das ihm entspricht. Daher handelt es sich um ein Servlet -Objekt, das von httpServlet geerbt wurde.
!-JSPC Servlet Mappings Start-Servlet Servlet-Namems1/Servlet-name Servlet-KlasseNews.firstactaction/Servlet-Klasse/Servlet Servlet Servlet-Namems2/Servlet-name Servlet-ClassNews.Detailaction/Servlet-Class! URL-Muster/Newsmain/URL-Muster/Servlet-Mapping Servlet-Mapping Servlet-Namems2/Servlet-Name URL-Muster/Newsdetail/URL-Muster/Servlet-Mapping
Wie oben gezeigt, wird ein Abschnitt der Konfigurations -Servlet -Auszug aus web.xml. Der erste Teil wird hauptsächlich verwendet, um das Servlet so zu konfigurieren, dass es dem spezifischen Servlet -Objekt zugeordnet ist. Der zweite Teil wird hauptsächlich zur Konfiguration verwendet, um welches Servlet von der Anforderung verarbeitet wird. Die Assoziation des Servlet -Namens ist dem spezifischen Servlet -Verarbeitungsobjekt zugeordnet. Beispielsweise wird die vom Client -Browser von /Newsmain gesendete Anfrage vom MS1 -Servlet bearbeitet. Die entsprechenden Serlet-Objekt-News.Firstaction, dh /Newsmain-ms1-news.firstaction, was die Bedeutung der Konfigurationsdatei ist. Nachdem ich nun verstehe, dass die Benutzer-/Newsmain -Anfrage von Objekten der News.Firstaction -Klasse verarbeitet wird. Um das Programm zu verstehen, müssen Sie verstehen, was die Funktion der Erstaktion ist. Beispielsweise ist Folgendes eine Implementierung von FirstAction.
öffentliche endgültige Klasse FirstAction erweitert HttpServlet (geschützter void Service (httpServletRequest req, httpServletResponse). HttpSession Session = req.getSession (); try {session.setAttribute (constants.news_list_key, news .searchNewstitle (db)); } catch (Ausnahme e) {e.printstacktrace (); } db.close (); String target = "/p43_news/newsmain.jsp"; resp.sendredirect (Ziel); }} Durch diese Implementierung können wir feststellen, dass der Server, wenn der Server eine Client -Anforderung zur Ausführung von Nachrichten erhält. Auf diese Weise kann der entsprechende Wert, der in der Sitzung gespeichert ist, über die Sitzung erhalten werden.
Rückblickend ist leicht zu erkennen, dass sich das Arbeitsprinzip von JSP+Javabean von dem von JSP+Javaban+Servlet unterscheidet. Die zweischichtige Struktur muss die Vorverarbeitung in JSP platzieren.
Anforderungen an das Anmelderegistrierungsmodul
1 Register
1.1 Benutzerregistrierungsformular (Benutzername, Kennwort, E -Mail, Spitzname, Überprüfungscode)
1.2 Registrierung senden: Überprüfung auf (Benutzername, Passwort, E -Mail, Spitzname, Überprüfungscode).
1.2.1 Der Benutzername, Kennwort, E -Mail und Spitzname sind im Client -Browser abgeschlossen und über JS implementiert.
1.2.2 Der Überprüfungscode muss im serverseitigen Programm abgeschlossen sein.
2. Wenn die Überprüfung des Registrierungsformulars verabschiedet wird, wird die Geschäftslogik beurteilt.
2.1 Wenn der Benutzer bereits vorhanden ist, teilen Sie dem Benutzer die Fehlermeldung mit.
2.2 Wenn die E -Mail -Adresse bereits vorhanden ist, teilen Sie dem Benutzer die Fehlermeldung mit.
2.3 Wenn keine existiert, fahren Sie mit Schritt 3 fort.
3. Speichern Sie Benutzerinformationen in der Datenbank
4. Registrieren Sie sich erfolgreich, springen Sie zur Anmeldeseite
5. Anmelden
5.1 Senden Sie die Anmeldeinformationen des Benutzers zur Überprüfung an den Hintergrund
5.2 Wenn die Überprüfung erfolgreich ist, springen Sie zur Startseite
5.3 Wenn der Sprung fehlschlägt, springen Sie zur Anmeldeseite und fordern Sie eine Fehlermeldung auf.
Projektverzeichnisstruktur
Der Quellcode des Projekts ist in vier Paketdateien unterteilt, die zum Zugriff auf Modelle, Ansichten, Controller und Werkzeugklassen verwendet werden. Die spezifischen Dateien sind wie folgt:
Für die Ansicht definieren wir drei JSP -Seiten wie folgt:
Definieren Sie die Ansicht
Login.jsp -Seite
<%@ page Language = "java" contentType = "text/html; charset = utf-8" pageCoding = "utf-8"%> <! docType html public "-// w3c // dtd html 4.01 transitional // en" http://www.w.w.w.w.w.w.w.w.w3. <html> <head> <meta http-äquiv = "content-type" content = "text/html; charset = utf-8"> <title> login-Formular </title> </head> <body> <font color = "rot"> $ {message} </font> <a href = "regist.jsp"> registrieren Sie sich ein neues Konto. action = "$ {pageContext.request.contextPath}/login" method = "post"> username: <input type = "text" name = "userername"> <br/> Passwort: <Eingabe type = "password" name = "password"> <br/> <Eingabe type "swere".index.jsp Seite
<%@ page Language = "java" contentType = "text/html; charset = utf-8" pageCoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <! docttype htm. 4.01 Übergang // en "" http://www.w3.org/tr/html4/loose.dtd "> <html> <head> <meta http-equiv =" content-type "content =" text/html; color = "rot"> $ {message} </font> <% if (request.getSession (). getAtTribute ("username") == null) {response.sendredirect ("login.jsp"); } else { %> <font color = "rot"> "Willkommen:" < %= request.getSession (). getAtTribute ("Benutzername"). ToString () %> </font> < %} %> </body> </html>Regist.jsp Seite
<%@ page Language = "java" contentType = "text/html; charset = utf-8" pageCoding = "utf-8"%> <! docType html public "-// w3c // dtd html 4.01 transitional // en" http://www.w.w.w.w.w.w.w.w.w3. <html> <head> <meta http-äquiv = "content-type" content = "text/html; charSet = utf-8"> <titels> Benutzer registriertes Formular </title> <script type = "text/javaScript"> Funktion Changesimage () {document.getElementById ("Image"). }/Prüfung? " + neues Datum (). GetTime ()} Funktion valateForm () {// Benutzername, Passwort, E -Mail, Spitzname var username = document.getElementById ("Benutzername"). Wert; if (userername == "") {alert ("Benutzername kann nicht leer sein"); false zurückgeben; } var password = document.getElementById ("Passwort"). Wert; if (password == "") {alert ("Passwort kann nicht leer sein"); false zurückgeben; } var repassword = document.getElementById ("Repassword"). Wert; if (password! = repassword) {alert ("Passwort muss konsistent sein"); false zurückgeben; } var spickname = document.getElementById ("Spitzname"). Wert; if (spitzname == "") {alert ("Spitzname kann nicht leer sein"); false zurückgeben; } // ^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(?: [-.] [a-za-z0-9]+)*//. if (mail.match ("^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(?: [-.] [a-za-z0-9]+)*//. false zurückgeben; }} </script> </head> <body> <h3> Tabelle der Benutzerregistrierung </h3> <font color = "rot"> $ {message} </font> <form action = "$ {pageContext.request.contextPath}/Regist" OnSubmit return = "return validehorform ();"; method="post"> <table> <tr> <td>Username</td> <td> <input type="text" name="username" id="username1" v> </td> </tr> <tr> <td>Password</td> <td> <input type="password" name="password" id="password"> </td> </tr> <tr> <td>Please confirm the password</td> <td> <input type="password" name="repassword" id="repassword"> </td> </tr> <tr> <td>Nickname</td> <td> <input type="text" name="nickname" id="nickname"> </td> </tr> <tr> <td>Email</td> <td> <input type="text" name = "E -Mail" id = "E -Mail"> </td> </tr> <tr> <td> Verifizierungscode </td> <td> <Eingabe type = "text" name = "checkCode"> <img src = "$ {pageContext.request.contextpatphe id = "Bild" Onclick = "ChangeImage ();"> </td> </tr> <tr> <td> </td> <td> <Eingabe type = "value =" Registrierung "> </td> </tr> </table> </Form> </body> </html> Definieren Sie das Modell
Benutzermodell:
Paket com.vs2022.model; öffentliche Klasse Benutzer {private String -Benutzername; privates Zeichenfolgenkennwort; privater String -Spitzname; private Zeichenfolge E -Mail; // Alt+ SHFT+ S // Ein Dialogfeld für die Überschreibung der Überschreibung auftauchen. public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; } public String getNickName () {return spickname; } public void setNickName (String -Spitzname) {this.nickname = spitzname; } public String getemail () {E -Mail zurückgeben; } public void setemail (String -E -Mail) {this.email = E -Mail; }}Benutzeroperationsmodell
Paket com.vs2022.model; import com.vs2022.utils.dbutil; öffentliche Klasse Benutzeroperation {öffentliche endgültige statische int usernameExist = 1; öffentliche endgültige statische int emazieren exist = 2; öffentliche endgültige statische Int -Erfolg = 3; öffentliche endgültige statische int fail = 4; public int Registrierung (Benutzerbenutzer) {dbutil db = new dButil (); if (db.serchusername (user.getUnername ())) {// Geben Sie an, dass der Benutzername bereits vorhanden ist. } if (db.serchemail (user.getemail ())) {// Dies bedeutet, dass die E -Mail -Adresse bereits vorhanden ist. E -Mail -exist zurück; } // Wenn Sie hierher gehen, bedeutet dies, dass der Benutzername der E -Mail -Adresse nicht gespeichert ist. Lassen Sie ihn also registrieren. Hinzufügen zur Datenbank db.Updateuser (Benutzer); Erfolgserfolg; } public int login (Benutzerbenutzer) {dbutil db = new dButil (); if (db.loginSuccess (user.getUnername (), user.getPassword ())) {// bedeutet, dass der Benutzername und das Kennwort korrekt sind. Erfolgserfolg; } return fail; }} CheckCode -Modell
Paket com.vs2022.model; import Java.awt.Color; import Java.awt.font; importieren java.awt.graphics; Import Java.awt.image.BuffenedImage; importieren java.io.ioException; importieren java.io.outputstream; import Java.util.hashtable; import Javax.imageo.imageo; importieren javax.servlet.servletException; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; importieren javax.servlet.http.httpSession; public class checkcode {private String getRandomstring () {int rannum = (int) (math.random () * 9000) + 1000; Return Rannum + "";} public void getCode (int width, int height, httpServletRequest -Anforderung, httpServletResponse -Antwort) löscht ServletException, IOException {// Bild in Speicher gepuffertimage image = new bufferedImage (width, height, buffenedimage.type_int_rgb); Grafik g = image.getGraphics (); // Grafikobjekt erstellen, seine Funktion entspricht dem Pinsel G.SetColor (color.getColor ("f8f8f8")); G.FillRect (0, 0, Breite, Höhe); // Zeichnen Sie die Hintergrund -Schriftart mfont = new Font ("kaiti", font.bold, 16); // Definieren Sie den Schriftstil G.Setfont (MFONT); // Setzen Sie die Schriftart G.SetColor (color.red); // zufällige Zahlenstring -String -RANs = getRandomstring (); // zufällige Nummer in die Sitzung httpSession Session = Request.GetSession () schreiben; Session.SetAttribute ("Check", RANs); // zufällige Zahl in Bild G.Drawstring schreiben (RANs, 5, 20); // Bild effektiv g.disponse (); // Ausgabe image imageio.write (Bild, "JPEG", response.getOutputStream ());}} Definieren Sie den Controller
LoginServlet -Klasse
Paket com.vs2022.controller; import Java.io.ioException; importieren java.io.printwriter; import javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletrequest; import. com.vs2022.model.useroperation; public class loginServlet erweitert HttpServlet {public void dodget (httpServletRequest Request, httpServletResponse -Antwort) löst servleTexception, ioException {// logical String username = request. String password = request.getParameter ("Passwort"); User user = new user (); user.SetUnername (Benutzername); user.setPassword (Passwort); // Rufen Sie die Javabä -Klasse der Geschäftsfunktion auf, um die spezifische Geschäftslogik der Anmeldeberation zu implementieren. // Rückgabewert? int i = us.login (Benutzer); if (i == 4) {// Es zeigt an, dass der Anmeldung fehlgeschlagen ist, der Benutzername oder das Passwort in falscher Anfrage. request.getRequestDispatcher ("login.jsp"). Forward (Request, Antwort); } else {// Anmelden erfolgreich auf die Homepage der Website, verwenden Sie die Umleitung // Benutzername in der Sitzungsdomain -Request.getSession (). SetAttribute ("Benutzername", Benutzername); response.sendredirect ("index.jsp"); //request.getRequestDispatcher("Index.jsp").forward(Request, Antwort); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}RegisterServlet -Klasse
Paket com.vs2022.controller; import Java.io.ioException; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; Importieren Sie javax.servlet.http.httpServletResponse; import com.sun.org.apache.commons.beanutils.beanutils; com.vs2022.model.User; HttpServletResponse-Antwort) löst ServletException aus, iOException {// die verstümmelte Codeanforderung löste. // Überprüfung des Verifizierungscode -Zeichenfolge checkCode = request.getParameter ("checkCode"); String check_code_Session = (String) request.getSession (). GetAtTribute ("check"); if (checkCode == null ||! checkCode.equals (check_code_Session)) {// Geben Sie an, dass der Überprüfungscode falsch eingeben wird. SetatTribute ("Nachricht", "falscher Verifizierungscode ist falsch eingegeben"); Request.GetRequestDispatcher ("Regist.jsp"). Forward (Request, Antwort); zurückkehren; } // Wenn Sie hierher kommen, bedeutet dies, dass alle Überprüfungen bestanden wurden und der Anruf die Verarbeitung der Geschäftslogik umfasst. User user = new user (); // Beanutils vervollständigen die Verkapselung der Daten in ein Java -Bean -Objekt, Apache eine Open -Source -JAR -Implementierung der Stiftung. Versuchen Sie {// Voraussetzung: Der Feldname des JavaBean muss mit dem Schlüssel des im Formular eingereichten Wertes übereinstimmen, andernfalls kann die Kapselung nicht abgeschlossen werden. Beanutils.populat (Benutzer, Request.getParametermap ()); } catch (Ausnahme e) {e.printstacktrace (); Neue RunTimeException werfen ("Entschuldigung, die Kapselungsdaten sind fehlgeschlagen"); } // So wird eine neue Java -Bean -Klasse so konzipiert, dass die Business Logic Useroperation us = new userOperation () implementiert wird; try {int feedback = us.regist (Benutzer); if (feedback == userOperation.emailexist) {// gibt an, dass die E -Mail -Adresse bereits request.setAttribute ("meldung", "die E -Mail -Adresse bereits existiert"); Request.GetRequestDispatcher ("Regist.jsp"). Forward (Request, Antwort); } else if (feedback == userOperation.usernameExist) {// zeigt an, dass der Benutzername bereits request.setAttribute ("meldung", "der Benutzername bereits existiert"); Request.GetRequestDispatcher ("Regist.jsp"). Forward (Request, Antwort); } else {// zeigt an, dass die Registrierung erfolgreich ist und zur Anmeldeseite springt. Zur Verwendung von redirect response.sendredirect ("login.jsp"); }} catch (Ausnahme e) {e.printstacktrace (); neue runimeexception werfen ("fehlgeschlagen"); }} public void dopost (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, IOException {dodget (request, response); }}PrüfungServlet -Klasse
Paket com.vs2022.controller; import Java.io.ioException; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; importieren com.vs2022.model response.setheader ("pragma", "no-cache"); response.setheader ("cache-control", "no-cache"); response.setDateHeader ("läuft", 0); Antwort.SetContentType ("Image/JPEG"); int width = 40; int Höhe = 30; // Generieren Sie ein anonymer Objekt des Verifizierungscodes und generieren Sie den Verifikationscode Neue CheckCode (). GetCode (Breite, Höhe, Anforderung, Antwort); } public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException aus, ioException {dodget (request, response); }} Definieren Sie Werkzeugkurse
DBUTIL -Klasse
Paket com.vs2022.utils; import Java.sql.*; com.vs2022.model.user; öffentliche Klasse dButil {boolean binited = false; // Treiber laden public void initjdbc () löscht classNotFoundException {// MySQL JDBC -Treiberklasse.forname ("com.mysql.jdbc.driver"); binitiert = wahr; System.out.println ("Erfolg beim Laden von MySQL -Treiber!"); } public Connection getConnection () löscht classNotFoundException, sqlexception {if (! binited) {initjdbc (); } // Die Verbindungs -URL ist JDBC: MySQL // Serveradresse/Datenbankname // Die folgenden zwei Parameter sind Anmeldebutzungsname und Kennwortverbindung conn = driverManager.getConnection ("JDBC: MySQL: // localhost: 3306/database", "Username", "Passwort"); Conn zurückgeben; } public boolean loginSuccess (String -Benutzername, String -Passwort) {boolean returnValue = false; String SQL = "SELECT * vom Benutzer, wo userername =? Und password =?"; Verbindung conn = null; PrepedStatement ps = null; int i = 0; try {conn = getConnection (); ps = conn.preparestatement (SQL); Ps.SetString (1, Benutzername); Ps.SetString (2, Passwort); ResultSet rs = ps.executeQuery (); if (rs.Next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; } public boolean updateUser (Benutzerbenutzer) {boolean flag = false; int i = 0; Verbindung conn = null; PrepedStatement ps = null; String SQL = "In den Benutzer (Benutzername, Kennwort, Spitzname, E -Mail) Werte (?,?,?,?)"; try {conn = getConnection (); ps = conn.preparestatement (SQL); ps.setString (1, user.getUnername ()); // Legen Sie den Wert für den Platzhalter fest. Die Platzhalterordnung beginnt ab 1. Der erste Parameter ist die Position des Platzhalters, und der zweite Parameter ist der Wert des Platzhalters. ps.setString (2, user.getPassword ()); ps.SetString (3, user.getNickName ()); ps.SetString (4, user.getEMail ()); i = ps.executeUpdate (); if (i> 0) {flag = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } Rückkehrflag; } public boolean serchusername (String -Benutzername) {boolean returnValue = false; String SQL = "SELECT * vom Benutzer, wo userername =?"; Verbindung conn = null; PrepedStatement ps = null; try {conn = getConnection (); ps = conn.preparestatement (SQL); Ps.SetString (1, Benutzername); ResultSet rs = ps.executeQuery (); if (rs.Next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; } public boolean serchemail (String -E -Mail) {boolean returnValue = false; String SQL = "SELECT * Vom Benutzer wobei E -Mail =?"; Verbindung conn = null; PrepedStatement ps = null; int i = 0; try {conn = getConnection (); ps = conn.preparestatement (SQL); Ps.SetString (1, E -Mail); ResultSet rs = ps.executeQuery (); if (rs.Next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; }}