Диаграмма структуры MVC, реализованная с использованием Java Web, выглядит следующим образом, когда часть контроллера реализована с использованием сервлета, модель реализуется с использованием Javabean, и большинство представлений реализованы с использованием страниц JSP.
Идеологический фундамент
Принцип работы двухслойной структуры JSP+Javabean должен быть относительно знакомым и простым для понимания.
Тем не менее, одно должно быть ясно, что пользователь отправляет запрос веб -страницы через браузер. После того, как этот запрос прибывает на сервер, соответствующая веб -страница находится на стороне сервера. Если это первый запрос (второй раз не объясняется и не выполняется), для JSP необходимо сгенерировать сервлет, а затем выполнить сервлет через двигатель сервлета, внедрить результат вызова Javabean на страницу и вернуть его в браузер пользователя.
Суть трехслойной структуры сервлета JSP+Javabean+заключается в том, что есть дополнительный контроллер: сервлет для распространения запросов браузера клиента. Была бы очень полезно понять роль сервлета, который выступает в качестве контроллера в качестве предварительной обработки запроса клиента. Соответствующие отношения между запросами пользователей и конкретными сервлетами могут быть найдены через файл конфигурации web.xml. Каждый сервлет имеет конкретный объект сервлета, соответствующий ему, поэтому тот, который обрабатывает запросы пользователей, является объектом сервлета, унаследованным от Httpservlet.
!-JSPC Servlet Mappings Start-Servlet Servlet-Namems1/Servlet-Name Servlet-Classnews.firstaction/Servlet-Class/Servlet Servlet-Namems2/Servlet-Name Classnews.detailAction/Servlet-Class/Servlet! URL-PATTERN/Newsmain/URL-Pattern/Servlet Mapping Servlet Servlet-Namems2/Servlet-Name URL-Pattern/NewsDetail/URL-Pattern/Servlet Mapping
Как показано выше, раздел конфигурации Сервлета, выдержка из web.xml. Первая часть в основном используется для настройки сервлета, чтобы быть связанным с конкретным объектом сервлета. Вторая часть в основном используется для настройки того, какой сервенс обрабатывается запросом. Ассоциация имени Сервлета связана с конкретным объектом обработки сервлета. Например, запрос, отправленный клиентским браузером из /Newsmain, обрабатывается сервлетом MS1. Соответствующие новости Serlet Object. Первое время, то есть /newsmain-ms1-news.firstaction, что является значением файла конфигурации. Теперь, когда я понимаю, что запрос пользователя/газета будет обрабатываться объектами News.firstaction Class, поэтому для понимания программы вы должны понимать, какова функция FirstAction. Например, ниже приводится реализация FirstAction.
Public Final Class FirstAction расширяет httpservlet {secturet void service (httpservlectrequest req, httpservletresponse resp) throws servletexception, ioexception {db db = new db (); Httpsession session = req.getsession (); try {session.setattribute (constants.news_list_key, news .searchnewstitle (db)); } catch (Exception e) {e.printstackTrace (); } db.close (); String target = "/p43_news/newsmain.jsp"; Resp.sendredirect (цель); }} Благодаря этой реализации мы видим, что когда сервер получает запрос клиента для выполнения News.searchnewstitle (DB), затем вкладывает возвратное значение в сеанс через Session.Setattribute, а затем косвенно передает его в Newsmain.jsp через Resp.Sendredirect (Target). Таким образом, соответствующее значение, хранящееся в сеансе, может быть получено через функцию session.getattribute в Newsmain.jsp.
Оглядываясь назад, легко увидеть, что принцип работы JSP+Javabean отличается от принципа JSP+Javabean+Servlet. Двухслойная структура должна разместить предварительную обработку в JSP, например, News.SearchNewstitle (DB), а трехслойная структура сначала выполняет предварительную обработку в сервисе, а затем она эквивалентна возврату этого результата обработки в JSP в течение сеанса, так что JSP уделяет больше внимания отображению интерфейса.
Требования к модулю регистрации входа в систему
1 регистр
1.1 Форма регистрации пользователя (имя пользователя, пароль, электронная почта, прозвище, код проверки)
1.2 Отправить регистрацию: проверка на (имя пользователя, пароль, электронная почта, прозвище, код проверки).
1.2.1 Имя пользователя, пароль, электронная почта и прозвище завершены в клиентском браузере и реализованы через JS.
1.2.2 Код проверки должен быть заполнен в программе на стороне сервера.
2. Если проверка регистрационной формы будет принята, то бизнес -логика будет оценена.
2.1 Если пользователь уже существует, сообщите пользователю сообщение об ошибке.
2.2 Если адрес электронной почты уже существует, сообщите пользователю сообщение об ошибке.
2.3 Если нет, перейдите к шагу 3.
3. Сохранить пользовательскую информацию в базе данных
4. Зарегистрируйтесь успешно, перейдите на страницу входа в систему
5. Войдите
5.1 Отправить информацию о входе в систему пользователя на фону для проверки
5.2 Если проверка успешна, перейдите на домашнюю страницу
5.3 Если прыжок сбой, перейдите на страницу входа в систему и запросите сообщение об ошибке.
Структура каталогов проектов
Исходный код проекта разделен на четыре файла пакетов, которые используются для доступа к моделям, представлениям, контроллерам и классам инструментов. Конкретные файлы следующие:
Для представления мы определяем три страницы JSP следующим образом:
Определите представление
Login.jsp Page
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" http://www.w3.org/tml4/html4/html. <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> форма входа в систему </title> </head> <body> <font color = "Red"> $ {Сообщение} </font> <a href = "regist.jsp"> Регистрировать $. action = "$ {pagecontext.request.contextpath}/login" method = "post"> username: <input type = "text" name = "username"> <br/> пароль: <input type = "пароль" = "пароль"> <br/> <input type = "value =" login "> </form> </body> </html> </html> </html> </html> </html> </html> </html>index.jsp page
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <! Doctype html plustrail ". 4.01 Transitional // en "" http://www.w3.org/tr/html4/loose.dtd "> <html> <head> <meta http-evive =" content-type "content =" text/html; color = "red"> $ {message} </font> <% if (request.getSession (). getattribute ("username") == null) {response.sendredirect ("login.jsp"); } else { %> <font color = "red"> "Gelfess:" < %= request.getSession (). getAttribute ("username"). toString () %> </font> < %} %> </body> </html>Regist.jsp Page
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" http://www.w3.org/tml4/html4/html. <html> <Head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> Зарегистрированная форма пользователя </teal> <script type = "text/javascript"> functionImage () {Document.GetElementByID ("Image"). }/проверка? " + new Date (). getTime ()} function validateForm () {// подтвердить имя пользователя, пароль, электронная почта, никнам var username = document.getElementbyid ("username"). Value; if (username == "") {alert ("Имя пользователя не может быть пустым"); вернуть ложь; } var password = document.getElementById ("пароль"). Value; if (password == "") {alert ("пароль не может быть пустым"); вернуть ложь; } var repassword = document.getElementByid ("repassword"). Value; if (password! = repassword) {alert ("пароль должен быть согласованным"); вернуть ложь; } var nickname = document.getElementById ("никнам"). Value; if (chicname == "") {alert ("Прозвище не может быть пустым"); вернуть ложь; } // ^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(? if (email.match ("^// s*// w+(?: //. {0,1} [// w-]+)*@[a-za-z0-9]+(?: [-.] [a-za-z0-9]+)*//. вернуть ложь; }} </script> </head> <body> <h3> Таблица регистрации пользователя </h3> <font color = "red"> $ {message} </font> <form action = "$ {pagecontext.request.contextPath}/Регуст" onsubmit = "retury valideform ();" method = "post"> <table> <tr> <td> username </td> <td> <input type = "text" name = "username" id = "username1" v> </td> </tr> <tr> <td> password </td> <td> <Input = "password" = "password" = "password"> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> </td> Пароль </td> <td> <input type = "password" name = "repassword" id = "repassword"> </td> </tr> <tr> <td> никнам </td> <td> <input type = "text" name = "1 -й ник" id = "никнам"> </td> </tr> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> </td> </tr> <td> <td> </td> </tr> <td> <td> </td> </tr> <td> <td> </td> name = "email" id = "email"> </td> </tr> <tr> <td> проверка кода </td> <td> <input type = "text" name = "checkcode"> <img src = "$ {pagecontext.request.contextPath}/checkimage" style = "cursor: pinter"; id = "image" onclick = "manegimage ();"> </td> </tr> <tr> <td> </td> <td> <input type = "Отправить" value = "Регистрация"> </td> </tr> </table> </form> </body> </html> </td> </tr> </table> </form> </body> </html> Определите модель
Пользовательская модель:
пакет com.vs2022.model; пользователь открытого класса {private String username; Private String Password; Приватный прозвище; Приватная строковая электронная почта; // Alt+ SHFT+ S // Появится диалоговое окно для перезаписи. public String getUsername () {return username; } public void setUsername (string username) {this.username = username; } public String getPassword () {return пароль; } public void setPassword (String password) {this.password = password; } public String getNickName () {return chicname; } public void setnickName (String Nickname) {this.nickName = никнам; } public String getEmail () {return Email; } public void setEmail (string email) {this.email = email; }}Модель пользователя
пакет com.vs2022.model; import com.vs2022.utils.dbutil; Пользовательский пользовательский класс {public final Static int usernameexist = 1; Public Final Static int Emailexist = 2; Public Final Static Int Success = 3; Public Final Static Int Fail = 4; public int Registration (пользователь пользователя) {dbutil db = new dbutil (); if (db.serchusername (user.getusername ())) {// Укажите, что имя пользователя уже существует, возвращает usernameexist; } if (db.serchemail (user.getemail ())) {// это означает, что адрес электронной почты уже существует. Вернуть EmailExist; } // Если вы идете здесь, это означает, что имя пользователя адреса электронной почты не хранится, поэтому позвольте ему зарегистрироваться. Добавить в базу данных db.updateuser (пользователь); вернуть успех; } public int login (пользователь пользователя) {dbutil db = new dbutil (); if (db.loginsuccess (user.getusername (), user.getpassword ())) {// это означает, что имя пользователя и пароль были правильными. Вернуть успех; } return Fail; }} Модель контрольного кода
пакет com.vs2022.model; импортировать java.awt.color; импортировать java.awt.font; импортировать java.awt.graphics; Импорт java.awt.image.bufferedImage; импортировать java.io.ioexception; импортировать java.io.outputstream; импортировать java.util.hashtable; Импорт javax.imageio.imageio; Импорт javax.servlet.servletexception; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; Import javax.servlet.http.httpsession; открытый класс ceckcode {private String getRandomString () {int rannum = (int) (math.random () * 9000) + 1000; Вернуть rannum + "";} public void getCode (int width, int height, httpservletrequest, httpservletresponse response) Throws servletexception, ioException {// Создание изображения в память BufferedImage Image = new BuffereMage (ширина, высота, bufferedimage.type_rgb); Graphics g = image.getGraphics (); // Создать графический объект, его функция эквивалентна кисти G.SetColor (color.getColor ("f8f8f8")); G.FillRect (0, 0, ширина, высота); // рисовать фоновый шрифт mfont = new Font ("kaiti", font.bold, 16); // определить стиль шрифта g.setfont (mfont); // установить шрифт g.setcolor (color.red); // генерировать случайное число string rans = getRandomString (); // Написать случайное число в сеанс httpsession session = request.getSession (); session.setattribute ("check", rans); // написать случайное число на изображение g.drawstring (Rans, 5, 20); // Изображение эффективно g.dispose (); // Выходное изображение Imageio.Write (image, "jpeg", response.getOutputStream ());}} Определите контроллер
LoginServlet Class
пакет com.vs2022.controller; импорт java.io.ioexception; Импорт java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservelsess; импорт. com.vs2022.model.useroperation; открытый логический класс Extends httpservlet {public void doget (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {// логическая логическая строка username = refsure.getparameter ("username"); String password = request.getParameter ("пароль"); Пользователь пользователь = новый пользователь (); user.setusername (имя пользователя); user.setpassword (пароль); // Вызовите бизнес -функцию Javabean Class для реализации конкретной бизнес -логики входа в систему USEROPREETION US = NEW USEROPERATION (); // возвращаемое значение? int i = us.login (пользователь); if (i == 4) {// Это указывает на то, что вход не удастся, имя пользователя или пароль был неверным запросом. SetAttribute («Сообщение», «Имя пользователя или пароль было неверным»); request.getRequestDispatcher ("login.jsp"). } else {// Вход успешно, перейдите на домашнюю страницу Веб -сайта, используйте перенаправление // Сохранить имя пользователя в запрос домена сеанса.getSession (). setattribute ("username", username); response.sendredirect ("index.jsp"); //request.getRequestDispatcher("index.jsp").forward(Request, ответ); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}Класс Sgistservlet
пакет com.vs2022.controller; импорт java.io.ioexception; Импорт javax.servlet.servletexception; Импорт javax.servlet.http.httpservlet; Импорт javax.servlet.http.httpservletrequest; import javax.servlet.http.HttpServletResponse;import com.sun.org.apache.commons.beanutils.BeanUtils;import com.vs2022.model.User;import com.vs2022.model.UserOperation;public class RegistServlet extends HttpServlet { public void doGet(HttpServletRequest request, Httpservletresponse response) throws servletexception, ioexception {// Решение искаженного кода запроса. Setcharacterencoding ("utf-8"); // Полная проверка кода проверки string Code = request.getParameter ("fectcode"); String check_code_session = (string) request.getSession (). Getattribute ("check"); if (feetCode == null ||! fectCode.equals (check_code_session)) {// Укажите, что код проверки является вводом неправильно request.setattribute ("Сообщение", "Неверный проверка кода является неправильно вводом"); request.getRequestDispatcher ("regist.jsp"). возвращаться; } // Если вы попадете сюда, это означает, что все проверки прошли, и вызов включает в себя обработку бизнес -логики. Пользователь пользователь = новый пользователь (); // Beanuatils завершают инкапсуляцию данных в объект Java Bean, Apache A Apache Gar Bar Jark. Try {// Предварительное условие: Имя поля Javabean должно соответствовать ключу значения, представленного в форме, в противном случае инкапсуляция не может быть завершена. Beanatils.populate (user, request.getparametermap ()); } catch (Exception e) {e.printstackTrace (); бросить новое runtimeexception («Извините, данные инкапсуляции не удались»); } // Таким образом, новый класс бобов Java будет разработан для реализации пользовательского пользователя бизнес -логики US = New Useroperation (); try {int обратная связь = us.regist (user); if (обратная связь == useroperation.emailexist) {// указывает, что адрес электронной почты уже существует request.setattribute («Сообщение», «Адрес электронной почты уже существует»); request.getRequestDispatcher ("regist.jsp"). } else if (обратная связь == useroperation.usernameexist) {// Указывает, что имя пользователя уже существует request.setattribute («Сообщение», «Имя пользователя уже существует»); request.getRequestDispatcher ("regist.jsp"). } else {// указывает, что регистрация успешна и перейти на страницу входа в систему. Для использования redirect response.sendredirect ("login.jsp"); }} catch (Exception e) {e.printstackTrace (); бросить новое runtimeexception («добавить неудачу»); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}CheckImageservlet Class
пакет com.vs2022.controller; импорт java.io.ioexception; Импорт javax.servlet.servletexception; Импорт javax.servlet.http.httpservlet; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; import com.vs2022.model.checkcode; public class checkimageservlet Extends httpservlet {public void doget (httpservletrequest, httpservestrespons response.setheader ("pragma", "без Cache"); response.setheader («Контроль кэша», «без каша»); response.setDateHeader («истекает», 0); response.setContentType ("Image/jpeg"); int width = 40; int height = 30; // Сгенерировать анонимный объект кода проверки и генерировать код проверки New CickCode (). GetCode (ширина, высота, запрос, ответ); } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }} Определить классы инструментов
Dbutil Class
пакет com.vs2022.utils; импорт java.sql.*; Импорт com.vs2022.model.user; открытый класс dbutil {boolean binited = false; // загружать драйвер public void initjdbc () Throws classnotFoundException {// загрузить MySQL JDBC Class.forname ("com.mysql.jdbc.driver"); binited = true; System.out.println («Успешная загрузка драйвера MySQL!»); } public Connection getConnection () throws classnotfoundexception, sqlexception {if (! binited) {initjdbc (); } // URL -адрес соединения IS JDBC: MySQL // Адрес сервера/Имя базы данных // Следующие два параметра - это имя пользователя и пароль Connect Connect. DiverMager.getConnection ("jdbc: mysql: // localhost: 3306/database", "username", "password"); вернуть Конн; } public boolean loginsuccess (String username, String пароль) {boolean returnValue = false; String sql = "select * из пользователя, где username =? И пароль =?"; Соединение conn = null; Подготовленное предприятие PS = NULL; int i = 0; try {conn = getConnection (); ps = conn.preprestatement (sql); Ps.setString (1, имя пользователя); Ps.setString (2, пароль); ResultSet rs = ps.executequery (); if (rs.next ()) {returnValue = true; }} catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } returnValue; } public boolean updateUser (пользователь пользователя) {boolean flag = false; int i = 0; Соединение conn = null; Подготовленное предприятие PS = NULL; String sql = "Вставка в пользовательские (имя пользователя, пароль, прозвище, электронная почта) значения (?,?,?,?)"; try {conn = getConnection (); ps = conn.preprestatement (sql); Ps.setString (1, user.getUsername ()); // Установить значение для заполнителя. Порядок заполнителя начинается с 1. Первым параметром является позиция заполнителя, а второй параметр - это значение заполнителя. ps.setstring (2, user.getpassword ()); Ps.setString (3, user.getnickName ()); ps.setstring (4, user.getemail ()); i = ps.executeupdate (); if (i> 0) {flag = true; }} catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } вернуть флаг; } public boolean serchusername (string username) {boolean returnValue = false; String sql = "select * из пользователя, где username =?"; Соединение conn = null; Подготовленное предприятие PS = NULL; try {conn = getConnection (); ps = conn.preprestatement (sql); Ps.setString (1, имя пользователя); ResultSet rs = ps.executequery (); if (rs.next ()) {returnValue = true; }} catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } returnValue; } public Boolean Serchemail (String Email) {boolean returnValue = false; String sql = "select * из пользователя, где email =?"; Соединение conn = null; Подготовленное предприятие PS = NULL; int i = 0; try {conn = getConnection (); ps = conn.preprestatement (sql); Ps.setString (1, электронная почта); ResultSet rs = ps.executequery (); if (rs.next ()) {returnValue = true; }} catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } returnValue; }}