A continuación, presentaremos el código de ejemplo de Javaweb para implementar la función de inicio de sesión y registro de usuarios a través de imágenes y textos. Echemos un vistazo.
1. Introducción al Servlet+JSP+Modelo de desarrollo de Javabean (MVC)
Servlet+JSP+Javabean Mode (MVC) es adecuado para desarrollar aplicaciones web complejas. En este modo, los servlets son responsables del procesamiento de solicitudes de usuarios, JSP es responsable de la visualización de datos y Javabean es responsable de encapsular datos. El programa Servlet+JSP+Javabean tiene niveles claros entre los módulos, y se recomienda el desarrollo web para usar este modo.
Aquí utilizamos el programa de registro de inicio de sesión de usuario más utilizado para explicar el modelo de desarrollo Servlet+JSP+Javabean. A través de este programa de inicio de sesión del usuario del programa de registro, conectamos los puntos de conocimiento de XML, XPath, Servlet y JSP que hemos aprendido antes.
2. Cree un proyecto web con MVC Architecture
Cree un nuevo proyecto WebMVCFramework en MyEClipse, importe el paquete de desarrollo (paquete JAR) requerido por el proyecto y cree los paquetes requeridos por el proyecto. En el desarrollo de Java, el nivel de arquitectura se refleja en forma de paquete
| Paquetes de desarrollo (paquetes JAR) requeridos por el proyecto | ||
| Número de serie | Nombre del paquete de desarrollo | describir |
| 1 | DOM4J-1.6.1.Jar | DOM4J se usa para manipular archivos XML |
| 2 | Jaxen-1.1-Beta-6.Jar | Se usa para analizar expresiones XPath |
| 3 | Commons-Beanutils-1.8.0.Jar | Clase de herramientas para procesar objetos de frijol |
| 4 | logging de bienes comunes.jar | Commons-Beanutils-1.8.0. Jitar Dependency Jar Paquete |
| 5 | jstl.jar | Biblioteca de etiquetas JSTL y paquete de dependencia de la expresión |
| 6 | Standard.Jar | Biblioteca de etiquetas JSTL y paquete de dependencia de la expresión |
Una buena arquitectura del proyecto Javaweb debe tener los 11 paquetes anteriores, lo que lo deja en claro y las responsabilidades entre cada capa clara. Al construir una arquitectura de proyecto Javaweb, cree los paquetes en el orden de 1 a 11 arriba: Dominio → Dao → Dao.impl → Servicio → Servicio.impl → Web.Controller → Web.UI → Web.Filter → Web.Listener → Util → Junit.Test. Una vez que se crea el nivel de paquete, se determinará la arquitectura del proyecto. Por supuesto, en el desarrollo real del proyecto, puede no estar completamente basado en
| Paquetes requeridos para el proyecto | |||
| Número de serie | Nombre del paquete | describir | Nivel |
| 1 | yo.gacl.domain | La clase de Javabean que almacena el sistema (solo contiene atributos simples y obtiene métodos establecidos correspondientes a los atributos, y no incluye métodos específicos de procesamiento de negocios), proporcionados a [capa de acceso de datos], [capa de procesamiento comercial] y [capa web] para su uso | Capa de dominio (modelo de dominio) |
| 2 | yo.gacl. Dao | La clase de interfaz de operación que almacena acceso a la base de datos | Capa de acceso a datos |
| 3 | yo.gacl. dao.impl | Clase de implementación que almacena la interfaz de operación que accede a la base de datos | |
| 4 | yo.gacl. servicio | Clase de interfaz comercial del sistema de procesamiento de tiendas | Capa de procesamiento de negocios |
| 5 | yo.gacl. servicio.ImpL | Clase de implementación para almacenar interfaz comercial del sistema de procesamiento | |
| 6 | yo.gacl. Web.Controller | Servlets almacenados como controlador del sistema | Capa web (capa de presentación) |
| 7 | me.gacl.web.ui | Servlets (UI se refiere a la interfaz de usuario) que proporciona la interfaz de usuario para los usuarios | |
| 8 | me.gacl.web.filter | Filtro utilizado para el sistema de almacenamiento | |
| 9 | me.gacl.web.listener | Oyente solía almacenar el sistema | |
| 10 | yo.gacl .util | Herramientas comunes para almacenar el sistema, proporcionada a [Capa de acceso de datos], [capa de procesamiento de negocios] y [capa web] para su uso | |
| 11 | Junit.test | Clase de prueba para almacenar el sistema | |
Como se mencionó anteriormente, creamos una jerarquía de paquetes, pero según la situación real del proyecto, también es posible que necesitemos crearla.
Su bolsa, esto depende de las necesidades del proyecto.
En el directorio SRC (directorio de categoría), cree un archivo XML (db.xml) para guardar los datos del usuario (db.xml)
Cree un directorio de páginas en el directorio web-INF. El directorio de páginas almacena algunas páginas JSP protegidas del sistema (no permiten a los usuarios acceder directamente a través de direcciones de URL). Si los usuarios desean acceder a estas páginas JSP protegidas, solo pueden usar el servlet en el paquete me.gacl.web.ui
El proyecto creado se muestra en la siguiente figura (Figura-1):
Figura 1
3. Código de redacción de arquitectura jerárquica
El código de la arquitectura jerárquica también se escribe en el orden de [Capa del modelo de dominio (dominio)] → [Data Access Layer (Dao, Dao.Impl)] → [Layer de procesamiento empresarial (Service, Service.Impl)] → [Expression Layer (Web.Controller, Web.ui, Web.Filter, Web.listener)] → [Class de herramientas (Util)] [TECT -TEAL (JUNIT TEX (JUNIT TEX (JUNIT TEX (JUNIT TEX (JUNIT TECT.
3.1. Desarrollar capa de dominio
Cree una clase de usuario debajo del paquete me.gacl.domain
El código específico de la clase de usuario es el siguiente:
paquete me.gacl.domain; import java.io.Serializable; import java.util.date;/*** @author gacl*clase de entidad de usuario*/public class User implementa serializable {private static final long long SerialversionUid = -l; // user iDprivate string id; // nombre de usuario name de usuarios privados;//contraseña de usuarios de la cadena de usuarios de la cadena privada; Cumpleaños de cumpleaños de usuario Cumpleaños; public String getId () {return id;} public void setid (string id) {this.id = id;} public String getUsername () {return useName;} public void setUsername (string username) {this.Username = username;} public String getUserPwd () {return userpwd;} public void setuserpwd (string userpwd (string userpwd (string userpwd (string userpwd (string userpwd) {this.userpwd = userPwd;} public String getEmail () {return Correo electrónico;} public void setEmail (String Correo electrónico) {this.email = Correo electrónico;} fecha pública getBirthday () {birthday de return;} public void setBirthay (fecha de fecha) {this.birthday = birthday;}}}3.2. Desarrollar la capa de acceso a datos (DAO, Dao.impl)
Cree una clase de interfaz IUSERDAO en el paquete ME.GACL.DAO. Para las clases de interfaz de desarrollo, estoy acostumbrado a usar la letra I como prefijo de la clase, para que pueda ver de un vistazo que la clase actual es una interfaz, que también es un buen hábito de desarrollo. Al observar el nombre de la clase, puede distinguir fácilmente si se trata de una interfaz o una clase de implementación específica.
El código específico de la interfaz IUSERDAO es el siguiente:
paquete me.gacl.dao; import me.gacl.domain.user; interfaz pública iuserdao {/*** Encuentre el usuario basado en el nombre de usuario y la contraseña* @param username* @param userpwd* @return el usuario encontrado*/user Find (string userner, string userpwd);/*** Agregar user* @param user user* void add (user User); Nombre* @param Nombre de usuario* @return el usuario encontrado*/usuario Find (String UserName);}Para la definición del método en la interfaz, esto solo puede analizar qué métodos deben definirse en función del negocio específico. Sin embargo, no importa cuán complejo sea el negocio, no se puede separar de la operación básica de crud (adición, deleción, modificación y consulta). La capa DAO interactúa directamente con la base de datos, por lo que la interfaz de la capa DAO generalmente tiene cuatro métodos relacionados para agregar, eliminar, modificar y consultar.
Cree una clase UserDaoMpl en el paquete Me.gacl.dao.impl
La clase UserDAOMPL es una clase de implementación específica de la interfaz IUSERDAO. Para el método de nomenclatura de la clase de implementación de la interfaz, estoy acostumbrado a nombrarlo en forma de "Nombre de la interfaz (eliminar el prefijo I) + Impl" o "Nombre de la interfaz + Impl": IUSerDAO (Interface) → UserDaoImpl (implementar clase) o iUserDao (interfaz) → IUSerDaImpl (implementar clase). Este es también un hábito de programación personal. La mayoría del código que veo generalmente nombra la clase de implementación específica de la interfaz en una de estas dos formas. De todos modos, debe poder ver qué clase de implementación correspondiente a la interfaz es de un vistazo.
El código específico de la clase UserDAOMPL es el siguiente:
paquete me.gacl.dao.impl; import java.text.simpledateFormat; import org.domj.document; import og.domj.element; import me.gacl.dao.iuserdao; import me.gacl.domain.user; import me.gacl.util.xmlutils;/*** Class de implementación de IUSerDaUdao gaCl*/public class UserDaoMpl implements IUSerDAO {@OverridePublic User Find (String UserName, String UserPWD) {try {document Document = xmlutils.getDocument (); // use xpath Expression para manipular XML NodesElement e = (Element) document.selectsinglenode ("// user @userpwd = '"+userpwd+"'] "); if (e == null) {return null;} user user = new User (); user.setId (e.AttributeValue ("id")); user.setEmail (e.AttributeValue ("correo electrónico")); user.setUserPWD (e.AttributeValue ("userpwd")); user.setUsername (e.Attribute ("username"); string = e.Attribute ("cumpleaños"); "Cumencial"); SimpleTVeT SimpleDateFormat ("yyyyy-mm-dd"); user.setbirthday (sdf.parse (birth)); return user;} capt (excepción e) {throw new runtimeException (e);}}@supresswarnings ("deprecation")@overpublic void add (user user) {prueba {documento de documento = xmlutilils.getDocument ();); document.getRoOtElement (); elemento user_node = root.addelement ("usuario"); //Create user node and hang it to rootuser_node.setAttributeValue("id", user.getId());user_node.setAttributeValue("userName", user.getUserName());user_node.setAttributeValue("userPwd", user.getUserPwd());user_node.setAttributeValue("email", user.getEmail ()); SimpleDateFormat sdf = new SimpledateFormat ("yyyyy-mm-dd"); user_node.setTributeValue ("cumpleaños", sdf.format (user.getBirthday ()); xmlutils.Writexml (documento);} Catch (excepción e) {EXCEPCIÓN E) {EXCECTUNDE EXCECTURA ENVERSET (EXCECTUNDE EXCEFECET (EXCEFECTURACIÓN);} find (string username) {try {document document = xmlutils.getDocument (); element e = (element) document.selectsingLenode ("// user [@username = '"+username+"']"); if (e == null) {return null;} user user = new New User (); user.setId (e.AttributeValue ("id")); user.setEmail (e.AttributeValue ("correo electrónico")); user.setUserPWD (e.AttributeValue ("userpwd")); user.setUsername (e.Attribute ("username"); string = e.Attribute ("cumpleaños"); "Cumencial"); SimpleTVeT SimpleDateFormat ("yyyy-mm-dd"); user.setbirthday (sdf.parse (nacimiento)); return user;} capt (excepción e) {tirar nueva runtimeException (e);}}}3.3. Capa de servicio de desarrollo (la capa de servicio proporciona todos los servicios comerciales a la capa web)
Crea la clase de interfaz IUSERService en el paquete de me.gacl.service
El código específico de la interfaz IUSERService es el siguiente:
paquete me.gacl.service; import me.gacl.domain.user; import me.gacl.exception.useReXistException; interfaz pública iuserservice {/*** Proporcionar servicio de registro* @param user* @throws usereReReSception*/void registreuser (usuario user) lanza userExistexception;/*** proporciona un servicio login* @param userameNeMeNeNeMeNeNeMe* @return*/User Loginuser (String UserName, String UserPwd);}Crear clase UserServiceImpl en el paquete me.gacl.service.impl
La clase UserServiceImpl es una clase de implementación específica de la interfaz IUSERService. El código específico es el siguiente:
paquete me.gacl.service.impl; import me.gacl.dao.iuserdao; import me.gacl.dao.impl.userdaoImpl; import me.gacl.domain.user; import me.gacl.exception.useRexistException; import me.gacl.service.iuserService; público de la clase pública ofrece el servicio de usuarios de los usuarios de ofrenda Iuserdao userDao = new UserDaoImpl ();@overridePublic Void RegisterUser (User User) lanza UserExistException {if (userDao.find (user.getUsername ())! = NULL) {// Excepción verificada // Sin verificar la excepción // La razón para lanzar la excepción de tiempo de compilación aquí: I Quero el programa previo a esta excepción a esta excepción para manejar el Mango de Ajuste de Usment At The Usment. UserExistException ("El nombre de usuario registrado ya existe!");} Userdao.add (user);}@overridePublic Loginuser (String UserName, String UserPwd) {return UserDao.Find (UserName, UserPwd);}}3.4. Desarrollar la capa web
3.4.1. Desarrollar la función de registro
1. Escriba un registro de registro en el paquete Me.gacl.web.ui para proporcionar una interfaz de registro para los usuarios
Después de recibir la solicitud del usuario, RegisterUservlet salta a registrar.jsp
El código de Registruiservlet es el siguiente:
paquete me.gacl.web.ui; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.htpservletRespelSess; gacl* servlet que proporciona a los usuarios interfaz de usuario registrada* RegistruuServlet es responsable de generar la interfaz de registro para los usuarios* Cuando un usuario accede al registro de registro, salta a la página de registro.jsp en el directorio web-Inf/páginas*/public Class RegistroReServlet extiende httpServlet {public void doget (httpServletRet Solicitud, HttTpServlet, extiende httpServlet {public void doget (httpServletRet-Solicitud, httTpServlet, extiende httpServlet {public void doget (httpServletRet-Solicitud, HttTpServlet, shotletspetTsespletspetTsesPetLeTsExcent. IoException {request.getRequestDispatcher ("/web-inf/pages/registro.jsp"). Forward (request, respuesta);} public void dopost (httpservletRequest solicitud, httpServletResponse Response) lanza ServletException, IOException {doget, respuesta);}}2. Escriba un registro de página JSP registrado por el usuario. JSP en/Web-Inf/Pages/Directory
No se puede acceder directamente a cualquier página JSP ubicada en el directorio web-INF directamente a través de la dirección de URL.
Durante el desarrollo, si hay algunos recursos web confidenciales en el proyecto a los que no desean ser accedidos directamente por el mundo exterior, puede considerar poner estos recursos web confidenciales en el directorio web-INF, para que el mundo exterior pueda ser prohibido acceder directamente a través de la URL.
El código de la página registrar.jsp es el siguiente:
<%@ page lenguaje = "java" pageEncoding = "utf-"%> <! DocType html> <html> <fead> <title> Registro de usuario </title> </head> <body style = "text-align: center;"> <form action = "$ {pageContext.request.contextpath/servlet/regiservlet" método = "post"> <table> <tr> <td> nombre de usuario </td> <td> <input type = "text" name = "username"> </td> </tr> <tr> <tr> <td> contraseña </td> <td> <input type = "contraseña" name = "userpwd"> </td> </tr> <t> <treming> contraseña <//td> <td "type" type = "contraseña" name = "Confirmpwd"> </td> </tr> <tr> <tr> <td> correo electrónico </td> <td> <input type = "text" name = "correo electrónico"> </td> </tr> <tr> <td> cumpleaños </td> <td> <input type = "text" name = "cumpleaños"> </td> </tr> <tr> <td> <tying type = "reset" value = "Clear"> </td> <td> <input type = "envíe" value = "registrar"> </td> </tr> </table> </form> </body> </html> <Form Action = "$ {PageContext.Request.ContextPath}/Servlet/RegisterServlet" Method = "Post"> en registro.jsp indica que el formulario se envía y se entrega al registro de registro para su procesamiento
3. Escriba un registro de registro para manejar el registro del usuario en el paquete me.gacl.web.controller
RegisterServlet sirve a las siguientes responsabilidades:
1. Reciba datos de formulario enviados por el cliente al servidor.
2. Verifique la legalidad de los datos del formulario. Si la verificación falla, vuelva a registrar.jsp y haga eco del mensaje de error.
3. Si se pasa la verificación, llame a la capa de servicio para registrar al usuario con la base de datos.
Para facilitar el registro de registro de los datos del formulario y los datos del formulario de verificación, diseñé un registro de información para la verificación de los datos del formulario de registro, y luego escribí la clase de herramienta Webutils para encapsular los datos de formulario enviados por el cliente en el formbean.
Cree un registro de información para verificar los datos del formulario de registro en el paquete me.gacl.web.formbean
El código de registro de información es el siguiente:
paquete me.gacl.web.formbean; import java.util.hashmap; import java.util.map; import org.apache.commons.beanutils.locale.converters.datelocaleconverter;/*** El formulario de registro de usuarios encapsulado se utiliza el valor de la entrada de la formulario en el elemento de entrada en el registro. Elemento de entrada en registro.jsp* Las responsabilidades del registro de información no solo son responsables de recibir el valor del elemento de entrada de formulario en registro.jsp, sino que también sirven como la legalidad del valor del elemento de entrada de formulario* @author gaCl **/public class registerFormBean {// las propiedades en el registro de la información corresponde al nombre del elemento de entrada del formulario en registro.jsp uno // <type de entrada {// las propiedades en el nombre de registro corresponden al nombre del elemento de entrada del formulario en registro.jsp uno // <type de entrada = "text" name ". private string username; // <input type = "contraseña" name = "userpwd"/> private string userpwd; // <input type = "contraseña" name = "confirmpwd"/> private string confirmpwd; // <input type = "text" name = "correo electrónico"/> privado correo electrónico de cadena; // <input type = "text" name = "cumpleaños"/> privado cumpleaños cumpleaños;/*** el mensaje de error al mensaje de error al mensaje de error a la verificación de cadena; MAP <String, String> errores = new HashMap <String, String> (); public Map <String, String> getErrors () {return errores;} public void setErrors (map <string, string> errores) {this.errors = errores;}/** El método de validate es responsable de verificar los elementos de entrada de formulario* reglas de verificación de elemento de entrada de formulario:* string string string useName; El nombre de usuario no puede estar vacío, y si está - letra abcdabcd * string private string userpwd; La contraseña no puede estar vacía, y si es así, el número * de cadena privada confirmpwd; La contraseña debe ser la misma que las dos veces * el correo electrónico de cadena privada; Puede estar vacío, no vacío si es un buzón legal* Cumpleaños de cadena privada; Puede estar vacío, no vacío, si es una fecha legal*/public boolean validate () {boolean isok = true; if (this.username == null || this.username.trim (). Equals ("")) {isok = false; errores.put ("UserName", "¡el nombre de usuario no puede estar vacío! (! this.Username.matches ("[a-Za-z] {,}")) {isok = false; errores.put ("username", "el nombre de usuario debe ser una letra de -bit !!");}} if (this.userpwd == null || this.userpwd.trim (). Equals (") {isok = false; errores.put ("userPwd", "La contraseña no puede estar vacía !!");} else {if (! this.userpwd.matches ("// d {,}")) {isok = false; errores.put ("userpwd", "la contraseña debe ser un número de -bits !!");} // contraseña de cadena privada; Las contraseñas deben ser las mismas cuando las dos veces son (this.confirmpwd! = Null) {if (! This.confirmpwd.equals (this.userpwd)) {isok = false; errores.put ("confirmaPWD", "Las contraseñas son incompatibles cuando las dos veces no son nullas!");} // String String String Correo electrónico; Puede estar vacío, no nulo. Si es un correo electrónico legal if (this.email! = Null &&! This.email.trim (). Igual ("")) {if (! This.email.matches ("// w+@// w+(// w+)+")) {isok = false; errors.put ("correo electrónico", ", el buzón no es un buzón legal! Puede estar vacío, no vacío, si se trata de una fecha legal si (this.birthday! = Null &&! This.birthday.trim (). Igual ("")) {try {dataLocaleconverter Convert = neweLocalEconverter (); conver.convert (this.birthday);} Catch (excepción e) {ISOK = false; errors.port ("bucatter," bucatter the bucatter, bultate, bulter the bultate, the bultate the bultate (debe ser el cumpleaños (debe ser el cumpleaños, "bucatter. date!!");}} 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) {this.userPwd = userPwd;}public String getConfirmPwd() {return confirmPwd;}public void setConfirmPwd(String confirmPwd) {this.confirmPwd = confirmPwd;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = cumpleaños;}}Cree una clase de herramienta Webutils en el paquete me.gacl.util. La función de esta clase de herramienta es encapsular los datos de formulario enviados por el cliente en FormBean
paquete me.gacl.util; import java.util.enumeration; import java.util.uuid; import javax.servlet.http.htttpservletRequest; importar org.apache.commons.beanutils.beanutils;/*** @author gaCl*encapsular los parámetros de solicitud en el objeto de solicitud en el objeto de solicitud en el objeto de la solicitud* Convierta el objeto de solicitud en un objeto t* @param solicitud* @param clazz* @return*/public static <t> t requestBean (httpservletRequest request, class <t> clazz) {try {t bean = clazz.newinstance (); enumeration <string> e = request.getParameternames ();; while (e.hasmoreEelements ()) {String name = (String) e.NextElement (); String value = request.getParameter (name); beanUtils.setProperty (bean, name, value);} return bean;} capt (excepción e) {tirar nueva runtimeException (e);}}/*** Uuid.randomuuid (). ToString ();}}Finalmente, echemos un vistazo al código completo de RegissterServlet responsable de manejar el registro del usuario:
paquete me.gacl.web.controller; import java.io.ioexception; import java.util.date; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import; import javax.servlet.http.httpServletResponse; import org.apache.commons.beanutils.beanutils; importar org.apache.commons.beanutils.convertutils; import.apache.commons.beanutils.locale.converters.datelocaleconverter; import me.gacl. me.gacl.exception.useRexistException; import me.gacl.service.iuserService; import me.gacl.service.impl.userserviceImpl; import me.gacl.util.webutils; import me.gacl.web.formbean.registerformbean;/*** servlet handles @autor publicado gaclor gacl extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//Encapsulate the form data submitted by the client into the RegisterFormBean object RegisterFormBean formbean = WebUtils.requestBean(request,RegisterFormBean.class);//Check the form data filled in by the user registration if (FormBean.Validate () == FALSE) {// Si la verificación falla // Envía el objeto de formulario que encapsula los datos de formulario llenos por el usuario de nuevo en el formulario Formulario en la página de registro.jsp para visualización de solicitud.setTribute ("FormBean", FormBean); // La verificación falla para indicar que existe un problema con los datos de formulario completados por el usuario, por lo tanto, salte al usuario, vuelve a volver al usuario al usuario al usuario al usuario al usuario al usuario, al usuario, al usuario, vuelve al usuario al usuario al usuario, vuelve al usuario al usuario al usuario, vuelve al usuario al usuario al usuario al usuario, vuelve al usuario al usuario al usuario, vuelve al usuario, vuelve al usuario, vuelve al usuario. register.jsprequest.getRequestDispatcher ("/web-inf/páginas/registro.jsp"). Award (request, respuesta); return;} user user = new User (); intente {//convertutUtils.register(NEW DataLocalEconverter (), date.classss.copypoperTies (user, user, formbean); // Forma los datos de formulario); user.setID (webutil.makeId ()); // Establezca la propiedad de ID del usuario IUSERService Service = New UserServiceImpl (); // Llame al servicio de usuario registrado proporcionado por la capa de servicio para lograr el servicio de registro del usuario. String Message = String.Format ("¡Registrado correctamente! request.getContextPath ()+"/servlet/loginuiservlet"); request.setTtribute ("mensaje", mensaje); request.getRequestDisPatcher ("/message.jsp"). Forward (request, respuesta);} capt (userExistException e) {formbean.getErrors (). existe! "); request.setTribute (" formBean ", formBean); request.getRequestDisPatcher ("/web-inf/pages/registre.jsp "). ADELAR (Solicitar, Respuesta);} Catch (Exception e) {E.PrintStackTrace (); // registra la excepción en el fondo de solicitud.SetAttribute ("Mensaje", "¡Lo siento, el registro fallido!"); Request.getRequestDisPatcher ("/message.jsp"). Award (request, respuesta);} public void dopost (httpservletRequest request, httpServletRessonse respuesta) lanza serveTexception, iOexception {doget (solicitud, respuesta, respuesta);};};};};}Si la verificación de los datos de formulario completado falla cuando el usuario se registra, el servidor almacenará un objeto Formbean con mensaje de error y datos de formulario en el objeto de solicitud, y luego lo enviará de nuevo a la página registrar.jsp. Por lo tanto, debemos eliminar el objeto FormBean en el objeto de solicitud de la página Registro.jsp, y luego volver a aplicar los datos del formulario completados por el usuario al elemento de formulario correspondiente, y también mostrar el mensaje de solicitud cuando se produce un error en el formulario del formulario, para que el usuario sepa qué datos son ilegales para completar!
Modificar la página registrar.jsp, el código es el siguiente:
<%@ page lenguaje = "java" pageEncoding = "utf-"%> <! DocType html> <html> <fead> <title> Registro de usuario </title> </head> <body style = "text-align: center;"> <form action = "$ {pageContext.request.contextpath/servlet/regiservlet" método = "post"> <table> <tr> <td> nombre de usuario </td> <td> <%-use la expresión de El $ {} para extraer datos de formulario encapsulados en el objeto formbean almacenado en el objeto de solicitud (formBean.username) y el mensaje de error (formbean.errors.username)-%> <input type = "text" name = "userName" "" nombre "" "nombre" "" "nombre" "" "nombre" "" "nombre" "" "" nombre "" "" "nombre" "" "" "" "UserName" "" "nombre" "" "nombre" "" "nombre" "" "nombre" "" "" nombre "" "" nombre "" "" nombre "" "" "nombre" "" "nombre" "" "nombre" "" "nombre" "" "nombre" "" "nombre" "" "" nombre "" "" "nombre" "" "nombre" "" "nombre" "" nombre "" "" nombre "" "" nombre "" "" nombre "" "" nombre "" " value = "$ {formBean.Username}"> $ {formBean.errors.username} </td> </tr> <tr> <td> contraseña </td> <td> <input type = "contraseña" name = "userPwd" value = "$ {formBean.userpwd}"> $ {formBean.errors.userpwd} </td> </tr> <tr> <td> confirmar contraseña </td> <td> <input type = "contraseña" name = "confirmarpwd" valor = "$ {formBean.confirmpwd}"> $ {formBean.errors.confirmpwd} </td> </tr> <tr> <td> correo electrónico </td> <td> <input type = "text" name = "correo electrónico" value = "$ {formBean.email}"> $ {formbean.errors.email} </td> </tr> <tr> <td> cumpleaños </td> <td> <input type = "text" name = "cumpleaños" valor = "$ {formBean.birthday}"> $ {formbean.errors.birthay} </td> </tr> <tr> <tr> <td> <input type = "reet" valor = "clara"> </td>¡En este punto, la función de registro del usuario se ha desarrollado!
Las siguientes pruebas la función de registro del usuario desarrollada:
Ingrese la dirección de la URL: http: // localhost: 8080/webMVCFramework/Servlet/RegisterUservlet para acceder a la página Registro.jsp, y el efecto de operación es el siguiente:
Si el elemento de formulario ingresado no cumple con las reglas de verificación, no se puede registrar. El efecto de operación es el siguiente:
3.4.2. Desarrollar la función de inicio de sesión
1. Escriba un Loginuiservlet debajo del paquete ME.GACL.WEB.UI para proporcionar a los usuarios una interfaz de inicio de sesión.
Después de que Loginuiservlet recibe la solicitud del usuario, salta a Login.jsp
El código de Loginuiservlet es el siguiente:
paquete me.gacl.web.ui; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse;/*** @author gacl* Loginuiservlet es responsable de generar la interfaz de inicio de sesión para los usuarios* Cuando el usuario accede a loginuiservlet, salta a la página login.jsp en el directorio de inf/pagas*/clase pública logInuiservlet extiende httpservlet {pública público void void void void void void void void void void void void void void void void void void void void void void void extiende void void void void expiens doget (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioException {request.getRequestDisPatcher ("/web-inf/pages/login.jsp"). reenviar (solicitud, respuesta);} public void doPost (httPserveTretRequest solicitud, httpSeServletResponse Respuesta) Trails) {doget (solicitud, respuesta);}}2. Escriba la página de inicio de sesión de inicio de sesión del usuario.
El código de la página Login.jsp es el siguiente:
<%@ page lenguaje = "java" pageEncoding = "utf-"%> <! DocType html> <html> <fead> <title> inicio de sesión de usuario </title> </Event> <body> <Form Action = "$ {PageContext.Request.ContextPath}/Servlet/LoginServlet" Método = "Post" name = "UserName"> <br/> Password: <input type = "Password" name = "Password"> <br/> <input type = "Envir" value = "Login"> </form> </body> </html> <Form Action = "$ {PageContext.Request.ContextPath}/Servlet/LoginServlet" Method = "Post"> en Login.jsp indica que el formulario se envía y se entrega al LoginServlet para su procesamiento.
3. Escriba un LoginServlet para manejar el inicio de sesión del usuario en el paquete me.gacl.web.controller
El código de LoginServlet es el siguiente:
paquete me.gacl.web.controller; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.htpserveT me.gacl.domain.user; import me.gacl.service.iuserService; import me.gacl.service.impl.userserviceImpl;/*** Servlet maneja el usuario Login*@author gacl **/public LoginServlet se extiende htttpServlet {public sin solicitud (httpServletRequest, htttpesServlet). ServLetException, ioException {// Obtenga el nombre de usuario de inicio de sesión completado por la cadena de usuario de usuario userName = request.getParameter ("username"); // Obtenga la contraseña de inicio de sesión llenada por la cadena de usuarios contraseña = request.getParameter ("contraseña"); iuserservice service = new userservicePl (); // user loginuser user = servicio.Loginuser (useNeNeNeMeNeNeMer, Name, Name,, Name, Name, Name, Name,,, NUEVO, NUEM contraseña); if (user == null) {String Message = String.Format ("Lo siento, el nombre de usuario o la contraseña es incorrecto !! Por favor, inicie sesión nuevamente! ¡Saltará automáticamente a la página de inicio de sesión en segundos! <meta http-oquiv = 'refresh' content = '; url =%s' ", request.getContextPath ()+"/servlet/loginuiservlet "); request.setTribute (" mensaje ", mensaje); request.getRequestDispatcher ("/message.jsp "). Award (solicitud, respuesta); retorny;} // después del login es exitoso, el usuario es almacenado en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en la sesión en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario en el usuario. request.getSession (). SetAttribute ("User", usuario); string Message = String.Format ("Felicitaciones: %s, ¡El inicio de sesión es exitoso! Esta página saltará a la página de inicio en segundos! <meta http-outiv = 'refresh' content = '; url = %s'",,,, user.getUsername (), request.getContextPath ()+"/index.jsp"); request.setTtribute ("mensaje", mensaje); request.getRequestDisPatcher ("/message.jsp"). Award (request, respuesta);} public void dopost (htttpServletRequest solicitud, httpSeVletResponse Respuesta) ServletException ServletException, Ioxception, iOTeExc. {doget (solicitud, respuesta);}}En este punto, se ha completado la función de inicio de sesión del usuario.
A continuación, pruebe la función de inicio de sesión del usuario desarrollada, ingrese la dirección de la URL: http: // localhost: 8080/webmvcframework/servlet/loginuiservlet para acceder a la página login.jsp, ingrese el nombre de usuario y la contraseña correctos para iniciar sesión, el efecto de operación es el siguiente:
Si el nombre de usuario y la contraseña ingresados son incorrectos, entonces el inicio de sesión no puede iniciarse correctamente, y el efecto de operación es el siguiente:
3.4.3. Desarrollar la función de cancelar
Escriba un servicio de sesión de logroutservlet para manejar el inicio de sesión del usuario en el paquete me.gacl.web.controller
El código de logroutservlet es el siguiente:
paquete me.gacl.web.controller; import java.io.ioexception; import java.text.messageformat; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpServletResponse; public class logOutServlet extiende httpservlet {public void doget (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {// elimina el objeto de usuario almacenado en la sesión para implementar la función de registro request.getSession (). RemoveAtTribute ("User"); // Debido a que la cadena contiene cotizaciones únicas, habrá problemas al usar el método MessageFormat.Format para empalmarse la cadena en este caso //messageformat.format Method solo elimina las cotizaciones únicas en la cadena y el contenido en el contenido en el lugar específico de la Str. <meta http-oquiv = 'refresh' content = '; url = {}'/> ", request.getContextPath ()+"/servlet/loginuiservlet "); system.out.println (temptr); // resultado de la salida: logrout con éxito! ! ¡Automáticamente saltará a la página de inicio de sesión para usted en segundos! ! <meta http-outiv = actualizar 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! ! It will automatically jump to the login page for you in seconds! ! * <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, respuesta);}}用户登录成功后,会将登录的用户信息存储在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、搭建开发环境
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模式),希望对大家有所帮助!