Di bawah ini, kami akan memperkenalkan contoh kode Javaweb untuk mengimplementasikan login pengguna dan fungsi pendaftaran melalui gambar dan teks. Mari kita lihat.
1. Pengantar Servlet+JSP+Javabean Development Model (MVC)
SERVLET+JSP+JAVABEAN MODE (MVC) Cocok untuk mengembangkan aplikasi web yang kompleks. Dalam mode ini, Servlets bertanggung jawab untuk memproses permintaan pengguna, JSP bertanggung jawab untuk tampilan data, dan Javabean bertanggung jawab untuk merangkum data. Program Mode Servlet+JSP+Javabean memiliki tingkat yang jelas antara modul, dan pengembangan web disarankan untuk menggunakan mode ini.
Di sini kami menggunakan program pendaftaran login pengguna yang paling umum digunakan untuk menjelaskan model pengembangan Servlet+JSP+JavaBean. Melalui program pendaftaran login pengguna ini, kami menghubungkan titik -titik pengetahuan XML, XPath, Servlet, dan JSP yang telah kami pelajari sebelumnya.
2. Buat proyek web dengan arsitektur MVC
Buat proyek WebMVCFramework baru di Myeclipse, impor Paket Pengembangan (Paket JAR) yang diperlukan oleh proyek, dan buat paket yang diperlukan oleh proyek. Dalam pengembangan Java, tingkat arsitektur tercermin dalam bentuk paket
| Paket Pengembangan (Paket JAR) Diperlukan oleh Proyek | ||
| Nomor seri | Nama Paket Pengembangan | menggambarkan |
| 1 | dom4j-1.6.1.jar | DOM4J digunakan untuk memanipulasi file XML |
| 2 | jaxen-1.1-beta-6.jar | Digunakan untuk mengurai ekspresi xpath |
| 3 | Commons-Beanutils-1.8.0.jar | Kelas alat untuk memproses benda kacang |
| 4 | Commons-logging.jar | Paket Jar Ketergantungan Commons-Beanutils-1.8.0.jar |
| 5 | jstl.jar | pustaka tag jstl dan paket ketergantungan ekspresi el |
| 6 | Standard.jar | pustaka tag jstl dan paket ketergantungan ekspresi el |
Arsitektur proyek Javaweb yang baik harus memiliki 11 paket di atas, yang membuatnya jelas dan tanggung jawab antara setiap lapisan yang jelas. Saat membangun arsitektur proyek Javaweb, buat paket dalam urutan 1 hingga 11 di atas: domain → dao → dao.impl → service → service.impl → web.controller → web.ui → Web.filter → Web.listen → util → junit.test. Setelah level paket dibuat, arsitektur proyek akan ditentukan. Tentu saja, dalam pengembangan proyek yang sebenarnya, mungkin tidak sepenuhnya didasarkan pada
| Paket yang Diperlukan untuk Proyek | |||
| Nomor seri | Nama paket | menggambarkan | Tingkat |
| 1 | me.gacl.domain | Kelas Javabean yang menyimpan sistem (hanya berisi atribut sederhana dan mendapatkan dan menetapkan metode yang sesuai dengan atribut, dan tidak termasuk metode pemrosesan bisnis tertentu), disediakan untuk [lapisan akses data], [lapisan pemrosesan bisnis], dan [lapisan web] untuk digunakan | Lapisan domain (model domain) |
| 2 | me.gacl. Dao | Kelas antarmuka operasi yang menyimpan akses ke database | Lapisan akses data |
| 3 | me.gacl. dao.impl | Kelas implementasi yang menyimpan antarmuka operasi yang mengakses database | |
| 4 | me.gacl. melayani | Kelas Antarmuka Bisnis Sistem Pemrosesan | Lapisan Pemrosesan Bisnis |
| 5 | me.gacl. service.impl | Kelas implementasi untuk menyimpan antarmuka bisnis sistem pemrosesan | |
| 6 | me.gacl. Web.Controller | Servlets disimpan sebagai pengontrol sistem | Lapisan Web (Lapisan Presentasi) |
| 7 | me.gacl.web.ui | Servlets (UI mengacu pada antarmuka pengguna) yang menyediakan antarmuka pengguna untuk pengguna | |
| 8 | me.gacl.web.filter | Filter digunakan untuk sistem penyimpanan | |
| 9 | me.gacl.web.listener | Pendengar biasa menyimpan sistem | |
| 10 | me.gacl .util | Alat Umum untuk Menyimpan Sistem, Disediakan untuk [Lapisan Akses Data], [Lapisan Pemrosesan Bisnis], dan [Lapisan Web] untuk digunakan | |
| 11 | junit.test | Kelas uji untuk menyimpan sistem | |
Seperti disebutkan di atas, kami membuat hierarki paket, tetapi berdasarkan situasi aktual proyek, kami mungkin juga perlu membuatnya.
Tasnya, ini tergantung pada kebutuhan proyek.
Di bawah Direktori SRC (Direktori Kategori), Buat File XML (DB.XML) untuk menyimpan data pengguna (DB.XML)
Buat direktori halaman di direktori web-inf. Direktori halaman menyimpan beberapa halaman JSP yang dilindungi dari sistem (tidak memungkinkan pengguna untuk mengakses langsung melalui alamat URL). Jika pengguna ingin mengakses halaman JSP yang dilindungi ini, mereka hanya dapat menggunakan servlet di paket ME.GACL.WEB.UI
Proyek yang dibuat ditunjukkan pada gambar berikut (Gambar-1):
Gambar-1
3. Penulisan Kode Arsitektur Hirarki
The code of the hierarchical architecture is also written in the order of [Domain Model Layer (domain)] → [Data Access Layer (dao, dao.impl)] → [Business Processing Layer (service, service.impl)] → [Expression Layer (web.controller, web.UI, web.filter, web.listener)] → [Tool Class (util)] → [test Class (junit.test)].
3.1. Kembangkan lapisan domain
Buat kelas pengguna di bawah paket ME.GACL.Domain
Kode spesifik kelas pengguna adalah sebagai berikut:
Paket Me.Gacl.Domain; impor java.io.serializable; import java.util.date;/*** @author gacl*kelas entitas pengguna*/kelas publik menerapkan serial yang dapat diisiasi {private sulut final sterialversionuid = -l; // pengguna Pengguna ID ID IDSTRIVATE STRING ID; // namanya Pengguna USRIER/USER PRIVE SERIALVERSION; Ulang Tahun Tanggal Pribadi, Ulang Tahun; Public String getId () {return id;} public void setid (string id) {this.id = id;} public string getUserName () {return username;} public void setusername (string userName) {this.userName = Username;} public string getuserpwd () {this.userName = USERName;} public string getuserpwd () {this.userName = USERName;} public string getuserpwd () {this.userName = USERName;} public string getuserpwd () {this.username {this.userpwd = userpwd;} public string geteMail () {return email;} public void seteMail (string email) {this.email = email;} tanggal publik getBirthday () {return ulang tahun;} public void setBirthday (tanggal ulang tahun) {this.birthday = ulang tahun;3.2. Kembangkan Lapisan Akses Data (DAO, DAO.Impl)
Buat kelas antarmuka IUSERDAO di bawah paket ME.GACL.DAO. Untuk kelas antarmuka pengembangan, saya terbiasa menggunakan huruf I sebagai awalan kelas, sehingga Anda dapat melihat sekilas bahwa kelas saat ini adalah antarmuka, yang juga merupakan kebiasaan pengembangan yang baik. Dengan melihat nama kelas, Anda dapat dengan mudah membedakan apakah itu antarmuka atau kelas implementasi tertentu.
Kode spesifik antarmuka iuserdao adalah sebagai berikut:
Paket me.gacl.dao; import me.gacl.domain.user; antarmuka publik iuserdao {/*** Temukan pengguna berdasarkan nama pengguna dan kata sandi* Username @param* @param Userpwd* @Return Pengguna yang ditemukan*/User find (string username, string Userpwd);/*** User Tambah Pengguna*/User find (String Username, String UserPWD);/*** Pengguna* Pengguna* Pengguna* Pengguna* VOOD/VOOD USERNAME, String UserPWD);/*** USERA Pengguna Nama* Username @param* @return Pengguna yang ditemukan*/pengguna temukan (nama pengguna String);}Untuk definisi metode dalam antarmuka, ini hanya dapat menganalisis metode mana yang perlu didefinisikan berdasarkan bisnis tertentu. Namun, tidak peduli seberapa rumit bisnisnya, tidak dapat dipisahkan dari operasi dasar (penambahan, penghapusan, modifikasi dan kueri). Lapisan DAO secara langsung berinteraksi dengan database, sehingga antarmuka lapisan DAO umumnya memiliki empat metode terkait untuk menambahkan, penghapusan, modifikasi, dan kueri.
Buat kelas UserdaoImpl di bawah paket ME.GACL.DAO.IMPL
Kelas userdaoImpl adalah kelas implementasi spesifik dari antarmuka IUSERDAO. Untuk metode penamaan kelas implementasi antarmuka, saya terbiasa menamainya dalam bentuk "nama antarmuka (hapus awalan i) + impl" atau "nama antarmuka + impl": iuserdao (antarmuka) → iUserdaImpl (kelas implementasi) atau iuserdao (antarmuka) → IUSERDAIMPL (Kelas Implementasi) atau IUSERDAO (antarmuka) → IUSERDAIMPL (Kelas Implementasi) atau IUSERDAO. Ini juga merupakan kebiasaan pemrograman pribadi. Sebagian besar kode yang saya lihat biasanya menyebutkan kelas implementasi spesifik antarmuka dalam salah satu dari dua bentuk ini. Bagaimanapun, Anda harus dapat melihat kelas implementasi mana yang sesuai dengan antarmuka sekilas.
Kode spesifik kelas userdaoImpl adalah sebagai berikut:
Paket Me.Gacl.DAO.Impl; Impor Java.Text.SimpledateFormat; Impor org.domj.document; impor org.dom.element; impor Me.gacl.dao.iuserdao; impor Me.gacl.domain.user; impor Me.Gacl.Util.xmlAnAon (PRICLAUS; gacl*/kelas publik userdaoImpl mengimplementasikan iuserdao {@Overridepublic User find (string username, string userpwd) {coba {dokumen dokumen = xmlutils.getDocument (); // menggunakan xpath untuk memanipulasi xml nodeselement e = (element) documentlects. @UserPwd = '"+userpwd+"'] "); if (e == null) {return null;} pengguna pengguna = baru User (); user.setId (e.attributeValue ("id")); user.setemail (e.attributeValue ("email")); user.setuserpwd (e.attributevalue ("userpwd"); User.setusername (e.attributevalue ("username"); string = sang suhu = ulang tahun (e.attributevalue ("username"); E. SimpleDateFormat("yyyy-MM-dd");user.setBirthday(sdf.parse(birth));return user;}catch (Exception e) {throw new RuntimeException(e);}}@SuppressWarnings("deprecation")@Overridepublic void add(User user) {try{Document document = XmlUtils.getDocument();Element root = document.getrooteLement (); elemen user_node = root.addelement ("user"); // Buat simpul pengguna dan gantung ke rootuser_node.setAttributeValue ("id", user.getId ()); user_node.setattributeValue ("userName", user.getuserName ()); engging, ") (") ("Userpwd", Userpwd (), "Userpwd () (" Userpwd ", Userpwd () (" UserPwd ("UserPWD", USERPWD () ("UserPWD", USERPWD ("USERPWD (" user.geteMail ()); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-mm-dd"); user_node.setattributeValue ("ulang tahun", sdf.format (user.getbirthday ())); xmlutils.writexml (dokumen);} catch (document) {uccleRday ()); RuntimeException (e);}}@overridepublic pengguna temukan (string username) {coba {dokumen dokumen = xmlutils.getDocument (); elemen e = (elemen) dokumen.selectsinglenode ("// user [@username = '"+username+"']"); if (e == @username = '"+{{{@username = {{@username = {@username = User (); user.setId (e.attributeValue ("id")); user.setemail (e.attributeValue ("email")); user.setuserpwd (e.attributevalue ("userpwd"); User.setusername (e.attributevalue ("username"); string = sang suhu = ulang tahun (e.attributevalue ("username"); E. SimpleDateFormat ("yyyy-mm-dd"); user.setBirthday (sdf.parse (kelahiran)); pengembalian pengguna;} catch (pengecualian e) {lempar runtimeException baru (e);}}}3.3. Lapisan Layanan Pengembangan (lapisan layanan menyediakan semua layanan bisnis ke lapisan web)
Buat kelas antarmuka IUSERSERVICE di paket ME.GACL.Service
Kode spesifik antarmuka IUSERService adalah sebagai berikut:
Paket me.gacl.service; impor me.gacl.domain.user; impor me.gacl.exception.userExistException; antarmuka publik iuserservice {/*** Menyediakan layanan pendaftaran* @param pengguna* @throws UserexistException*/void Layanan Pengguna (Pengguna Pengguna) Throws @ProwserexistException*/void userpwd* @return*/user LoginUser (string username, string userpwd);}Buat Kelas UserserServiceImpl di paket Me.gacl.service.impl
Kelas USERSERVICEIMPL adalah kelas implementasi spesifik dari antarmuka IUSERService. Kode spesifiknya adalah sebagai berikut:
Paket me.gacl.service.impl; import me.gacl.dao.iuserdao; impor me.gacl.dao.impl.userdaImpl; priveIcl COLMPERICEICLEICLEICLEICECLEICECLEICECLEICECLEICEICEICEICEICEICEICECLEMLICE; Iuserdao userdao = UserdaoImpl baru ();@overridepublic void Register (pengguna pengguna) melempar UserExistException {if (userdao.find (user.getuserName ()! = Null) {// pengecualian priverion (ucapan ucapan. Lempar UserExistException baru ("Nama pengguna yang terdaftar sudah ada !!!");} userdao.add (user);}@overridepublic pengguna loginuser (nama pengguna string, string userpwd) {return userdao.find (username, userpwd);}}3.4. Kembangkan lapisan web
3.4.1. Kembangkan fungsi pendaftaran
1.
Setelah menerima permintaan pengguna, RegisterUiservlet melompat ke register.jsp
Kode Registeruiservlet adalah sebagai berikut:
Paket me.gacl.web.ui; impor java.io.ioexception; impor javax.servlet.servletException; import javax.servlet.http.httpservlet; impor javax.servlet.htp.htpservletreest; impor javax.servlet gacl* Servlet that provides users with registered user interface* RegisterUIServlet is responsible for outputting the registration interface for users* When a user accesses the RegisterUIServlet, it jumps to the register.jsp page in the WEB-INF/pages directory*/public class RegisterUIServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.getRequestDispatcher("/WEB-INF/pages/register.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}2. Tulis Pengguna JSP Halaman Register.jsp di/Web-Inf/halaman/direktori
Halaman JSP apa pun yang terletak di direktori Web-INF tidak dapat diakses secara langsung melalui alamat URL.
Selama pengembangan, jika ada beberapa sumber daya web yang sensitif dalam proyek yang tidak ingin diakses secara langsung oleh dunia luar, Anda dapat mempertimbangkan untuk memasukkan sumber daya web yang sensitif ini ke dalam direktori web-INF, sehingga dunia luar dapat dilarang mengakses langsung melalui URL.
Kode halaman register.jsp adalah sebagai berikut:
<%@ page language = "java" pageEncoding = "utf-"%> <! Doctype html> <html> <head> <title> pendaftaran pengguna </iteme> </head> <body style = "text-lign: center;"> <form Action = "$ {pagecontext.request.contextpath} <form acti method="post"><table><tr><td>Username</td><td><input type="text" name="userName"></td></tr><tr><td>Password</td><td><input type="password" name="userPwd"></td></tr><td>Confirm password</td><td><input type = "password" name = "konfirmasipwd"> </td> </tr> <tr> <td> Email </td> <td> <input type = "text" name = "email"> </td> </tr> <td> </td </td> <td> <input type = "name" name = "tdr> </td </td> <td> <input type =" name "name =" input "> </td </td> <td> <input type =" Text "name =" Ulang Tahun "> type = "reset" value = "clear"> </td> <td> <input type = "kirim" value = "register"> </td> </tr> </able> </form> </body> </html> <Form Action = "$ {pageContext.Request.contextPath}/servlet/registerServlet" Method = "Post"> di Register.jsp menunjukkan bahwa formulir tersebut diserahkan dan diserahkan kepada RegisterServlet untuk diproses
3. Tulis registerServlet untuk menangani pendaftaran pengguna di bawah paket ME.GACL.WEB.Controller
RegisterServlet melayani tanggung jawab berikut:
1. Menerima data formulir yang dikirimkan oleh klien ke server.
2. Verifikasi legalitas data formulir. Jika verifikasi gagal, lompat kembali ke register.jsp dan menggemakan pesan kesalahan.
3. Jika verifikasi dilewati, hubungi lapisan layanan untuk mendaftarkan pengguna dengan database.
Untuk memfasilitasi data registerServlet untuk menerima data formulir dan data formulir verifikasi, saya merancang registerFormBean untuk verifikasi data formulir pendaftaran, dan kemudian menulis kelas alat webutils untuk merangkum data formulir yang dikirimkan oleh klien ke dalam formbean.
Buat registerFormBean untuk memverifikasi data formulir pendaftaran di bawah paket ME.GACL.WEB.FORMBEAN
Kode RegisterFormBean adalah sebagai berikut:
Paket me.gacl.web.formbean; impor java.util.hashmap; impor java.util.map; impor org.apache.commons.beanutils.locale.converters.Datelocaleconverter; Nama item input formulir dalam register.jsp* Tanggung jawab registerFormBean tidak hanya bertanggung jawab untuk menerima nilai item input formulir dalam register.jsp, tetapi juga berfungsi sebagai legalitas dari nilai item input bentuk* @Author gacl **/class public. name = "username"/> Private String username; // <input type = "password" name = "userpwd"/> private string userpwd; // <input type = "kata sandi" nama = "konfirmasipwd"/> string pribadi konfirmasi; // <input type = "teks" nama "name =" email "/> email string private; // <input type =" Text "name =" Email "/Ullanges Private EMAIL; // <input Type =" TEXT "NAME =" Email "/ULANG SULIGE STRING ULANG TERGIGaan; // <input;" Pengguna ketika verifikasi gagal*/peta privat <string, string> errors = new HashMap <string, string> (); peta publik <string, string> getErrors () {errors return;} public void setErrors (peta <String, String> Formulir Input. Nama pengguna tidak bisa kosong, dan jika itu - huruf abcdabcd * string pribadi userpwd; Kata sandi tidak bisa kosong, dan jika ya - nomor * string pribadi konfirmasiPWD; Kata sandi harus sama dengan email string pribadi dua kali; Itu bisa kosong, tidak kosong jika itu adalah kotak surat legal* Ulang tahun string pribadi; Ini bisa kosong, tidak kosong, jika itu adalah tanggal hukum*/public boolean validate () {boolean isok = true; if (this.username == null || this.username.trim (). Equals ("")) {isok = false; errors.put ("username", "nama pengguna tidak bisa kosong!"); (! this.username.matches ("[a-za-z] {,}")) {isok = false; errors.put ("nama pengguna", "nama pengguna harus menjadi surat dari -bit !!");}} if (this.userpwd == null || this.userpwd.trim (). " false; errors.put ("userpwd", "Kata sandi tidak bisa kosong !!");} else {if (! this.userpwd.matches ("// d {,}")) {isok = false; errors.put ("userpwd", "private harus menjadi sejumlah -bits !!");}}}}}, " Kata sandi harus sama ketika dua kali adalah (this.confirmPwd! = Null) {if (! This.confirmPwd.equals (this.userpwd)) {isok = false; errors.put ("confirmwd", "kata sandi tidak konsisten ketika dua kali bukan nol !!");}}}}}}}}}}}}}}}}}; Itu bisa kosong, bukan nol. Jika ini adalah email hukum jika (this.email! = Null &&! This.email.trim (). Equals ("")) {if (! This.email.matches ("// w+@// w+(// w+)+")) {isok = false; errors.put ("email", "kotak surat bukan kotak surat !! Dapat kosong, tidak kosong, jika itu adalah tanggal hukum jika (this.birthday! = Null &&! This.birthday.trim (). Equals ("") {coba {datelocaleconverter convert = new Dataelocaleconverter (); conver.convert (this.birthday) new datelocaleConverter (); conver.convert (this.birthday);}}}}}}}}}}}} new (ini. menjadi tanggal !! ");}} return isok;} public string getUserName () {return username;} public void setusername (string username) {this.userName = username;} public string getUserpwd () {return userpwd;} public void setuserpwd (string UserPwd () {thiserpwd; getConfirmPwd () {return confirmpwd;} public void setConfirmPwd (string confirmpwd) {this.confirmPwd = konfirmasipwd;} public string getemail () {return email;} public void seteMail (string email) {this.email = email; {} get getBirte publiced (string email) {this.email = email; {} get getBirte publiced (string email) {this.email = email;} get getBirTy publiced (string email) {this.email = email; {} get getBirTy publiced (string email) {this.email = email;} get getBirt Publay (string email) {this. {this.birthday = ulang tahun;}}Buat kelas alat WebUtils di bawah paket ME.GACL.UTIL. Fungsi kelas alat ini adalah merangkum data formulir yang dikirimkan oleh klien ke dalam formbean
Paket Me.Gacl.util; impor java.util.enumeration; import java.util.uuid; import javax.servlet.http.httpservletrequest; org.apache.commons {/*** Konversi objek permintaan menjadi objek T* @param permintaan* @param clazz* @return*/public static <t> t requestBean (httpservletRequest, class <t> clazz) {coba {t bean = clazz.newinstance (); enumeration <string> e = request.getParameternams (); enumeration <string> e = request.getParameternams (); while (e.hasmoreElements ()) {string name = (string) e.nextElement (); string value = request.getParameter (name); beanutils.setproperty (bean, name, value);} return bean;} catch (excecping e) {lempar runimeexception baru (e);}} {excepty e) {lempar runimeexception baru (e);}} {exception e) {lempar runimeeException baru (e);}} {Exception e) {lempar runimeeException @ @ @{e) Uuid.randomuuid (). Tostring ();}}Akhirnya, mari kita lihat kode lengkap registerServlet yang bertanggung jawab untuk menangani pendaftaran pengguna:
Paket me.gacl.web.controller; import java.io.ioException; impor java.util.date; import javax.servlet.servletException; import javax.servlet.http.httpservlet; impor javax.servlet.http.httpservet; javax.servlet.http.httpservletResponse; impor org.apache.commons.beanutils.beanutils; impor org.apache.commons.beanutils.converTutils; Impor org.apache.commons.beanutils.locale.converter.comer.datel ;comaleComons.beanutils.locale.converters.datelcom; me.gacl.exception.userExistException; impor me.gacl.service.iuserservice; import me.gacl.service.impl.userserviceImpl; impor me.gacl.util.webutils; import me.gacl.web.formbean.registerformbean;//* RegisterServlet memperluas httpservlet {public void doGet (httpservletRequest, httpservletResponse response) melempar servletException, ioException {// Encapsulate data yang diserahkan oleh klien ke dalam regregeForForFerbean Formbean formbean = WebUtils.requal.requans Onmest. Pendaftaran Pengguna Jika (FormBean.Validate () == false) {// Jika verifikasi gagal // Kirim objek formulir yang merangkum data formulir yang diisi oleh pengguna kembali ke formulir pada halaman register.jsp untuk menampilkan permintaan. register.jspRequest.getRequestDispatcher ("/web-inf/pages/register.jsp"). Forward (request, response); return;} pengguna pengguna = pengguna baru (); coba {//convertutils.Register(new DataCalEconverter (), date.class); beanutils.copypopores (), fongbean (date date.class); beanutils.copypoperes (), fongbean (date date.class); beanutils.copypoperes (), fongbean (date date.class); beanutils.copypoper user.setId (webutils.makeId ()); // atur properti ID pengguna iUserservice service = UserserServiceImpl baru (); // hubungi layanan pengguna terdaftar yang disediakan oleh layer layanan untuk mencapai layanan pendaftaran pengguna.RegisterUser (pengguna); String message = string.format ("Terdaftar dengan sukses!! Ini akan secara otomatis melompat ke halaman login untuk Anda dalam hitungan detik !! <meta http-equiv = 'refresh' content = '; url =%s'/>", request.getContextPath ()+"/servlet/loginuiservlet"); request.setAttribute ("pesan", pesan); request.getRequestDispatcher ("/message.jsp"). Maju (request, response);} catch (userexistException e) {formbean.geterrors (). ada !! "); request.setAttribute (" formbean ", formbean); request.getRequestDispatcher ("/web-inf/pages/register.jsp "). Maju (permintaan, respons);} catch (pengecualian e) {e.printstacktrace (); // Record exception in the background request.setAttribute("message", "Sorry, registration failed!!");request.getRequestDispatcher("/message.jsp").forward(request,response);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}Jika verifikasi data formulir diisi gagal ketika pengguna mendaftar, server akan menyimpan objek Formbean dengan pesan kesalahan dan data formulir di objek permintaan, dan kemudian mengirimkannya kembali ke halaman register.jsp. Oleh karena itu, kita perlu mengambil objek Formbean di objek permintaan dari halaman register.jsp, dan kemudian mengajukan kembali data formulir yang diisi oleh pengguna ke item formulir yang sesuai, dan juga menampilkan pesan cepat ketika kesalahan terjadi pada formulir, sehingga pengguna tahu data mana yang ilegal untuk diisi!
Ubah halaman register.jsp, kode ini sebagai berikut:
<%@ page language = "java" pageEncoding = "utf-"%> <! Doctype html> <html> <head> <title> pendaftaran pengguna </iteme> </head> <body style = "text-lign: center;"> <form Action = "$ {pagecontext.request.contextpath} <form acti Method = "POST"> <able> <tr> <td> Nama pengguna </td> <td> <%-gunakan ekspresi EL $ {} untuk mengekstrak formulir data yang dienkapsulasi dalam objek Formbean yang disimpan dalam objek permintaan (formbean.username) dan pesan kesalahan (formbean.errors.username)-%> <input type = "TEKS =" TEKS = " value = "$ {formbean.username}"> $ {formbean.errors.username} </td> </tr> <tr> <td> Kata sandi </td> <td> <input type = "kata sandi" name = "userpwd" value = "$ {formbean.userpwd}"> $ {formbean.errors.userpwd} </td> </tr> <tr> <td> Konfirmasi Kata Sandi </td> <td> <input type = "kata sandi" nama = "KonfirmasiPWD" value = "$ {formbean.confirmPwd}"> $ {formbean.errors.confirmPwd} </td> </tr> <tr> <td> Email </td> <td> <input type = "Text" name = "Email" value = "$ {formbean.email}"> $ {formbean.errors.email} </td> </tr> <tr> <td> ulang tahun </td> <td> <input type = "teks" nama = "ulang tahun" value = "$ {formbean.birthday}"> $ {formbean.errors.birthday} </td> </tr> <tr> <td> <input type = "reset" value = "clear"> </td> <td> <input type = "submit" value = "register"> </td> <td> <input = "submit" value = "register"> </td> <tmPada titik ini, fungsi pendaftaran pengguna telah dikembangkan!
Berikut menguji fungsi pendaftaran pengguna yang dikembangkan:
Masukkan alamat URL: http: // localhost: 8080/webmvcframework/servlet/registeruiservlet untuk mengakses halaman register.jsp, dan efek operasi adalah sebagai berikut:
Jika item formulir yang dimasukkan tidak mematuhi aturan verifikasi, itu tidak dapat didaftarkan. Efek operasi adalah sebagai berikut:
3.4.2. Kembangkan fungsi login
1.
Setelah Loginuiservlet menerima permintaan pengguna, ia melompat ke login.jsp
Kode Loginuiservlet adalah sebagai berikut:
Paket me.gacl.web.ui; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.htpservletrequest; impor javax.servlet.htp.htpservletreest; impor javax.servlet javax.servlet.http.httpservletResponse;/*** @Author GACL* Loginuiservlet bertanggung jawab untuk mengeluarkan antarmuka login untuk pengguna* ketika pengguna mengakses Loginuiservlet, Login Login. DoGet (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {request.getRequestDispatcher ("/web-inf/pages/login. IoException {doGet (request, response);}}2. Tulis halaman login.jsp Login di bawah/web-inf/halaman/direktori
Kode halaman login.jsp adalah sebagai berikut:
<%@ page language = "java" pageEncoding = "utf-"%> <! Doctype html> <html> <head> <title> login pengguna </iteme> </head> <bod body> <bentuk action = "$ {pageContext.request.contextPath}/servlet/loginservlet" Metode = "POMPECER" POMPENE = "POGECONTEXT. name = "UserName"> <br/> Kata sandi: <input type = "password" name = "password"> <br/> <input type = "kirim" value = "Login"> </form> </body> </html> <Form Action = "$ {pageContext.Request.contextPath}/servlet/LogInservlet" Method = "Post"> di Login.jsp menunjukkan bahwa formulir tersebut diserahkan dan diserahkan ke loginServlet untuk diproses.
3. Tulis LogInServlet untuk menangani login pengguna di bawah paket ME.GACL.WEB.CONTROLLER
Kode LogInservlet adalah sebagai berikut:
Paket me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.htp.httpservletequest; impor javax.servlet me.gacl.domain.user; import me.gacl.service.iuserService; impor me.gacl.service.impl.userserviceImpl;/*** servlet menangani login pengguna*@author gacl **/class public LogInservlet memperluas httpservlet {public void DOGEGRPSRPSPSRPSRPSERVLETSERVLET ServletException, ioException {// Dapatkan nama pengguna Login diisi oleh pengguna UserName string = request.getParameter ("nama pengguna"); // Dapatkan kata sandi login yang diisi oleh UserServiceMlSImIml (), "kata sandi"); iuserservice service = new UserServiceMpl ();//User lordeer "LAYANAN USERSERVICE = USERSERVERSERVICERIMPL ();//User LOGINE = IUSERService Layanan = UserServerServiceMpl ();//User LOGINE = IUserService Layanan = UserserServiceMpl ();//User LOGINE = IUserService Layanan = UserSerServiceMl ();//User LOPINECE. kata sandi); if (user == null) {string message = string.format ("Maaf, nama pengguna atau kata sandi salah !! silakan masuk lagi! Anda akan secara otomatis melompat ke halaman login dalam hitungan detik !! <meta http-equiv = 'refresh' konten = '; url =%s' ", request.getContextPath ()+"/servlet/loginuiserVlet "); request.setattribute (" pesan ", pesan); pengembalian. request.getSession (). setAttribute ("user", user); string message = string.format ("ucapan selamat: %s, login berhasil! Halaman ini akan melompat ke beranda dalam hitungan detik !! <meta http-equiv = 'refresh' konten = '; url = %s'", user.getUserName (), request.getContextPath ()+"/index.jsp"); request.setAttribute ("pesan", pesan); request.getRequestDispatcher ("/pesan. {doGet (request, response);}}Pada titik ini, fungsi login pengguna telah selesai.
Di bawah ini, uji fungsi login pengguna yang dikembangkan, masukkan alamat URL: http: // localhost: 8080/webmvcframework/servlet/loginuiservlet untuk mengakses halaman login.jsp, masukkan nama pengguna dan kata sandi yang benar untuk masuk, efek operasinya adalah sebagai berikut:
Jika nama pengguna dan kata sandi yang dimasukkan tidak benar, maka login tidak dapat berhasil masuk, dan efek operasinya adalah sebagai berikut:
3.4.3. Kembangkan fungsi Batal
Tulis LogoutServlet untuk menangani logout pengguna di bawah paket ME.GACL.WEB.Controller
Kode LogoutServlet adalah sebagai berikut:
Paket me.gacl.web.controller; import java.io.ioexception; import java.text.messageFormat; import javax.servlet.servletException; impor javax.servlet.http.htpservlet; impor javax.servlet.htp.htpservlet; impor javax.servlet.htp.htpservlet; impor javax.servlet.htp.htpservlet; javax.servlet.http.httpservletResponse; LogoutServlet kelas publik memperluas httpservlet {public void doGet (httpservletRequest, httpservletResponse respons) Melempar servletException, ioException {// Hapus objek pengguna yang tersimpan dalam sesi ini ke dalam sesi ini untuk mengimplementasikan The Sesi ke Sesi ke dalam Sesi ke dalam Sesi yang tersimpan dalam Sesi dalam Sesi yang tersimpan dalam SESI PENGGUNAAN DALAM PENGGUNAAN PENGGUNA request.getSession (). RemoveAttribute ("User"); // Karena string berisi satu kutipan, akan ada masalah saat menggunakan metode MessageFormat.Format untuk menyambungkan string dalam kasus ini //MessageFormat. Metode LOVETATES LOUTSTATED (MESSTRETIONAL LOUTFORTED. dalam detik !! <meta http-equiv = 'refresh' content = '; url = {}'/> ", request.getContextPath ()+"/servlet/loginuiservlet "); System.out.println (tempstr); // Hasil output: Logout berhasil! Lai Ini akan secara otomatis melompat ke halaman login untuk Anda dalam hitungan detik! Lai <meta http-equiv = refresh content=;url={}/>System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- content='';url={}''/>","index.jsp") can return normally * <meta http-equiv=''refresh'' content='';url=index.jsp'/>*/String tempStr = MessageFormat.format("Login successfully!! It will automatically jump to the login page in seconds!! <meta http-equiv=''refresh'' content='';url={}''/>", request.getContextPath()+"/servlet/LoginUIServlet");/*** Output result: *Login successfully! Lai It will automatically jump to the login page for you in seconds! Lai * <meta http-equiv='refresh' content=';url=/webmvcframework/servlet/LoginUIServlet'//System.out.println(tempStr);String message = String.format("Logout successfully!! Automatically jump to the login page in seconds!! <meta http-equiv='refresh' content=';url=%s'/>", request.getContextPath()+"/servlet/LoginUIServlet");request.setAttribute("message",message);request.getRequestDispatcher("/message.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, tanggapan);}}用户登录成功后,会将登录的用户信息存储在session中,所以我们要将存储在session中的user删除掉,这样就可以实现用户注销了。
用户登录成功后就会跳转到index.jsp页面,在index.jsp页面中放一个【退出登陆】按钮,当点击【退出登陆】按钮时,就访问LogoutServlet,将用户注销。
index.jsp的代码如下:
<%@ page language="java" pageEncoding="UTF-"%><%--为了避免在jsp页面中出现java代码,这里引入jstl标签库,利用jstl标签库提供的标签来做一些逻辑判断处理--%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><!DOCTYPE HTML><html><head><title>首页</title><script type="text/javascript">function doLogout(){//访问LogoutServlet注销当前登录的用户window.location.href="${pageContext.request.contextPath}/servlet/LogoutServlet";}</script></head><body><h>孤傲苍狼的网站</h><hr/><c:if test="${user==null}"><a href="${pageContext.request.contextPath}/servlet/RegisterUIServlet" target="_blank">注册</a><a href="${pageContext.request.contextPath}/servlet/LoginUIServlet">登陆</a></c:if><c:if test="${user!=null}">欢迎您:${user.userName}<input type="button" value="退出登陆" onclick="doLogout()"></c:if><hr/></body></html>测试开发好的注销功能,效果如下:
到此,所有的功能都开发完成了,测试也通过了。
四、开发总结
通过这个小例子,可以了解到mvc分层架构的项目搭建,在平时的项目开发中,也都是按照如下的顺序来进行开发的:
1. Bangun lingkungan pengembangan
1.1 创建web项目
1.2 导入项目所需的开发包
1.3 创建程序的包名,在java中是以包来体现项目的分层架构的
2、开发domain
把一张要操作的表当成一个VO类(VO类只定义属性以及属性对应的get和set方法,没有涉及到具体业务的操作方法),VO表示的是值对象,通俗地说,就是把表中的每一条记录当成一个对象,表中的每一个字段就作为这个对象的属性。每往表中插入一条记录,就相当于是把一个VO类的实例对象插入到数据表中,对数据表进行操作时,都是直接把一个VO类的对象写入到表中,一个VO类对象就是一条记录。每一个VO对象可以表示一张表中的一行记录,VO类的名称要和表的名称一致或者对应。
3、开发dao
3.1 DAO操作接口:每一个DAO操作接口规定了,一张表在一个项目中的具体操作方法,此接口的名称最好按照如下格式编写:“I表名称Dao”。
├DAO接口里面的所有方法按照以下的命名编写:
├更新数据库:doXxx()
├查询数据库:findXxx()或getXxx()
3.2 DAO操作接口的实现类:实现类中完成具体的增删改查操作
├此实现类完成的只是数据库中最核心的操作,并没有专门处理数据库的打开和关闭,因为这些操作与具体的业务操作无关。
4、开发service(service 对web层提供所有的业务服务)
5、开发web层
以上内容是小编给大家介绍的JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式),希望对大家有所帮助!