Java Webを使用して実装されたMVC構造図は次のとおりです。ここでは、コントローラーパーツがサーブレットを使用して実装され、モデルパーツはJavabeanを使用して実装され、ほとんどのビューはJSPページを使用して実装されます。
イデオロギー基礎
JSP+Javabeanの2層構造の実用的な原則は、比較的馴染みがあり、理解しやすいはずです。
ただし、1つのことが明確である必要があることは、ユーザーがブラウザを介してWebページリクエストを送信することです。このリクエストがサーバーに到着した後、対応するWebページはサーバー側にあります。 JSPの最初のリクエスト(2回目は説明および実行されない)である場合、サーブレットを生成してからサーブレットエンジンを介してサーブレットを実行し、Javabeanをページに呼び出してユーザーのブラウザに戻した結果を埋め込みます。
JSP+Javabean+サーブレットの3層構造の本質は、追加のコントローラーがあることです。クライアントブラウザリクエストを配布するサーブレットです。クライアントのリクエストを前処理するものとしてコントローラーとして機能するサーブレットの役割を理解することは非常に役立ちます。ユーザー要求と特定のサーブレットの間の対応する関係は、web.xml構成ファイルを介して見つけることができます。各サーブレットにはそれに対応する特定のサーブレットオブジェクトがあるため、ユーザー要求を処理するものはhttpservletから継承されたサーブレットオブジェクトです。
- URL-PATTERN/NEWSMAIN/URL-PATTERN/SERVET-MAPTINS SERVET-MAPTINS SERVET-NAMEMS2/SERVET-NAME URL-PATTERN/NEWSDETAIL/URL-PATTERN/SERVET-MAPTS
上記のように、web.xmlから抜粋した構成サーブレットのセクション。最初の部分は、主に特定のサーブレットオブジェクトに関連付けられるサーブレットを構成するために使用されます。 2番目の部分は、主にリクエストによってどのサーブレットが処理されるかを構成するために使用されます。サーブレット名の関連付けは、特定のサーブレット処理オブジェクトに関連付けられています。たとえば、 /Newsmainからクライアントブラウザから送信された要求は、MS1サーブレットによって処理されます。対応するSerlet Object.Firstaction、つまり、 /newsmain-ms1-news.firstactionは、構成ファイルの意味です。ユーザー/NewsmainリクエストがNews.Firstactionクラスのオブジェクトによって処理されることを理解したので、プログラムを理解するには、Firstactionの機能が何であるかを理解する必要があります。たとえば、以下はFirstactionの実装です。
パブリックファイナルクラスファーストアクションは、httpservletを拡張します{プロテクションボイドサービス(httpservletrequest req、httpservletresponse rep)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();文字列ターゲット= "/p43_news/newsmain.jsp"; resp.sendredirect(ターゲット); }}この実装を通じて、サーバーがクライアントのリクエストを受信してnews.searchNewStitle(DB)を実行すると、セッションを介してセッションに戻り値を設定し、sersmmain.jspにrep.sendredirect(ターゲット)を介してnewsmain.jspに間接的に転送することがわかります。このようにして、セッションに保存されている対応する値は、session.getattribute function in newsmain.jspを通じて取得できます。
振り返ってみると、JSP+Javabeanの作業原則がJSP+Javabean+サーブレットの原則とは異なることがわかります。 2層構造は、たとえばNews.SearchNewStitle(DB)など、JSPに前処理を配置する必要があり、3層構造は最初にサーブレットで前処理を実行し、次にこの処理結果をセッションで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" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! <html> <head> <メタhttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title> login form </title> </head> <body> <font color = "red"> $ {message} </font> <a href = "regist.jsp"> register action = "$ {pagecontext.request.contextpath}/login" method = "post"> username:<input type = "text" name = "username"> <br/>パスワード:<入力タイプ= "パスワード" name "> <br/> <inputタイプ=" value = "" login ">index.jspページ
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" fentix = "c" "%> <トランジション// en "" http://www.w3.org/tr/html4/loose.dtd "> <html> <head> <meta http-equiv =" content-type "content =" text/html } </font> <%if(request.getSession()。getAttribute( "username")== null){respons.sendredirect( "login.jsp"); } else {%> <font color = "red"> "welcome:" <%= request.getSession()。getAttribute( "username")。toString()%> </font> <%}%> </body> </html>regist.jspページ
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! <html> <head> <メタhttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title>ユーザー登録フォーム</title> <script type = "text/javascript"> function changeimage(){document.getelementbyid( "image")。 }/チェックイメージ? " + new date()。getTime()} function validateform(){// username、password、email、nickname var username = document.getelementbyid( "username")。value; if(username == ""){alert( "usernameは空にすることはできません"); falseを返します。 } var password = document.getElementById( "Password")。value; if(password == ""){alert( "パスワードは空にすることはできません"); falseを返します。 } var repassword = document.getElementById( "Repassword")。value; if(password!= repassword){alert( "パスワードは一貫している必要があります"); falseを返します。 } var nickname = document.getElementById( "nickname")。value; if(nickname == ""){alert( "nickname be ve vey"); falseを返します。 } // ^// s*// w+(?://。{0,1} [// w-]+)*@[a-za-z0-9]+(?:[。] [a-za-z0-9]+)*//。 if(email.match( "^// s*// w+(?://。{0,1}」[// w-]+)*@[a-za-z0-9]+(?:[。] [a-za-z0-9]+)*//。 falseを返します。 }} </script> </head> <body> <h3>ユーザー登録の表</h3> <font color = "red"> $ {message} </font> <form action = "$ {pagecontext.request.contextpath}/regist" onsubmit = "return validateform();"方法= "post"> <table> <tr> <td> username </td> <td> <入力タイプ= "テキスト" name = "username" id = "username1" v> </td> </tr> <tr> <td>パスワード</td> <td> <入力タイプ= "パスワード"パスワード "パスワード"> </td> <td </td> </td>パスワード</td> <td> <入力タイプ= "パスワード" name = "repassword" = "repassword"> </td> </tr> <tr> <td> nickname </td> <td> <入力タイプ= "テキスト" name = "nickname" id = "nickname"> </td> </td> <td> </td> </td> name = "email" id = "email"> </td> </tr> <tr> <td>検証コード</td> <td> <入力タイプ= "text" name = "checkcode"> <img src = "$ {pagecontext.request.contextpath}/checkimage =" cursor:pointer; "cursor;" cursor; "cursor;" cursor; id = "image" onclick = "ChangeImage();"> </td> </tr> <tr> <td> </td> <td> <入力タイプ= "submit" value = "登録"> </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(){パスワードを返します。 } public void setPassword(string password){this.password = password; } public string getnickname(){return nickname; } public void setnickname(string nickname){this.nickname = nickname; } public string getemail(){return email; } public void setemail(string email){this.email = email; }}ユーザーオペレーションモデル
パッケージcom.vs2022.model;インポートcom.vs2022.utils.dbutil; public class useroperation {public final static int usernameexist = 1; public final static int emailexist = 2;パブリック最終的な静的int success = 3; public final static int fail = 4; public int登録(ユーザーユーザー){dbutil db = new dbutil(); if(db.serchusername(user.getusername())){//ユーザー名が既に存在することを示しています。 } if(db.serchemail(user.getemail())){//電子メールアドレスが既に存在することを意味します。 emailExistを返します。 } //ここを歩いている場合、電子メールアドレスのユーザー名が保存されていないことを意味します。したがって、登録してください。データベースdb.updateuser(user)に追加します。成功を返す; } public int login(user user){dbutil db = new dbutil(); if(db.loginsuccess(user.getusername()、user.getPassword())){//ユーザー名とパスワードが正しいことを意味します。成功を返す; } return fail; }}チェックコードモデル
パッケージcom.vs2022.model; import 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をインポートします。 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 request、httpservletresponse応答)Servletexception、ioexception {//メモリバッファレジマージ画像=新しいバッファディマージ(幅、高さ、高さ、緩衝項、bufferedimage.type_int_rgbb);グラフィック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); // IMAGE EXEMOFIC G.DISPOSE(); // output image imageio.write(image、 "jpeg"、response.getOutputStream());}}コントローラーを定義します
LoginServletクラス
パッケージcom.vs2022.controller; import java.io.ioexception; java.io.printwriter; Import javax.servlet.servletexception; import javax.servlet.http.httpservlet; Import javax.servlet.httpservletrequest; Import javax.servlet.http.httpservletResponseponse; com.vs2022.model.useroperation; public class loginservletはhttpservlet {public void doget(httpservletrequest request、httpservletrequest Response)を拡張します。文字列パスワード= request.getParameter( "password"); user user = new user(); user.setusername(username); user.setPassWord(パスワード); //ビジネス関数Javabeanクラスを呼び出して、Login useroperationの特定のビジネスロジックを実装しますus = new useroperation(); //値を返しますか? int i = us.login(user); (i == 4){//ログインが失敗したことを示します。ユーザー名またはパスワードが誤った要求でした。 request.getRequestDispatcher( "login.jsp")。 } else {//正常にログインし、ウェブサイトのホームページにジャンプし、リダイレクトを使用します//ユーザー名をセッションドメインrequest.getSession()。 Response.sendredirect( "index.jsp"); //REQUEST.GETREQUESTDISPATCHER( "index.jsp").Forward(REQUEST、Response); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}RegistServletクラス
パッケージcom.vs2022.controller; import java.io.ioexception; javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponse;インポートcom.sun.org.apache.commons.beanutils.beanutils; Import com.vs2022.model.user; Import com.vs2022.model.useroperation; httpservletResponse応答)servletexception、ioexception {//文字化けコード要求を解決します。setcharacterencoding( "utf-8"); //検証コード文字列checkCode = request.getParameter( "CheckCode")の確認を完了します。 string check_code_session =(string)request.getSession()。getAttribute( "check"); if(checkcode == null ||!checkcode.equals(check_code_session)){//検証コードが誤ってrequest.setTribute( "message"、 "誤った検証コードが誤って入力されていることを誤って要求していることを示します。 request.getRequestDispatcher( "regist.jsp")。戻る; } //ここに到達した場合、それはすべての検証が通過したことを意味し、呼び出しにはビジネスロジックの処理が含まれます。 user user = new user(); // beanutilsデータのカプセル化をJava Beanオブジェクトに記入し、Apache FoundationのオープンソースJAR実装を行います。 try {//前提条件:Javabeanのフィールド名は、フォームで提出された値のキーと一致する必要があります。そうしないと、カプセル化を完了できません。 beanutils.populate(user、request.getParametermap()); } catch(Exception e){e.printstacktrace();新しいruntimeexceptionを投げます(「申し訳ありませんが、カプセル化データが失敗しました」); } //したがって、新しいJava Beanクラスは、ビジネスロジックユーザーオペレーションを実装するように設計されます。 {intフィードバック= us.regist(user); if(feedback == useroperation.emailexist){//メールアドレスが既に存在していることを示します。 request.getRequestDispatcher( "regist.jsp")。 } else if(feedback == useroperation.usernameExist){//ユーザー名が既に存在していることを示します。 request.getRequestDispatcher( "regist.jsp")。 } else {//登録が成功し、ログインページにジャンプしていることを示します。 Redirect Response.sendredirect( "login.jsp")を使用するには、 }} catch(例外e){e.printstacktrace();新しいruntimeexception( "add failed"); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}CheckImageservletクラス
パッケージcom.vs2022.controller; import java.io.ioexception; javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletresponse;インポートcom.vs2022.model.checkcode; public class checkimageservletはhttpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答) Response.setheader( "Pragma"、 "no-cache"); Response.setheader( "Cache-Control"、 "no-cache"); Response.setDateHeader( "Expires"、0); Response.setContentType( "Image/jpeg"); int width = 40; int height = 30; //検証コードの匿名オブジェクトを生成し、検証コードを生成しますnew checkCode()。getCode(width、height、request、response); } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}ツールクラスを定義します
dbutilクラス
パッケージcom.vs2022.utils; import java.sql。*; com.vs2022.model.user; public class dbutil {boolean binited = false; //ドライバーを公開void initjdbc()classNotFoundException {// mysql jdbc driver class.forname( "com.mysql.jdbc.driver"); binited = true; System.out.println( "MySQLドライバーのロードの成功!"); } public connection getConnection()throws classNotFoundException、sqlexception {if(!binited){initjdbc(); } //接続URLはjdbc:mysql // serverアドレス/データベース名//次の2つのパラメーターはログインユーザー名とパスワード接続です= drivermanager.getConnection( "jdbc:mysql:// localhost:3306/database"、 "username"、 "); conn; } public boolean loginsuccess(string username、string password){boolean returnvalue = false; string sql = "select * from user where username =?and password =?";接続conn = null; represedStatement PS = null; int i = 0; try {conn = getConnection(); ps = conn.preparestatement(sql); ps.setString(1、username); ps.setString(2、パスワード);結果rs = ps.executequery(); if(rs.next()){returnValue = true; }} catch(classNotFoundException e){e.printstacktrace(); } catch(sqlexception e){e.printstacktrace(); } return returnValue; } public boolean updetwususer(user user){boolean flag = false; int i = 0;接続conn = null; represedStatement PS = null; string sql = "ユーザーに挿入(ユーザー名、パスワード、ニックネーム、電子メール)values(?、?、?、?)"; try {conn = getConnection(); ps = conn.preparestatement(sql); ps.setString(1、user.getusername()); //プレースホルダーの値を設定します。プレースホルダーの注文は1から始まります。最初のパラメーターはプレースホルダーの位置であり、2番目のパラメーターはプレースホルダーの値です。 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(); } flagを返します。 } public boolean serchusername(string username){boolean returnvalue = false; string sql = "select * from user where username =?";接続conn = null; represedStatement PS = null; try {conn = getConnection(); ps = conn.preparestatement(sql); ps.setString(1、username);結果rs = ps.executequery(); if(rs.next()){returnValue = true; }} catch(classNotFoundException e){e.printstacktrace(); } catch(sqlexception e){e.printstacktrace(); } return returnValue; } public boolean serchemail(string email){boolean returnvalue = false; string sql = "select * fromユーザーwhere email =?";接続conn = null; represedStatement PS = null; int i = 0; try {conn = getConnection(); ps = conn.preparestatement(sql); ps.setString(1、email);結果rs = ps.executequery(); if(rs.next()){returnValue = true; }} catch(classNotFoundException e){e.printstacktrace(); } catch(sqlexception e){e.printstacktrace(); } return returnValue; }}