Java Web을 사용하여 구현 된 MVC 구조 다이어그램은 다음과 같습니다. 여기서 컨트롤러 부분은 서블릿을 사용하여 구현되며 모델 부분은 Javabean을 사용하여 구현되며 대부분의보기는 JSP 페이지를 사용하여 구현됩니다.
이데올로기 기초
JSP+Javabean의 2 층 구조의 작동 원리는 비교적 친숙하고 이해하기 쉬워야합니다.
그러나 한 가지는 사용자가 브라우저를 통해 웹 페이지 요청을 보낸다는 것입니다. 이 요청이 서버에 도착하면 해당 웹 페이지가 서버 측에 있습니다. JSP의 경우 첫 번째 요청 (두 번째로 설명 및 실행되지 않음) 인 경우 서블릿을 생성 한 다음 서블릿 엔진을 통해 서블릿을 실행해야하며 Javabean을 페이지에 전화 한 결과 사용자의 브라우저로 반환했습니다.
JSP+Javabean+Servlet의 3 층 구조의 본질은 추가 컨트롤러가 있다는 것입니다. 클라이언트 브라우저 요청을 배포하는 서틀. 클라이언트의 요청을 전처리하는 컨트롤러 역할을하는 서블릿의 역할을 이해하는 것이 큰 도움이 될 것입니다. 사용자 요청과 특정 서블릿 간의 해당 관계는 web.xml 구성 파일을 통해 찾을 수 있습니다. 각 서블릿에는 해당 특정 서블릿 객체가 있으므로 사용자 요청을 처리하는 객체는 httpservlet에서 상속 된 서블릿 객체입니다.
!-JSPC Servlet Mappings 시작-Servlet Servlet-Namems1/Servlet-Name Servlet-ClassNews.FirStaction/Servlet-Class/Servlet Servlet Servlet-Namems2/Servlet-Name Servlet-ClassNews.DetailAction/Servlet 클래스/Servles!-JSPC Servlet Mappings END- 서브 맵 Servlet Namems1/Servlet-Name URL-PATTERN/NEWSMAIN/URL-PATTERN/SERVLET-MAPPED Servlet-Namems2/Servlet-Name URL-PATTERN/NEWSDETAIL/URL-PATTERN/SERVLET-MAPPING
위에서 볼 수 있듯이, 구성 서블릿 섹션은 web.xml에서 발췌. 첫 번째 부분은 주로 특정 서블릿 객체와 관련되도록 서블릿을 구성하는 데 사용됩니다. 두 번째 부분은 주로 요청에 따라 처리되는 서블릿을 구성하는 데 사용됩니다. 서블릿 이름의 연관성은 특정 서블릿 처리 객체와 관련이 있습니다. 예를 들어, 클라이언트 브라우저에서 /NewsMain에서 보낸 요청은 MS1 서블릿에서 처리됩니다. 해당 Serlet Object News.FirStaction, 즉 /NewsMain-MS1-News.FirStaction, 이는 구성 파일의 의미입니다. 이제 사용자/뉴스 메인 요청이 News.Firstaction 클래스의 객체에 의해 처리 될 것이라는 것을 이해하므로 프로그램을 이해하려면 FirstAction의 기능이 무엇인지 이해해야합니다. 예를 들어, 다음은 FirstAction의 구현입니다.
Public Final Class FirstAction 확장 httpservlet {Protected void service (httpservletrequest req, httpservletrepsonse resp) servletexception, ioexception {db db = new db (); httpsession session = req.getSession (); try {session.setattribute (constants.news_list_key, News .searchNewStitle (db)); } catch (예외 e) {e.printstacktrace (); } db.close (); 문자열 target = "/p43_news/newsmain.jsp"; resp.sendredirect (대상); }} 이 구현을 통해 서버가 클라이언트 요청을 수신 할 때 News.SearchNewStitle (DB)을 수행 한 다음 Session.SetAttribute를 통해 세션에 반환 값을 넣은 다음 RESP.SendRedirect (Target)을 통해 NewsMain.jsp로 간접적으로 전송하는 것을 알 수 있습니다. 이러한 방식으로 세션에 저장된 해당 값은 Session.getAttribute 함수를 통해 얻을 수 있습니다.
되돌아 보면 JSP+Javabean의 작동 원리는 JSP+Javabean+Servlet의 원리와 다르다는 것을 쉽게 알 수 있습니다. 2 층 구조는 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 점프가 실패하면 로그인 페이지로 점프하여 오류 메시지를 자랑합니다.
프로젝트 디렉토리 구조
프로젝트의 소스 코드는 모델, 뷰, 컨트롤러 및 도구 클래스에 액세스하는 데 사용되는 4 개의 패키지 파일로 나뉩니다. 특정 파일은 다음과 같습니다.
보기를 위해 3 개의 JSP 페이지를 다음과 같이 정의합니다.
보기를 정의하십시오
login.jsp 페이지
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 transitional // en" "http://www.w3.org/tr/tml/html 4/tml/html 4/tml 4.html/html 4.tml. <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"> <title> 로그인 양식 </title> </head> <body> <font color = "red"> $ {message} </font> <a href = "regist.jsp"> 새로운 계정 </a> action = "$ {pagecontext.request.contextpath}/login"method = "post"> username : <input type = "text"name = "username"> <br/> password : <input type = "password"name = "password"> <br/> input type = "value ="login "> body> </html>index.jsp 페이지
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"c "%> <! duttype html 4.01 전환 // en ""http://www.w3.org/tr/html4/loose.dtd "> <html> <head> <meta http-equiv ="content-type "content ="text/html; color = "red"> $ {message} </font> <% if (request.getSession (). getAttribute ( "username") == null) {response.sendRedirect ( "login.jsp"); } else { %> <font color = "red"> "welcome :"< %= request.getSession (). getAttribute ( "username"). toString () %> </font> < %} %> </body> </html>regist.jsp 페이지
<%@ page language = "java"contmenttype = "text/html; charset = utf-8"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 transitional // en" "http://www.w3.org/tr/tml/html 4/tml/html 4/tml 4.html/html 4.tml. <html> <head> <meta http-equiv = "content-type"content = "text/html; charset = utf-8"> title> 사용자 등록 양식 </title> <script type = "text/javaScript"> function changeImage () {document.getElementById ( "image"). }/CheckImage? " + 새 날짜 (). gettime ()} function validateform () {// 사용자 이름, 비밀번호, 이메일, 별명 var username = document.getElementById ( "username"). value; if (username == "") {alert ( "사용자 이름이 비어있을 수 없음"); 거짓을 반환합니다. } var password = document.getElementById ( "password"). 값; if (password == "") {alert ( "암호가 비어있을 수 없음"); 거짓을 반환합니다. } var repassword = document.getElementById ( "Repassword"). 값; if (password! = repassword) {alert ( "비밀번호 일관성이 있어야한다"); 거짓을 반환합니다. } var 닉네임 = document.getElementById ( "nickname"). 값; if (nickname == "") {alert ( "닉네임이 비어질 수 없음"); 거짓을 반환합니다. } // ^// s*// w+(? : //. if (email.match ( "^// s*// w+(? : //. 거짓을 반환합니다. }} </script> </head> <body> <h3> 사용자 등록 테이블 </h3> <font color = "red"> $ {message} </font> <form action = "$ {pagecontext.request.contepp}/regist"onsubmit = "return validateform ();" 메소드 = "post"> <table> <tr> <td> username </td> <td> <input type = "text"name = "username"id = "username1"v> </td> </tr> <tt> <td> 암호 </td> <td> <input type ""password "name ="password "</td> <td> <td> <td> <td> 비밀번호 </td> <td> <입력 유형 = "비밀번호"이름 = "repassword"id = "repassword"> </td> </tr> <td> <td> 닉네임 </td> <td> <input type = "text"name = "nickname"id = "nickname"> </td> <tr> <td> <td> <td> <td> <td> 이름 = "email"id = "이메일"> </td> </tr> <td> <td> verification code </td> <td> <입력 유형 = "text"name "="checkCode "> <img src ="$ {pagecontext.request.ContextPath}/Checkimage "style ="cursor : pointer; " id = "image"onclick = "changeImage ();"> </td> </tr> <td> <td> </td> <td> <입력 유형 = "value ="ritistration "> </td> </tr> </table> </form> </body> </html> 모델을 정의하십시오
사용자 모델 :
패키지 com.vs2022.model; public class user {private String username; 개인 문자열 비밀번호; 개인 문자열 별명; 개인 문자열 이메일; // alt+ shft+ s // 덮어 쓰기 메소드를위한 대화 상자가 나타납니다. public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; } public String getNickName () {return 닉네임; } public void setNickName (문자열 별명) {this.nickName = 별명; } public String getEmail () {반환 이메일; } public void seteMail (문자열 이메일) {this.email = 이메일; }}사용자 점수 모델
패키지 com.vs2022.model; import com.vs2022.utils.dbutil; public class userOperation {public final static int usernameexist = 1; 공개 최종 정적 int emailexist = 2; 공개 최종 정적 INT 성공 = 3; 공개 최종 정적 int 실패 = 4; 공개 int 등록 (사용자 사용자) {dbutil db = new dbutil (); if (db.serchusername (user.getusername ())) {// 사용자 이름이 이미 존재한다는 것을 나타냅니다. } if (db.serchemail (user.getEmail ())) {// 이메일 주소가 이미 존재한다는 것을 의미합니다. react emailexist; } // 여기를 걷는 경우 이메일 주소 사용자 이름이 저장되지 않았으므로 등록하십시오. 데이터베이스 db.updateuser (사용자)에 추가합니다. 반환 성공; } public int login (사용자 사용자) {dbutil db = new dbutil (); if (db.loginsuccess (user.getusername (), user.getpassword ())) {// 사용자 이름과 암호가 올바른 것을 의미합니다. 반환 성공; } 반환 실패; }} 체크 코드 모델
패키지 com.vs2022.model; import java.awt.color; Java.awt.Font 가져 오기; java.awt.graphics 가져 오기; java.awt.image.bufferedimage import; import java.io.ioexception; import java.io.outputStream; java.util.hashtable import; import javax.imageio.imageio; javax.servlet.servletexception import; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; public class checkcode {private string getrandomstring () {int rannum = (int) (math.random () * 9000) + 1000; return rannum + "";} public void getCode (int width, int height, httpservletrequest 요청, httpservletResponse 응답) servletexception, ioexception {// 메모리 bufferedimage image = new bufferedimage (너비, 높이, bufferedimage.type_int_rgb); 그래픽 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)를 설정합니다. // 임의의 숫자 생성 문자열 RANS = getRandomString (); // 세션에 랜덤 번호를 쓰기 httpsession session = request.getSession (); session.setattribute ( "Check", Rans); // 이미지 G.DrawString에 임의 번호를 쓰기 (Rans, 5, 20); // 이미지 유효 g.dispose (); // output image imageio.write (image, "jpeg", response.getOutputStream ());}} 컨트롤러를 정의하십시오
loginservlet 클래스
패키지 com.vs2022.controller; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.htttp.httervletresponse; import com.vs202.moder; com.vs2022.model.useroperation; public class loginservlet는 httpservlet {public void doget (httpservletrequest request, httpservletreponse responsk)을 servletexception, ioexception {// 논리적 논리 문자열 username = request.getParameter ( "username"); 문자열 비밀번호 = request.getParameter ( "password"); 사용자 user = 새 사용자 (); user.setusername (사용자 이름); user.setpassword (비밀번호); // 비즈니스 기능 Javabean 클래스를 호출하여 로그인의 특정 비즈니스 로직을 구현하십시오. USEROPERATION us = new userOperation (); // 반환 값? int i = us.login (사용자); if (i == 4) {// 로그인이 실패했음을 나타냅니다. 사용자 이름 또는 비밀번호가 잘못되었음을 나타냅니다. request.getRequestDispatcher ( "login.jsp"). FORMPER (요청, 응답); } else {// 성공적으로 로그인하고 웹 사이트의 홈페이지로 점프하고 리디렉션을 사용하십시오. // 세션 도메인 요청에 사용자 이름을 저장하십시오. getSession (). setAttribute ( "username", username); Response.SendRedirect ( "index.jsp"); //request.getRequestDisPatcher("index.jsp").forward(request, responsk); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}registservlet 클래스
패키지 com.vs2022.controller; import java.io.ioexception; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httvletresponse; import com.sun.org.apache.commons.beanutils.beanutils; import com.vs2022.model.user; import com.vs2022.model.useroperation; public class registservlet 확장 httpervlet (htterperverest) httpservletresponse responsk) servletexception, ioexception {// garbled 코드 요청을 해결합니다 .SetcharacterEncoding ( "UTF-8"); // 확인 코드의 완료 문자열 문자열 checkCode = request.GetParameter ( "checkCode"); 문자열 check_code_session = (string) request.getSession (). getAttribute ( "Check"); if (checkCode == null ||! checkCode.equals (check_code_session)) {// 확인 코드가 잘못 입력되었음을 나타냅니다. request.getRequestDispatcher ( "regist.jsp"). forward (요청, 응답); 반품; } // 여기에 도착하면 모든 검증이 통과되었고 호출에는 비즈니스 로직 처리와 관련이 있음을 의미합니다. 사용자 user = 새 사용자 (); // Beanutils 데이터를 Java Bean 객체로 캡슐화하는 것을 완료합니다. try {// 전제 조건 : Javabean의 필드 이름은 양식으로 제출 된 값의 키와 일치해야합니다. 그렇지 않으면 캡슐화를 완료 할 수 없습니다. beanutils.populate (user, request.getparametermap ()); } catch (예외 e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "죄송합니다, 캡슐화 데이터가 실패했습니다"); } // 새 Java Bean 클래스는 비즈니스 로직 사용자 정리를 구현하도록 설계됩니다. US = New UserOperation (); try {int feedback = us.regist (user); if (피드백 == userOperation.emailExist) {// 이메일 주소가 이미 존재한다는 것을 나타냅니다. request.getRequestDispatcher ( "regist.jsp"). forward (요청, 응답); } else if (피드백 == userOperation.usernameExist) {// 사용자 이름이 이미 request.setAttribute ( "메시지", "사용자 이름이 이미 존재한다")를 나타냅니다. request.getRequestDispatcher ( "regist.jsp"). forward (요청, 응답); } else {// 등록이 성공하고 로그인 페이지로 이동합니다. REDIRECT 응답을 사용하려면 SENDREDIRECT ( "login.jsp"); }} catch (예외 e) {e.printstacktrace (); 새로운 runtimeexception을 던지십시오 ( "실패한 추가"); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}CheckImageserVlet 클래스
패키지 com.vs2022.controller; import java.io.ioexception; javax.servlet.servletexception import; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.htttp.httpservletresponse; import com.vs2022.model.checkcode; public class checkimageservlet는 httpservlet {public void doget (httpservletrequest request, httpservletrequest resight)를 확장합니다. Response.SetHeader ( "Pragma", "No-Cache"); Response.SetHeader ( "Cache-Control", "No-Cache"); response.setDateHeader ( "만료", 0); Response.setContentType ( "image/jpeg"); int 너비 = 40; int 높이 = 30; // 검증 코드의 익명 객체를 생성하고 검증 코드를 생성합니다. new CheckCode (). getCode (너비, 높이, 요청, 응답); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }} 도구 클래스를 정의합니다
dbutil 클래스
패키지 com.vs2022.utils; import java.sql.*; import com.vs2022.model.user; public class dbutil {boolean binited = false; // 드라이버로드 public void initjdbc ()는 classNotFoundException {// mysql jdbc driver class.forname ( "com.mysql.jdbc.driver"); binited = true; System.out.println ( "성공로드 MySQL 드라이버!"); } public Connection getConnection ()는 classNotFoundException, sqlexection {if (! binited) {initjdbc (); } // 연결 URL은 JDBC입니다 : MySQL // 서버 주소/데이터베이스 이름 // 다음 두 매개 변수는 로그인 사용자 이름과 암호 연결 Conn = DriverManager.GetConnection ( "JDBC : MySQL : // localHost : 3306/Database", "UserName", "Password"); CONN을 반환; } public boolean loginsuccess (문자열 사용자 이름, 문자열 암호) {boolean returnValue = false; 문자열 sql = "사용자에서 username =? and password =?"; 연결 Conn = null; 준비된 상태 ps = null; int i = 0; try {conn = getConnection (); ps = conn.preparestatement (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 (); } return returnValue; } public boolean updateUser (사용자 사용자) {부울 플래그 = false; int i = 0; 연결 Conn = null; 준비된 상태 ps = null; String SQL = "사용자에 삽입 (사용자 이름, 비밀번호, 닉네임, 이메일) 값 (?,?,?,?); try {conn = getConnection (); ps = conn.preparestatement (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; 문자열 sql = "사용자에서 username =?"에서 선택 *; "; 연결 Conn = null; 준비된 상태 ps = null; try {conn = getConnection (); ps = conn.preparestatement (SQL); ps.SetString (1, 사용자 이름); resultSet rs = ps.ExecuteQuery (); if (rs.next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; } public boolean serchemail (문자열 이메일) {boolean returnValue = false; 문자열 sql = "select * where where email =?"; 연결 Conn = null; 준비된 상태 ps = null; int i = 0; try {conn = getConnection (); ps = conn.preparestatement (SQL); ps.SetString (1, 이메일); resultSet rs = ps.ExecuteQuery (); if (rs.next ()) {returnValue = true; }} catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return returnValue; }}