初心者おすすめJSP+JavaBean+Service MVCモードユーザー登録モジュール


しばらくの学習を経て、最初のJSPプログラム、簡単なサーブレットプログラム、JSP+Javabeanの簡単なWeb計算機を実現しました.
ここでは総合的な練習として、古典的なMVC設計理念を利用して、ユーザー登録モジュールの設計を実現します.
ここで、JavaBeanは良好な再利用性と拡張性を有するため、データとしての論理処理はモデル層(Model)として機能する.JSPとHTMLはユーザーと対話するビューを専門に担当し、業務ロジックを一切含まず、(View)層として機能する.最後にバックエンドの要求制御などのトランザクションはサーブレットの制御層(Controller)に渡される.
登録画面のプレビューは次のとおりです.
登録に失敗しました.ユーザー名は既に存在します.
登録ページで登録情報をコミットし、バックグラウンド・データベースに送信して比較します.このユーザー名が同時に2回入力したパスワードが同じでない場合、登録に成功し、新しいユーザー情報をデータベースに格納します.そうしないと、登録失敗情報を返します.
プログラムとソースコードは文末に添付されます.
次に、具体的な実装を見て、まず準備をします.
準備作業
  • Tomcatサーバのインストール
  • MySQLをインストールしてuserデータベースを構築し、tb_を新規作成userデータテーブル
  • JDBCのMySQLドライバパッケージをダウンロード
  • 新しいuserデータベース
    JDBC共通クラスおよびインタフェース、および基本操作のJDBC基本操作の例におけるMySQLユーザーアカウント、データベース、データテーブルの作成を参照してください.
    ここでは、作成したeasyユーザーでログインし、userというデータベースを新規作成します.
    mysql -ueasy -p123456;
    create database user;
    

    次に、データベースにユーザー情報を格納するデータテーブルを作成します.
    use user;
    create table tb_user (
        username varchar(20) primary key,
        password varchar(20));
    

    ここにはユーザー名とパスワードしか保存されていません.usernameはプライマリ・キーであり、一意でなければなりません.
    jspビューレイヤ
    Tomcatインストールディレクトリのwebappsディレクトリの下に、このアプリケーションモジュールのルートディレクトリとして使用されるフォルダregを新規作成します.フォルダに入ります.regを新規作成jsp:
    "text/html;charset=gb2312" language="java" %>
    <html>
    <head>
        <title>Regtitle>
    head>
    <body>
        <center><img src="images/login.jpg"/>center>
        <center><font size=5 color="blue"><B>      B>font>center>
        <form action="RegServlet" method="post">
            <table align="center" width="450" border="0">
                
                <tr>
                    <td align="right">Username:td>
                    <td>
                        <input type="text" name="username">
                    td>
                tr>
                
                <tr>
                    <td align="right">Password:td>
                    <td>
                        <input type="password" name="password">
                    td>
                tr>
                
                <tr>
                    <td align="right">Confirm Password:td>
                    <td>
                        <input type="password" name="repassword">
                    td>
                tr>
                
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="Reg">
                        <input type="reset" value="Reset">
                    td>
                tr>
            table>
        form>
    body>
    html>

    これは簡単なjspプログラムで、中にはグラフが1つしかありません.
    9行、このフォームをRegServiceletに渡して処理することを指定します.
    11~17行で、グラフの最初の行にユーザー名行を作成します.
    18~24行、グラフの2行目にパスワードを設定する行を作成します.
    25~31行、グラフの3行目に重複確認パスワード行を作成します.
    32~38行で、グラフの4行目に「コミット」ボタンと「リセット」ボタンを推奨します.
    美しくするために、プレビューの大きな図のように7行にきれいな画像を追加しました.
    ダウンロードしたロゴを注意してください.jpgピクチャは/webapps/reg/images/パスの下に配置されます.つまり/regディレクトリの下にimagesフォルダを新規作成しlogin.jpgは中に入れればいいです.
    これでTomcatサーバを実行し、ブラウザに入力します.
    localhost:8080/reg/reg.jsp
    

    私たちがプレビューした最初の画像が見えます.ただし、後でJavaBeanとサーブレットが実装されていないため、コミットは登録できません.
    次に、同じ/regディレクトリの下にmessageを新規作成します.jsp:
    <body>
        <center><img src="images/regfail.jpg"/>center>
        String info = (String)request.getAttribute("info");
                if(info != null) {
                    out.print("
    "
    ); out.print(""); out.print(""); out.print(info); out.print(""); out.print(""); out.print(""); } %> body>

    このページは情報ヒントに使用されます.例えば、登録に成功し、ユーザー名がすでに存在し、2回の入力パスワードが一致しないなどです.このページは、制御層サーブレットによって転送されます.
    4行でリクエスト情報がrequestオブジェクトにカプセル化されており、ここではそのオブジェクトからinfo属性の情報(登録成功、ユーザ名が存在し、パスワードの確認が正しくない)が取得され、後でJavaBeanから返された結果、サーブレットに書き込まれていることがわかる.
    5~13行、info情報を出力します.
    美しくするために、私たちは同じように2行にきれいな画像を挿入します.
    JavaBeanモデルレイヤ
    まず、ユーザーエンティティのオブジェクトをカプセル化したユーザー情報のUserBeanを構築します.コードは非常に簡単です.2つのプロパティ、usernameとpassword、get、setメソッドしかありません.
    UserBean.java
    package beans;
    
    public class UserBean {
        private String username;
        private String password;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }

    次に、データベース接続用に重要なクラスを示します.
    DataBaseUtil.java
    package utils;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DataBaseUtil {
    
        public static Connection getConnection() {
            Connection connection = null;
            try{
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost/user";
                connection = DriverManager.getConnection(url, "easy", "123456");
                return connection;
    
            }catch(ClassNotFoundException nfe) {
                nfe.printStackTrace();
            }catch(SQLException sqle) {
                sqle.printStackTrace();
            }
            return connection;
        }
    
        public static void closeConnection(Connection connection) {
            if(connection != null) {
                try{
                    connection.close();
                }catch(SQLException sqle) {
                    sqle.printStackTrace();
                }
            }
        }
    }

    このクラスは主にデータベース接続と切断操作をカプセル化しています.
    12~15行はデータベースドライバをロードし、userデータベースに接続された接続を確立し、返します.
    25~33行で、データベース接続を切断する方法を提供します.
    JDBCの一般的なクラスやインタフェース、基本的な操作も参照できます.
    次に、データベースクエリー、追加、ユーザー情報の永続化など、ユーザーに関連するデータベース操作を行います.これらの操作はUserDaoクラスにカプセル化されています.
    UserDao.java
    package dao;
    
    import utils.DataBaseUtil;
    import beans.UserBean;
    
    import java.sql.*;
    
    public class UserDao {
    
        public boolean isUserExist(String username) {
            //create a connection
            Connection connection = DataBaseUtil.getConnection();
    
            String sql ="select * from tb_user WHERE username=?";
            try{
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setString(1, username);
                ResultSet resultSet = ps.executeQuery();
                if(!resultSet.next()) {
                    return true;
                }
            }catch(SQLException e) {
                System.out.println(e.toString());
                e.printStackTrace();
            }finally {
                DataBaseUtil.closeConnection(connection);
            }
            return false;
        }
    
        public boolean isPasswordConfirm(String password, String repassword) {
            return password.equals(repassword);
        }
    
        public void saveUser(UserBean user) {
            Connection connection = DataBaseUtil.getConnection();
    
            String sql = "insert into tb_user (username, password) values(?,?) ";
            try {
                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setString(1, user.getUsername());
                ps.setString(2, user.getPassword());
    
                ps.executeUpdate();
            }catch(SQLException e) {
                e.printStackTrace();
            }finally {
                DataBaseUtil.closeConnection(connection);
            }
        }
    }

    10~29行で、usernameと重複するユーザ名が存在するか否かをデータベースで比較する.ない場合はtrueを返し、falseを返す重複名があります.
    12行、DataBaseUtilの静的メソッドgetConnection()を呼び出してデータベース接続を返します.
    16~17行で、接続されたPrepareStatementを取得し、パラメータusernameをsql文の'?'に書き込むプレースホルダ
    18行、クエリーしてresultSetオブジェクトにクエリー結果を返します.
    19~21行、usernameに一致する結果がクエリーされなければtrueを返し、そうでなければ28行でflaseを返します.
    26行、データベース接続を切断します.
    31~33行は、2回入力したパスワードが等しいか否かを判断し、boolean型の結果を返す.等しいのはtrueで、等しくないのはfalseです.
    35~50行、登録ユーザ情報をtb_に書き込むuserデータテーブル.プロセスは、ユーザー名の重複を判断する方法と同じです.まず接続を取得し、パラメータを含むsql文をPrepareStatementに書き込み、データベースを挿入します.
    48行、データベース接続を切断します.
    これで、ユーザーとインタラクティブなビューレイヤと、特定のデータベースの操作をカプセル化しました.次に、コントロールレイヤのサーブレットのみが残ります.
    サーブレット制御層
    reg.jspでフォームをコミットし、サーブレットに処理します.サーブレットはフォームの情報を取得し、JavaBeanを呼び出してユーザー名が同じかどうか、パスワードが最終的に登録情報をライブラリに保存するかどうかを確認します.同時に最終結果をmessageを通過する.jspはユーザに提示される.
    SignInServlet.java
    package service;
    
    import beans.UserBean;
    import dao.UserDao;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class SignInServlet extends HttpServlet{
    
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String repassword = request.getParameter("repassword");
    
            UserDao userDao = new UserDao();
            if(username != null && !username.isEmpty()) {
                //          
                if(userDao.isUserExist(username) && userDao.isPasswordConfirm(password, repassword)) {
                    UserBean userBean = new UserBean();
                    userBean.setPassword(password);
                    userBean.setUsername(username);
                    userDao.saveUser(userBean);
                    request.setAttribute("info", "Congratulations! Reg successfully!");
                }else {
                    if(!userDao.isUserExist(username))
                        request.setAttribute("info", "Sorry! Username exists!");
                    if(!userDao.isPasswordConfirm(password, repassword))
                        request.setAttribute("info", "Sorry! Password not confirmed!");
                }
            }
            //forward to message.jsp
            request.getRequestDispatcher("message.jsp").forward(request, response);
        }
    }

    このコードは簡単なサーブレットプログラムを参照できます.
    ここではdoPost()メソッドのみを書き換えた.
    13~15行で、フォームから渡された3つのパラメータ値、すなわち、私たちが入力したusername、password、confirm passwordを取得します.
    17行、ユーザーデータベース操作オブジェクトuserDaoを新規作成します.
    18行で、ユーザー名が存在するかどうかを判断し、2回入力したパスワードが同じかどうかを判断します.
    21~24行は、登録情報が有効であれば、登録情報をデータベースに書き込む.
    25行、requestにinfo属性を書き込み、値は「Congratulations!Reg successfully!”
    27~30行、登録情報が無効であれば、それぞれinfo属性を「Sorry!Username exists!”そして「Sorry!Password not confirmed!”
    34行、messageに転送します.jspページ.
    プログラム配置実行
    これで、ビュー、モデルレイヤ、制御レイヤが作成されました.次に、プログラムの導入実行です.
    次のディレクトリ構造を作成します.
    まずregルートディレクトリの下にWEB-INFおよびimagesフォルダを作成します.上記の2つのjpgピクチャをimagesに入れます.
    次にWEB-INFに入り、classesとlibフォルダを作成します.準備作業中にダウンロードしたJDBC-MySQLドライバパッケージをlibに入れます.
    次にclassesフォルダに入り、UserBeanを作成します.java,DataBaseUtil.java,UserDao.JAvaとSignInServicelet.JAvaに対応するpackage名.パッケージはより明るい構造のためです.対照コードのpackage xxxはbeans,dao,service,utilsフォルダをそれぞれ作成する.その後、以上の4つのjavaファイルをclassファイルにコンパイルして対応するフォルダに配置します.
    そしてWEB-INF/ディレクトリに戻ります.Webを作成します.xmlプロファイル.ここでは、サーバが要求応答を処理するために対応するサーブレットを検索する方法を知っているようにサーブレットを構成する必要があります./WEB-INFフォルダにwebを作成する.xml,url-patternはこのサーブレットを/Regサーブレット対応regにマッピングする.jspのです.
    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <servlet>
                <servlet-name>SignInServletservlet-name>
                <servlet-class>service.SignInServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>SignInServletservlet-name>
            <url-pattern>/RegServleturl-pattern>
        servlet-mapping>
    web-app>

    message.jspとreg.jspはwebapps/reg/ディレクトリの下に置かれており、前述したように、これ以上説明しない.
    プログラム実行
    さっき作ったログインモジュールをテストすることができます.
    Tomcatを実行し、ブラウザで入力
    localhost:8080/reg/reg.jsp
    

    プレビューの登録画面が表示されます.
    それから私たちのユーザー名のパスワードを入力して、パスワードを確認します.
    regをクリックして、登録に成功しました!次のインタフェースが表示されます.
    登録に失敗すると、対応する失敗情報が表示されます.
    登録済みのユーザー名を使用して再登録しようとすると、ユーザー名がすでに存在するインタフェースが表示されます.
    新しいユーザー名を使用しますが、2回入力したパスワードが異なり、パスワードの確認が正しくないページが表示されます.
    ソースアドレス
    プログラムおよびソース