Diagram struktur MVC yang diimplementasikan menggunakan Java Web adalah sebagai berikut, di mana bagian pengontrol diimplementasikan menggunakan Servlet, bagian model diimplementasikan menggunakan Javabean, dan sebagian besar tampilan diimplementasikan menggunakan halaman JSP.
Fondasi Ideologis
Prinsip kerja struktur dua lapis JSP+Javabean harus relatif akrab dan mudah dimengerti.
Namun, satu hal yang harus jelas adalah bahwa pengguna mengirim permintaan halaman web melalui browser. Setelah permintaan ini tiba di server, halaman web yang sesuai ditemukan di sisi server. Jika ini adalah permintaan pertama (kedua kalinya tidak dijelaskan dan dieksekusi), untuk JSP, perlu untuk menghasilkan servlet, dan kemudian menjalankan servlet melalui mesin servlet, embed hasil memanggil JavaBean ke halaman dan kembalikan ke browser pengguna.
Inti dari struktur tiga lapis JSP+Javabean+Servlet adalah bahwa ada pengontrol tambahan: Servlet untuk mendistribusikan permintaan browser klien. Akan sangat membantu untuk memahami peran servlet yang bertindak sebagai pengontrol sebagai preprocessing permintaan klien. Hubungan yang sesuai antara permintaan pengguna dan servlets spesifik dapat ditemukan melalui file konfigurasi web.xml. Setiap servlet memiliki objek servlet spesifik yang sesuai dengannya, jadi yang menangani permintaan pengguna adalah objek servlet yang diwarisi dari httpservlet.
!-pemetaan servlet jspc start-servlet servlet-namems1/servlet-name servlet-classnews.firstaction/servlet-class/servlet servlet servlet-namems2/servlet-name servlet-classnews.detailaction/servlet-class/ URL-Pattern/Newsmain/URL-Pattern/Servlet-Mapping Servlet-Mapping Servlet-Namems2/Servlet-Name-Pattern/NewsDetail/URL-Pattern/Servlet-Mapping
Seperti yang ditunjukkan di atas, bagian mengkonfigurasi servlet yang diekstraksi dari web.xml. Bagian pertama terutama digunakan untuk mengonfigurasi servlet yang dikaitkan dengan objek servlet tertentu. Bagian kedua terutama digunakan untuk mengonfigurasi servlet mana yang diproses berdasarkan permintaan. Asosiasi nama servlet dikaitkan dengan objek pemrosesan servlet spesifik. Misalnya, permintaan yang dikirim oleh browser klien dari /Newsmain diproses oleh MS1 Servlet. SERLET OBYECT NEWS.FIRSTACTION yang sesuai, yaitu, /NewSmain-ms1-news.firstaction, yang merupakan arti dari file konfigurasi. Sekarang saya mengerti bahwa permintaan pengguna/berita akan diproses oleh objek berita. Misalnya, berikut ini adalah implementasi FirstAction.
FirstAction kelas akhir publik memperluas httpservlet {void service (httpservletRequest req, httpservletResponse resp) melempar servletException, ioException {db db = db baru (); Httpsession sesi = req.getSession (); coba {session.setAttribute (constants.news_list_key, news .searchnewstitle (db)); } catch (Exception e) {E.PrintStackTrace (); } db.close (); String target = "/p43_news/newsmain.jsp"; resp.sendredirect (target); }} Melalui implementasi ini, kita dapat melihat bahwa ketika server menerima permintaan klien untuk melakukan news.searchnewstitle (DB), kemudian memasukkan nilai pengembalian ke dalam sesi melalui sesi. Dengan cara ini, nilai yang sesuai yang disimpan dalam sesi dapat diperoleh melalui fungsi Sesi. GetAttribute di newsmain.jsp.
Melihat ke belakang, mudah untuk melihat bahwa prinsip kerja JSP+Javabean berbeda dari JSP+Javabean+Servlet. Struktur dua lapis harus menempatkan preprocessing di JSP, misalnya, news.searchnewstitle (DB), dan struktur tiga lapis terlebih dahulu melakukan preprocessing di servlet, dan kemudian setara dengan mengembalikan hasil pemrosesan ini ke JSP melalui sesi, sehingga JSP lebih memperhatikan tampilan antarmuka.
Persyaratan modul pendaftaran login
1 Daftar
1.1 Formulir Pendaftaran Pengguna (Nama Pengguna, Kata Sandi, Email, Nama Panggilan, Kode Verifikasi)
1.2 Kirim Pendaftaran: Verifikasi ke (nama pengguna, kata sandi, email, nama panggilan, kode verifikasi).
1.2.1 Nama pengguna, kata sandi, email, dan nama panggilan diselesaikan di browser klien dan diimplementasikan melalui JS.
1.2.2 Kode verifikasi harus diselesaikan pada program sisi server.
2. Jika verifikasi formulir pendaftaran disahkan, maka logika bisnis akan dinilai.
2.1 Jika pengguna sudah ada, beri tahu pengguna pesan kesalahan.
2.2 Jika alamat email sudah ada, beri tahu pengguna pesan kesalahan.
2.3 Jika tidak ada, lanjutkan ke langkah 3.
3. Simpan informasi pengguna ke database
4. Daftarkan dengan sukses, lompat ke halaman login
5. Masuk
5.1 Kirim Informasi Masuk Pengguna ke Latar Belakang untuk Verifikasi
5.2 Jika verifikasi berhasil, lompat ke halaman beranda
5.3 Jika lompatan gagal, lompat ke halaman login dan minta pesan kesalahan.
Struktur Direktori Proyek
Kode sumber proyek dibagi menjadi empat file paket, yang digunakan untuk mengakses model, tampilan, pengontrol, dan kelas alat. File spesifiknya adalah sebagai berikut:
Untuk tampilan, kami mendefinisikan tiga halaman JSP sebagai berikut:
Tentukan tampilan
halaman login.jsp
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/org/ht4/t." <html> <head> <meta http-equiv = "konten-tipe" content = "text/html; charset = utf-8"> <itement> Formulir login </iteme> </head> <body> <font color = "red"> $ {pesan} </font> <a href = "regist.jsp" $ {pesan} </font> <a href = "regist.jsp" $ {pesan} </font> <a href = "regist.jsp" $ {pesan} </font> <a href = "regist.jsp" $ {pesan} </font> <a href = "regist.jsp" action = "$ {pageContext.Request.contextPath}/login" Method = "Post"> Nama pengguna: <input type = "Text" name = "Username"> <br/> Kata sandi: <input type = "kata sandi" nama = "kata sandi"> <br/> <input type = "kirim" value = "login"> </formindex.jsp halaman
<%@ halaman bahasa = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <! Doctype htm htm html html html "public" public "public" public "public/ww3 Transisi // en "" http://www.w3.org/tr/html4/loose.dtd "> <html> <head> <meta http-equiv =" content-type "content =" Text/html; } </font> <% if (request.getSession (). getAttribute ("username") == null) {response.sendredirect ("login.jsp"); } else { %> <font color = "red"> "selamat datang:" < %= request.getSession (). getAttribute ("username"). toString () %> </font> < %} %> </body> </html>halaman regist.jsp
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/org/ht4/t." <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> Formulir Terdaftar Pengguna </title> <script type = "Text/JavaScript"> function {document.getElementById ("gambar"). SRC = "$" $ {document.retExt.retex.ract.ract.racix. "). SRC =" $ "). }/checkImage? " + tanggal baru (). getTime ()} function validateForm () {// Verifikasi nama pengguna, kata sandi, email, nama panggilan var username = document.getElementById ("nama pengguna"). nilai; if (username == "") {alert ("nama pengguna tidak bisa kosong"); mengembalikan false; } var password = document.geteLementById ("kata sandi"). nilai; if (password == "") {alert ("Kata sandi tidak dapat kosong"); mengembalikan false; } var repassword = document.getElementById ("repassword"). nilai; if (password! = repassword) {waspada ("Kata sandi harus konsisten"); mengembalikan false; } var nickname = document.getElementById ("nickname"). value; if (nickname == "") {alert ("NickName tidak bisa kosong"); mengembalikan false; } // ^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(?: [-.] [A-ZA-Z0-9]+)*//. [A-ZA-Z]+// S*$ Var Email = Document.getely)*//. [A-ZA-Z). if (email.match ("^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(?: [-.] [A-ZA-Z0-9]+)*//. [A-ZA-Z]+// S*$") ==]+) {A-ZA-Z]+// S*$ ") ==). mengembalikan false; }} </script> </head> <body> <h3> Tabel pendaftaran pengguna </h3> <font color = "red"> $ {pesan} </font> <form Action = "$ {pageContext.Request.contextPath}/regist" OnsubMit = "Return Validate ();" Method = "POST"> <able> <tr> <td> Nama pengguna </td> <td> <input type = "text" name = "username" id = "username1" v> </td> </tr> <tr> <td> </td> </td </td </td </td </td> </td </td> </td </td> </td </td> </td> </td> </td </td> </td </td> </td </td> </t ty </td> </t ty </td> </t t tr> </t t tr> </t t tr> </t tR> </TR> TRET/TR/TR/TR/TR/TR/TR/TR/TR/TR/TR/TRD> 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 = "email" id = "email"> </td> </tr> <tr> <td> Kode verifikasi </td> <td> <input type = "text" name = "checkCode"> <img src = "$ {pagecontex id = "gambar" ontClick = "gantiMage ();"> </td> </tr> <tr> <td> </td> <td> <input type = "kirim" value = "pendaftaran"> </td> </tr> </able> </form> </body> </html> Tentukan model
Model Pengguna:
paket com.vs2022.model; pengguna kelas publik {private string username; kata sandi string pribadi; nama panggilan string pribadi; email string pribadi; // alt+ shft+ s // kotak dialog untuk metode impliting muncul. string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; } public string getNickName () {return nickname; } public void setNickName (nickname string) {this.nickname = nickName; } public String geteMail () {return email; } public void seteMail (string email) {this.email = email; }}Model Pengguna
Paket com.vs2022.model; impor com.vs2022.utils.dbutil; kelas publik operasi {public static int usernameexist = 1; public final static int emailExist = 2; Sukses int statis final publik = 3; int static int static fag = 4; Registrasi int publik (pengguna pengguna) {dbutil db = dbutil baru (); if (db.serchusername (user.getusername ())) {// menunjukkan bahwa nama pengguna sudah ada mengembalikan usernameExist; } if (db.serchemail (user.geteMail ())) {// Ini berarti bahwa alamat email sudah ada. Mengembalikan emailExist; } // Jika Anda berjalan di sini, itu berarti nama pengguna alamat email tidak disimpan, jadi biarkan mendaftar. Tambahkan ke database db.updateUser (pengguna); Sukses kembali; } Public Int Login (pengguna pengguna) {dbutil db = dbutil baru (); if (db.loginsuccess (user.getUserName (), user.getPassword ())) {// itu berarti bahwa nama pengguna dan kata sandi ditemukan. Keberhasilan pengembalian benar; } return fag; }} Model kode checkC
paket com.vs2022.model; import java.awt.color; impor java.awt.font; impor java.awt.graphics; impor java.awt.image.bufferedimage; impor java.io.ioException; impor java.io.outputStream; impor java.util.hashtable; impor javax.imageio.imageio; impor javax.servlet.servletException; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; Impor javax.servlet.http.httpsession; kelas publik checkCode {private string getRandomString () {int rannum = (int) (math.random () * 9000) + 1000; return rannum + "";} public void getCode (Lebar int, tinggi int, httpservletRequest, httpservletResponse response) melempar servletException, ioException {// Buat gambar dalam memori bufferedImage = BufferedImage baru (lebar, ketinggian, bufferedimage.type_intedmage) baru (lebar, tinggi, bufferedimage.type.intype_intbedmage) baru); Grafik g = image.getGraphics (); // Buat objek grafis, fungsinya setara dengan kuas g.setColor (color.getColor ("f8f8f8")); g.fillrect (0, 0, lebar, tinggi); // Gambarkan latar belakang font mfont = font baru ("Kaiti", font.bold, 16); // Tentukan gaya font G.SetFont (MFONT); // atur font g.setColor (color.red); // menghasilkan string nomor acak rans = getRandomString (); // Tulis nomor acak ke sesi httpsession sesi = request.getSession (); session.setAttribute ("centang", rans); // Tulis nomor acak ke gambar g.drawstring (rans, 5, 20); // gambar efektif g.dispose (); // output gambar gambaro.write (gambar, "jpeg", response.getoutputStream ());}} Tentukan pengontrol
Kelas Loginservlet
paket com.vs2022.controller; import java.io.ioException; impor java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.htpservletrequest; import; comax.servlet.http.htpservletrequest; com.vs2022.model.useroperation; LogInservlet kelas publik memperluas httpservlet {public void doGet (httpservletRequest, httpservletResponse respons String password = request.getParameter ("password"); Pengguna pengguna = pengguna baru (); user.setusername (nama pengguna); user.setPassword (kata sandi); // Hubungi Kelas JavaBean Fungsi Bisnis untuk mengimplementasikan logika bisnis spesifik Login UserOperation US = Pengguna baru (); // nilai pengembalian? int i = us.login (pengguna); if (i == 4) {// Ini menunjukkan bahwa login gagal, nama pengguna atau kata sandi salah permintaan.setAttribute ("pesan", "Nama pengguna atau kata sandi salah"); request.getRequestDispatcher ("Login.jsp"). Forward (Request, Response); } else {// Login berhasil, lompat ke beranda situs web, gunakan pengalihan // simpan nama pengguna ke domain sesi request.getSession (). setattribute ("username", username); response.sendredirect ("index.jsp"); //request.getRequestDispatcher("Index.jsp").forward(request, respons); }} public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}Kelas regisServlet
paket com.vs2022.controller; import java.io.ioException; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletresponse; import com.sun.org.apache.commons.beanutils.beanutils; impor com.vs2022.model.user; impor com.vs2022.model.useroperation; kelas publik registservlet memperluas htpsver {model.useroperation; kelas publik registservlet extends htpsver {model.useroperation; kelas publik Respons httpservletResponse) melempar servletException, ioException {// menyelesaikan permintaan kode kacau.setcharacterencoding ("UTF-8"); // Lengkapi verifikasi kode verifikasi string checkCode = request.getParameter ("checkCode"); String check_code_session = (string) request.getSession (). GetAttribute ("check"); if (checkCode == null ||! checkCode.equals (check_code_session)) {// menunjukkan bahwa kode verifikasi tidak benar meminta.setAttribute ("pesan", "Kode verifikasi yang salah adalah input salah"); request.getRequestDispatcher ("regist.jsp"). Maju (permintaan, respons); kembali; } // Jika Anda sampai di sini, itu berarti semua verifikasi telah berlalu, dan panggilan tersebut melibatkan pemrosesan logika bisnis. Pengguna pengguna = pengguna baru (); // Beanutils menyelesaikan enkapsulasi data menjadi objek Java Bean, Apache Sebuah toples open source implementasi yayasan. Coba {// Prasyarat: Nama bidang JavaBean harus konsisten dengan kunci nilai yang dikirimkan dalam formulir, jika tidak enkapsulasi tidak dapat diselesaikan. Beanutils.populate (user, request.getParametermap ()); } catch (Exception e) {E.PrintStackTrace (); Lempar RuntimeException baru ("Maaf, data enkapsulasi gagal"); } // Jadi kelas kacang java baru akan dirancang untuk mengimplementasikan operasi pengguna logika US = operasi pengguna baru (); coba {int feedback = us.regist (user); if (umpan balik == UserOperation.emailExist) {// menunjukkan bahwa alamat email sudah ada request.setAttribute ("pesan", "alamat email sudah ada"); request.getRequestDispatcher ("regist.jsp"). Maju (permintaan, respons); } lain jika (umpan balik == UserOperation.usernameExist) {// menunjukkan bahwa nama pengguna sudah ada request.setAttribute ("pesan", "Nama pengguna sudah ada"); request.getRequestDispatcher ("regist.jsp"). Maju (permintaan, respons); } else {// menunjukkan bahwa pendaftaran berhasil dan melompat ke halaman login. Untuk menggunakan response redirect.sendredirect ("login.jsp"); }} catch (Exception e) {e.printstacktrace (); Lempar RuntimeException baru ("Tambahkan Gagal"); }} public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }}Kelas CheckImageServlet
paket com.vs2022.controller; import java.io.ioException; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; import javax.servlet.http.HttpServletResponse;import com.vs2022.model.CheckCode;public class CheckImageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Disable cache, every time you visit this page, Regenerate Response.SetHeader ("Pragma", "No-Cache"); response.setheader ("cache-control", "no-cache"); response.setDateheader ("kedaluwarsa", 0); response.setContentType ("Image/JPEG"); Int Width = 40; tinggi int = 30; // menghasilkan objek anonim dari kode verifikasi dan menghasilkan kode verifikasi newcode baru (). GetCode (lebar, tinggi, permintaan, respons); } public void dopost (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {doGet (permintaan, respons); }} Tentukan kelas alat
Kelas dbutil
paket com.vs2022.utils; import java.sql.*; impor com.vs2022.model.user; kelas publik dbutil {boolean binited = false; // Muat driver public void initjdbc () melempar ClassNotFoundException {// Muat MySQL JDBC Driver class.forname ("com.mysql.jdbc.driver"); Binited = true; System.out.println ("Sukses Memuat Driver MySQL!"); } koneksi publik getConnection () melempar ClassNotFoundException, SQLException {if (! Binited) {initjdbc (); } // URL koneksi adalah JDBC: MySQL // Alamat Server/Nama Basis Data // Dua parameter berikut adalah Login Nama Pengguna dan Kata Sandi Conn = DriverManager.getConnection ("JDBC: MySQL: // LocalHost: 3306/Database", "nama pengguna", "kata sandi"); return conn; } public boolean loginsuccess (string username, string password) {boolean returnValue = false; String sql = "pilih * dari pengguna di mana nama pengguna =? Dan kata sandi =?"; Koneksi conn = null; Disiapkan ps = null; int i = 0; coba {conn = getConnection (); ps = conn.preparestatement (SQL); ps.setstring (1, nama pengguna); ps.setstring (2, kata sandi); Hasil rs = ps.executeQuery (); if (rs.next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; } Public Boolean UpdateAser (pengguna pengguna) {boolean flag = false; int i = 0; Koneksi conn = null; Disiapkan ps = null; String sql = "masukkan ke pengguna (nama pengguna, kata sandi, nama panggilan, email) (?,?,?,?)"; coba {conn = getConnection (); ps = conn.preparestatement (SQL); ps.setstring (1, user.getusername ()); // Tetapkan nilai untuk placeholder. Pesanan placeholder dimulai dari 1. Parameter pertama adalah posisi placeholder, dan parameter kedua adalah nilai placeholder. 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 (); } mengembalikan bendera; } public boolean serchusername (string username) {boolean returnValue = false; String sql = "pilih * dari pengguna di mana nama pengguna =?"; Koneksi conn = null; Disiapkan ps = null; coba {conn = getConnection (); ps = conn.preparestatement (SQL); ps.setstring (1, nama pengguna); Hasil rs = ps.executeQuery (); if (rs.next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; } public boolean serchemail (email string) {boolean returnValue = false; String sql = "pilih * dari pengguna di mana email =?"; Koneksi conn = null; Disiapkan ps = null; int i = 0; coba {conn = getConnection (); ps = conn.preparestatement (SQL); ps.setstring (1, email); Hasil rs = ps.executeQuery (); if (rs.next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; }}