Ниже мы представим пример кода Javaweb для реализации функции входа в систему и регистрации пользователя с помощью изображений и текстов. Давайте посмотрим.
1. Введение в сервис+JSP+модель разработки Javabean (MVC)
Servlet+JSP+Javabean Mode (MVC) подходит для разработки сложных веб -приложений. В этом режиме сервлеты несут ответственность за обработку запросов пользователей, JSP отвечает за отображение данных, а Javabean отвечает за инкапсуляцию данных. Программа Mode Servlet+JSP+Javabean имеет четкие уровни между модулями, и для использования этого режима рекомендуется веб -разработка.
Здесь мы используем наиболее часто используемую программу регистрации входа в систему пользователя, чтобы объяснить модель разработки Servlet+JSP+Javabean. Благодаря этой программе регистрации входа в систему пользователя в комплексных случаях мы связываем точки знаний XML, XPATH, Servlet и JSP, которые мы узнали ранее.
2. Создайте веб -проект с архитектурой MVC
Создайте новый проект WebMVCFramework в MyeClipse, импортировать пакет разработки (пакет JAR), необходимый для проекта, и создайте пакеты, необходимые для проекта. В разработке Java уровень архитектуры отражен в виде упаковки
| Пакеты разработки (пакеты JAR), требуемые проектом | ||
| Серийный номер | Название пакета разработки | описывать |
| 1 | DOM4J-1.6.1.JAR | Dom4j используется для манипулирования XML -файлами |
| 2 | JAXEN-1.1-BETA-6.JAR | Используется для анализа выражений XPath |
| 3 | Commons-Beanutils-1.8.0.jar | Класс инструментов для обработки объектов бобов |
| 4 | Commons-Logging.jar | Commons-Beanutils-1.8.0.Jar |
| 5 | jstl.jar | Библиотека тегов JSTL и пакет зависимости от экспрессии EL |
| 6 | Стандарт.jar | Библиотека тегов JSTL и пакет зависимости от экспрессии EL |
Хорошая архитектура проекта Javaweb должна иметь приведенные выше 11 пакетов, что дает понять, что обязанности между каждым слоем ясны. При построении архитектуры проекта Javaweb создайте пакеты в порядке от 1 до 11 выше: домен → DAO → DAO.IMPL → Service → Service.Impl → Web.controller → Web.UI → Web.Filter → Web.Listener → UTIL → JUNIT.TEST. Как только уровень пакета будет создан, архитектура проекта будет определена. Конечно, в реальной разработке проекта это может не полностью основываться на
| Пакеты, необходимые для проекта | |||
| Серийный номер | Название пакета | описывать | Уровень |
| 1 | me.gacl.domain | Класс Javabean, который хранит систему (содержит только простые атрибуты и получает и устанавливает методы, соответствующие атрибутам, и не включает в себя конкретные методы обработки бизнеса), предоставляемые [уровню доступа к данным], [уровни бизнес -обработки] и [веб -слой] для использования | Домен (доменная модель) слой |
| 2 | me.gacl. дао | Класс интерфейса операции, который хранит доступ к базе данных | Уровень доступа данных |
| 3 | me.gacl. dao.impl | Класс реализации, в котором хранится операционный интерфейс, который обращается к базе данных | |
| 4 | me.gacl. услуга | Хранить систему обработки бизнес -интерфейса класса | Бизнес -обработка слой |
| 5 | me.gacl. Service.impl | Класс внедрения для хранения бизнес -интерфейса системы обработки | |
| 6 | me.gacl. web.controller | Сервлеты хранятся в качестве системного контроллера | Веб -слой (презентационный уровень) |
| 7 | me.gacl.web.ui | Сервлет (пользовательский интерфейс относится к пользовательскому интерфейсу), который предоставляет пользовательский интерфейс для пользователей | |
| 8 | me.gacl.web.filter | Фильтр, используемый для системы хранения | |
| 9 | me.gacl.web.listener | Слушатель использовал для хранения системы | |
| 10 | me.gacl .Util | Общие инструменты для хранения системы, предоставленные [уровню доступа к данным], [уровни бизнес -обработки] и [веб -слой] для использования | |
| 11 | JUNIT.Test | Тестовый класс для хранения системы | |
Как упомянуто выше, мы создаем иерархию пакета, но, основываясь на реальной ситуации проекта, нам также может потребоваться ее создать.
Его сумка, это зависит от потребностей проекта.
В Directory SRC (каталог категории) создайте файл XML (db.xml) для сохранения пользовательских данных (db.xml)
Создайте каталог страниц в каталоге Web-Inf. Справочник страниц хранит некоторые защищенные страницы JSP системы (не позволяя пользователям получать доступ непосредственно через адреса URL). Если пользователи хотят получить доступ к этим защищенным страницам JSP, они могут использовать только сервлет в пакете me.gacl.web.ui
Созданный проект показан на следующем рисунке (Рисунок-1):
Рисунок-1
3. Написание кода иерархической архитектуры
Кодекс иерархической архитектуры также записан в порядке [Домен модельного уровня (домен)] → [Layer доступа к данным (DAO, DAO.IMPL)] → [Слои бизнес -обработки (Service.Impl.Impl)] → [Layer Expression (web.controler, web.ui, web.filter, web.Listener)] [itLiL) [ut -it).
3.1. Разработать доменный слой
Создайте класс пользователя в пакете me.gacl.domain
Конкретный код класса пользователя заключается в следующем:
Пакет me.gacl.domain; import java.io.serializable; import java.util.date;/*** @author gacl*class class*/public class пользователь реализует сериализуемые {private static final long serialversionuid = -l; // Пользовательский идентификатор идентификатора string; // private user user username; // Пользовательский пароль для пользователя; Пользовательский день рождения {this.userpwd = userpwd;} public String getemail () {return email;} public void setemail (string email) {this.email = email;} public date getBirthday () {return ritleder;} public void setbirthday (дата рождения) {this.birthday = день рождения;}}}}}}}}}}}}}}}}3.2. Разработать уровень доступа данных (dao, dao.impl)
Создайте класс интерфейса iuserdao в пакете me.gacl.dao. Для классов интерфейса разработки я привык использовать букву I в качестве префикса класса, чтобы вы могли сразу увидеть, что текущий класс является интерфейсом, который также является хорошей привычкой для развития. Глядя на имя класса, вы можете легко различить, является ли это интерфейсом или конкретным классом реализации.
Конкретный код интерфейса iuserdao заключается в следующем:
Пакет me.gacl.dao; import me.gacl.domain.user; public interface iuserdao {/*** Найти пользователя на основе имени пользователя и пароля* @param username* @param userpwd* @return пользователь найденный*/user inserme (string userme, string userpwd); *** add user user user user user user user user* as (user user user user aser user* void; имя* @param username* @return Пользователь найденный*/user find (String username);}Для определения метода в интерфейсе это может только анализировать, какие методы необходимо определить на основе конкретного бизнеса. Однако, независимо от того, насколько сложным бизнес, он не может быть отделен от основной операции CRUD (добавление, удаление, модификация и запрос). Слой DAO напрямую взаимодействует с базой данных, поэтому интерфейс DAO Layer обычно имеет четыре связанных метода для добавления, удаления, модификации и запроса.
Создать класс userdaoimpl в пакете me.gacl.dao.impl
Класс userdaoimpl - это конкретный класс реализации интерфейса iuserdao. Для метода именования класса реализации интерфейса я использую для названия его в форме «Имя интерфейса (удалить префикс I) + IMP» или «Имя интерфейса + IMP»: iUserdao (интерфейс) → userDaoImpl (класс реализации) или iUserdao (интерфейс) → iuserdaiumpl (класс реализации). Это также личная привычка программирования. Большая часть кода, который я вижу, обычно называет конкретный класс реализации интерфейса в одной из этих двух форм. В любом случае, вы должны быть в состоянии увидеть, какой класс реализации, соответствующий интерфейсу, с первого взгляда.
Конкретный код класса userdaoimpl заключается в следующем:
пакет me.gacl.dao.impl; import java.text.simpledateformat; import org.domj.document; import org.domj.element; импорт me.gacl.dao.iuserdao; import me.gacl.domain.user; импорт me.gacl.Util.xmlutils; gacl*/public class UserDaoImpl implements IUserDao {@Overridepublic User find(String userName, String userPwd) {try{Document document = XmlUtils.getDocument();//Use XPath expression to manipulate XML nodesElement e = (Element) document.selectSingleNode("//user[@userName='"+userName+"' and @userpwd = '"+userpwd+"'] "); if (e == null) {return null;} user user = new User (); user.setid (e.attributevalue ("id")); user.setemail (e.attributevalue ("email")); user.setuserpwd (e.attributevalue ("userpwd")); user.setusername (e.attributevalue ("usermeme"); string graview = e.attribute (e.attributevalue ("usermeme"); slound newtrubute (e.attributevalue ("usermeme"); srtine newtrubute (e.attributevalue ("usermeme"); SimpleDateFormat ("yyyy-mm-dd"); user.setBirthDay (sdf.parse (рождение)); return user;} catch (exception e) {throw new runtimeexception (e);}}@puppresswarnings ("temprecation")@overpublic void add (пользователь пользователь) {trese robum document = xml document.getRootelement (); element user_node = root.addelement ("user"); // Создать пользовательский узел и повесить его в rootuser_node.setattributevalue («id», user.getid ()); user_node.setattributevalue («username», user.getusername ()); user_node.setattributevalue («userPwd», user.getUserpwd ()); user.getemail ()); simpledateformat sdf = new SimpleDateFormat ("yyyy-mm-dd"); user_node.setattributevalue ("день рождения", sdf.format (user.getbirthday ()); xmlutils.writexml (document);} catch Except e) {throw new Runttime); Пользователь Find (String username) {try {document document = xmlutils.getdocument (); element e = (element) document.selectsinglenode ("// user [@Username = '"+username+"']"); if (e == null) {return null;} Пользователь пользователя = "']"); if (e == null) {return;} пользователь пользователь = "']"); User (); user.setid (e.attributevalue ("id")); user.setemail (e.attributevalue ("email")); user.setuserpwd (e.attributevalue ("userpwd")); user.setusername (e.attributevalue ("usermeme"); string graview = e.attribute (e.attributevalue ("usermeme"); slound newtrubute (e.attributevalue ("usermeme"); srtine newtrubute (e.attributevalue ("usermeme"); SimpleDateFormat ("yyyy-mm-dd"); user.setBirthDay (sdf.parse (rower)); return user;} catch (Exception e) {бросить новое runtimeexception (e);}}}3.3. Уровень сервиса разработки (уровень обслуживания предоставляет все бизнес -услуги на веб -уровне)
Создайте класс интерфейса iuserservice в пакете me.gacl.service
Конкретный код интерфейса iuserservice заключается в следующем:
Пакет me.gacl.service; import me.gacl.domain.user; import me.gacl.exception.userexistexception; public interface iuserservice {/*** предоставить службу регистрации* @param пользователь* @throw @return*/user loginuser (string username, string userpwd);}Создать класс userserviceimpl в пакете me.gacl.service.impl
Класс пользователей ServiceImpl - это конкретный класс реализации интерфейса iuserservice. Конкретный код заключается в следующем:
Пакет me.gacl.service.impl; импортировать me.gacl.dao.iuserdao; import me.gacl.dao.impl.userdaoimpl; импорт me.gacl.domain.user; импорт me.gacl.exception.userexistexception; импорт me.gacl.service. Iuserdao userdao = new userDaoImpl ();@overiDePublic void registerUser (пользователь пользователя) Throws Userexistexception {if (userDao.find (user.getUsername ())! = NULL) {// Проверено исключение // uncecked Exception // Причина выброса сбрасывающего времени. Userexistexception («Зарегистрированное имя пользователя уже существует !!!»);} userdao.add (user);}@overdepublic loginuser пользователя (String username, String userpwd) {return userdao.find (username, userpwd);}}3.4. Разработать веб -слой
3.4.1. Разработать функцию регистрации
1. Напишите пакет RegisterUiservlet в рамках пакета me.gacl.web.ui, чтобы предоставить регистрационный интерфейс для пользователей
После получения запроса пользователя RegisterUiservlet прыгает на register.jsp
Кодекс регистрации выглядит следующим образом:
Пакет me.gacl.web.ui; импортировать java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservlectrequest; import javax.servlet.http.htpservessersesponsesponsesservess; GACL* Servlet, который предоставляет пользователям с зарегистрированным пользовательским интерфейсом* Registruiservlet за вывод регистрационного интерфейса для пользователей* Когда пользователь обращается к регистрации, он переходит на страницу Register.jsp в каталоге web-inf/pages (httpervelceersevsevsevsevsevsevsespersersespersespersersevsevsespersersevsevsespersersevsevsersevsevsevsevsevsevsevsevsevsevsevsevsevsevsevsevsevserser ServletException, ioException {request.getRequestDispatcher ("/web-inf/pages/regist.jsp").2. Напишите зарегистрированный пользователь jsp page Register.jsp в/web-inf/pages/Directory
Любая страница JSP, расположенная в каталоге Web-Inf, не может быть доступна непосредственно через адрес URL-адреса.
Во время разработки, если в проекте есть некоторые конфиденциальные веб-ресурсы, которые не хотят быть непосредственно доступным в внешнем мире, вы можете рассмотреть возможность поставить эти конфиденциальные веб-ресурсы в каталог Web-Inf, чтобы внешнему миру было запрещено получить доступ непосредственно через URL.
Код страницы Register.jsp выглядит следующим образом:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> Регистрация пользователя </title> </head> <body style = "text-align: center;"> <form action = "$ {pagecontext.request.contextpath}/servlet/registerserv/registerserv/registerserv/registerserv/" $ method = "post"> <table> <tr> <td> username </td> <td> <input type = "text" name = "username"> </td> </tr> <tr> <td> пароль </td> <td> <Input Type = "password" name = "userpwd"> </td> </td> <td> подтвердил </td> <td> </td> <td> <td> <td> <td>. name = "sefintpwd"> </td> </tr> <tr> <td> Электронная почта </td> <td> <input type = "text" name = "email"> </td> </tr> <tr> <td> день рождения </td> <td> <input type = "text" name = "birthday"> </td> </tr> <tr> <tr> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> value = "clear"> </td> <td> <input type = "Отправить" value = "Register"> </td> </tr> </table> </form> </body> </html> <form action = "$ {pagecontext.request.contextPath}/servlet/registerservlet" method = "post"> in Register.jsp Указывает, что форма отправляется и передается в RegisterServlet для обработки
3. Напишите RegisterServlet для обработки регистрации пользователей в рамках пакета me.gacl.web.controller
Registerservlet выполняет следующие обязанности:
1. Получить данные формы, представленные клиентом на сервер.
2. Проверьте законность данных формы. Если проверка не удается, перейдите обратно, чтобы зарегистрироваться. JSP и повторить сообщение об ошибке.
3. Если проверка передается, вызовите уровень службы, чтобы зарегистрировать пользователя в базе данных.
Чтобы облегчить RegisterServlet для получения данных формы и данных о проверке, я разработал RegisterFormbean для проверки данных регистрации формы, а затем написал класс инструментов Webutils, чтобы инкапсулировать данные формы, представленные клиентом в форм.
Создать регистрацию для проверки данных регистрации в рамках пакета me.gacl.web.formbean
Код Registerformbean заключается в следующем:
Пакет me.gacl.web.formbean; import java.util.hashmap; import java.util.map; import org.apache.commons.beanutils.locale.calerters.datelocaleConverter;/*** Аттраплентный пользовательский форма Элемент ввода формы в register.jsp* Обязанности RegisterFormbean несет не только ответственность за получение значения ввода формы в Register.jsp, но также служат законностью значения элемента ввода формы* @author gacl **/public class Registerformbean {// Свойства в регистрации соответствует названию входного элемента. name = "username"/> private String username; // <input type = "password" name = "userpwd"/> private String userpwd; // <input type = "password" name = "sefintpwd"/> private string sonformpwd; // <input type = "text" name = "email"/> private string emike // <input tyes = "text vem = name"/> private string the next name "/> string"/> string string "/> string"/> string "/> string name"/>** Проверка не удастся*/private map <string, string> errors = new Hashmap <String, String> (); Public Map <String> getErrors () {return Errors;} public void setErrors (map <string> errors) {this.Errors = ошибки;}/** Метод проверки отвечает за проверку формы входных элементов. Имя пользователя не может быть пустым, и если оно есть - буква Abcdabcd * Private String userPwd; Пароль не может быть пустым, и если он есть - номер * частная строка informpwd; Пароль должен быть таким же, как два раза * приватная строковая электронная почта; Это может быть пустым, не пустым, если это легальный почтовый ящик* частный день рождения; Это может быть пустым, не пустым, если это дата юридической жизни*/public boolean validate () {boolean isok = true; if (this.username == null || this.username.trim (). Equals ("")) {isok = false; urrors.put ("username", "Состояние не может быть пустым!"); (! this.username.matches ("[a-za-z] {,}")) {isok = false; urrors.put ("username", «Имя пользователя должно быть буквой -бит !! false; errors.put ("userpwd", "пароль не может быть пустым !!");} else {if (! this.userpwd.matches ("// d {,}")) {isok = false; errors.put ("userpwd", "пароль должен быть числом -битами !!");}} // private string passwor; Пароли должны быть одинаковыми, когда два раза (this.confirmpwd! = Null) {if (! This.confirmpwd.equals (this.userpwd))) {isok = false; urrors.put ("sefintpwd", "пароли несогласованны, когда два раза не являются нулевыми !!");} // private строка Это может быть пустым, а не ноль. Если это юридическое электронное письмо, if (this.email! = Null &&! This.email.trim (). Equals ("")) {if (! This.email.matches ("// w+@// w+(// w+)+")) {isok = false; errors.put ("email", "почтовый ящик не является юридической почтовой коробкой !! Может быть пустым, не пустым, если это дата законности, если (this.birthday! = Null &&! This.birthday.trim (). Equals ("")) {try {datelocaleconverter convert = new DateLocaleConverter (); conver.convert (this.birthday);} catch (исключение e) {isok = rrors? 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.Userpd; getConfirmpwd () {return informpwd;} public void setConfirmpwd (String enformpwd) {this.confirmpwd = sefintpwd;} public String getemail () {return emial;} public void setemail (string email) {this.email = emile string string getBirthday () {return at vide drootday; {this.birthday = день рождения;}}Создайте класс инструментов webutils в пакете me.gacl.util. Функция этого класса инструмента состоит в том, чтобы инкапсулировать данные формы, представленные клиентом в формирование
Пакет me.gacl.util; import java.util.enumeration; import java.util.uuid; import javax.servlet.http.httpservletrequest; import org.apache.commons.beanutils.beanutils;/*** @author gacl*incapsulation inebreaters in the option in obstic in obstry in the obstr/ @water gacl* Преобразовать объект запроса в объект T* @param запрос* @param clazz* @return*/public static <t> t requestbean (httpservletrequest, class <t> clazz) {try {t bean = clazz.newinstance (); enumeration <string> e = request.getparameternames (); while (e.hasmoreelements ()) {string name = (string) e.nextelement (); string value = request.getParameter (name); beanutils.setproperty (bean, имя, значение);} return bean;} catch (exception e) {throw runtimeexcept (e);}}/**Generate uuid* @return*return static static static static static static Uuid.randomuuid (). ToString ();}}Наконец, давайте посмотрим на полный код RegisterServlet, ответственный за обработку регистрации пользователей:
Пакет me.gacl.web.controller; import java.io.ioexception; import java.util.date; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletresponse; import org.apache.commons.beanutils.beanutils; импорт org.apache.commons.beanutils.convertutils; импорт org.apache.commons.beanutils.locale.calerters.dateLocaleConverter; импорт. me.gacl.exception.userexistexception; import me.gacl.service.iuserservice; import me.gacl.service.impl.userserviceimpl; импортировать me.gacl.util.webutils; импорт me.gacl.web.formbean.registerformbean Extends httpservlet {public void Doget (httpservletrequest, httpservletresponse response) Throws ServletException, ioException {// incaplulation данные, представленные клиентом в регистр объекта регистрации. (formbean.validate () == false) {// Если проверка не удастся // Отправить объект формы, инкапсулирующий данные формы, заполненные пользователем обратно в форму формы на странице Register.jsp для отображения request.setattribute («Форма», форма register.jsprequest.getRequestDispatcher ("/web-inf/pages/regist.jsp"). user.setid (webutils.makeid ()); // Установить свойство идентификатора пользователя iuserservice service = new userserviceimpl (); // вызовать зарегистрированную службу пользователя, предоставленную Сервисом, для достижения службы регистрации пользователя. Registeruser (пользователь); String message = string.format ("Зарегистрировано успешно!! Он автоматически перепрыгнет на страницу входа для вас в секундах! request.getContextPath ()+"/servlet/loginuiservlet"); request.setattribute ("Сообщение", сообщение); request.getRequestDispatcher ("/message.jsp"). существует !! "); request.setattribute (" formbean ", formbean); request.getRequestDispatcher ("/web-inf/pages/regist.jsp "). // Записать исключение в фоновом запросе.setattribute ("Сообщение", "извините, не удастся !!"); request.getRequestDispatcher ("/message.jsp").Если проверка данных формы, заполненных в сбоях, когда пользователь регистрируется, сервер будет хранить объект формирования с сообщением об ошибке и данных формы в объекте запроса, а затем отправит его обратно на страницу Register.jsp. Поэтому нам необходимо снять объект Formbean в объекте запроса на странице Register.jsp, а затем повторно применить данные формы, заполненные пользователем, к соответствующему элементу формы, а также отобразить сообщение о приглашении, когда возникает ошибка в форме формы, чтобы пользователь знал, какие данные незаконны для заполнения!
Измените страницу Register.jsp, код следующим образом:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> Регистрация пользователя </title> </head> <body style = "text-align: center;"> <form action = "$ {pagecontext.request.contextpath}/servlet/registerserv/registerserv/registerserv/registerserv/" $ method = "post"> <table> <tr> <td> username </td> <td> <%-Использовать выражение el $ {} для извлечения данных формы, инкапсулированных в объекте Formbean, хранящегося в объекте запроса (Formbean.username) и сообщение об ошибке (formbean.errors.username)-%> <inpute = "text name =" username " value = "$ {formbean.username}"> $ {formbean.errors.username} </td> </tr> <tr> <td> пароль </td> <td> <input type = "password" name = "userpwd" value = "$ {formbean.userpwd}"> $ {formbean.errors.userpwd} </td> </tr> <tr> <td> подтвердить пароль </td> <td> <input type = "password" name = "sefintpwd" value = "$ {formbean.confirmpwd}"> $ {formbean.errors.confirmpwd} </td> </tr> <tr> <td> электронная почта </td> <td> <input type = "text" name = "Электронная почта" value = "$ {formbean.email}"> $ {formbean.errors.email} </td> </tr> <tr> <td> день рождения </td> <td> <input type = "text" name = "День рождения" value = "$ {formbean.birthday}"> $ {formbean.errors.birthday} </td> </tr> <tr> <td> <input Type = "Reset" value = "clear"> </td> <td> <input type = "prope" value = "regired"> </td> </tr> </table> </htbod> </ht> </td> </ht> </td> </td> </ht> </td> </ht>На этом этапе была разработана функция регистрации пользователя!
Следующие тесты разработанная функция регистрации пользователя:
Введите адрес URL -адреса: http: // localhost: 8080/webmvcframework/servlet/registeruiservlet для доступа к странице Register.jsp, а эффект операции выглядит следующим образом:
Если введенный элемент формы не соответствует правилам проверки, он не может быть зарегистрирован. Эффект работы заключается в следующем:
3.4.2. Разработать функцию входа в систему
1. Напишите логин в пакете me.gacl.web.ui, чтобы предоставить пользователям интерфейс входа в систему.
После того, как вход в систему получает запрос пользователя, он прыгает на Login.jsp
Код Loginuiservlet заключается в следующем:
Пакет me.gacl.web.ui; импорт java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservlectrequest; import javax.servlet.http.htpserquestrequest; import javax.servlet.http.htpserquestrequest; javax.servlet.http.httpservletresponse;/*** @author gacl* loginuiservlet отвечает за вывод интерфейса входа для пользователей* Когда пользователь обращается к входу Doget (запрос httpservletrequest, httpservletresponse response) throws servletexception, ioexception {request.getrequestdispatcher ("/web-inf/pages/login.jsp"). {Doget (запрос, ответ);}}2. Напишите страницу Login WurniN.
Код страницы login.jsp выглядит следующим образом:
<%@ page language = "java" pageencoding = "utf-"%> <! doctype html> <html> <head> <title> Пользовательский вход </title> </head> <body> <form action = "$ {pagecontext.request.contextpath}/servlet/loginserverv" method = "> username. name = "username"> <br/> пароль: <input type = "password" name = "password"> <br/> <input type = "propect" value = "login"> </form> </body> </html> <Form action = "$ {pagecontext.request.contextPath}/servlet/loginservlet" method = "post"> в login.jsp указывает, что форма отправляется и передается в LoginServlet для обработки.
3. Напишите LoginServtlet для обработки входа пользователя под пакетом ME.GACL.Web.Controller
Код LoginServlet заключается в следующем:
пакет me.gacl.web.controller; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservlectrequest; import javax.servlet.httpsessessevsevsevsevseerquest. me.gacl.domain.user; import me.gacl.service.iuserservice; import me.gacl.service.impl.userServiceImpl;/*** Сервт обрабатывает пользовательский вход*@author gacl **/public groginservlet httpservlet {public doget (htttpservelcervelcErvest httpservlet {public void doget (htttpservelcervelcErsvelseersevsevsevsevsevseers woid void voidserveser wepsesserservlet {htttpservervelceerserservled httpservlet ServletException, ioException {// Получите имя пользователя, заполненное пользователем пользователя string string = request.getParameter ("username"); // Получить пароль для входа в систему пользовательской строки пароль = request.getParameter («Пароль»); iuserservice service = new userserviceimp пароль); if (user == null) {string message = string.format («Извините, имя пользователя или пароль неверно !! Пожалуйста, войдите в систему! <Meta http-equiv = 'revresh' content = '; url =%s' ", request.getContextPath ()+"/servlet/loginuiservlet "); request.setattribute (" Сообщение ", сообщение); запрос. request.getSession (). setattribute ("user", user); string message = string.format ("поздравляю: %s, вход в систему успешна! Эта страница перейдет на домашнюю страницу за секунды!! <Meta http-equiv = 'revreh' content = '; url = %s'", user.getusername (), request.getContextPath ()+"/index.jsp"); request.setattribute ("message", message); request.getRequestDispatcher ("/message.jsp"). {Doget (запрос, ответ);}}На этом этапе функция входа пользователя была завершена.
Ниже проверьте разработанную функцию входа в систему пользователя, введите адрес URL -адреса: http: // localhost: 8080/webmvcframework/servlet/loginuiservlet.
Если введенное имя пользователя и пароль неверны, то вход в систему не может быть успешно войти в систему, а эффект работы заключается в следующем:
3.4.3. Разработать функцию отмены
Напишите LogoutServtlet для обработки входа пользователя в пакете me.gacl.web.controller
Код LogoutServlet заключается в следующем:
пакет me.gacl.web.controller; import java.io.ioexception; import java.text.messageformat; import javax.servlet.servletexception; импорт javax.servlet.http.httpservlet; import javax.servlet.htp.httpservlectrequest; javax.servlet.http.httpservletresponse; public class LogoutServlet расширяет httpservlet {public void Doget (httpservletrequest, httpservletrespons request.getSession (). removeAttribute ("user"); // Поскольку строка содержит отдельные кавычки, будут проблемы при использовании метода MessageFormat.format для объединения строки в этом случае //messageformat.format только для удаления отдельных кавычек в строке и не заполнят контент в указанную строку Secondemance in tempstrafformat. <meta http-equiv = 'refresh' content = '; url = {}'/> ", request.getContextPath ()+"/servlet/loginuiservlet "); System.out.println (tempstr); // Результат вывода: вход успешно! ! Он автоматически перепрыгнет на страницу входа для вас за несколько секунд! ! <meta http-equiv = обновление 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, ответ);}}用户登录成功后,会将登录的用户信息存储在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模式),希望对大家有所帮助!