2

私は正常に動作するコードを持っています。重要な部分は次のとおりです。

私のモデルクラス:

package biz.tugay.sakila.model;
/* User: koray@tugay.biz Date: 25/06/15 Time: 12:48 */

public class Actor {

    private long id;
    private String firstName;
    private String lastName;

    // Getters, setters... 
}

私のdaoクラス:

package biz.tugay.sakila.dao;
/* User: koray@tugay.biz Date: 25/06/15 Time: 12:12 */

import biz.tugay.sakila.model.Actor;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ActorDao {

    protected static final Connection connection = DBConnector.getConnection();

    public List<Actor> getAllActors() throws SQLException {

        List<Actor> allActors = new ArrayList<Actor>();

        Statement stmt = connection.createStatement();
        String sql = "SELECT * FROM Actor";

        ResultSet rs = stmt.executeQuery(sql);
        while (rs.next()) {
            Actor actor = new Actor();
            actor.setFirstName(rs.getString("first_name"));
            // You get the idea... Setters again..
            allActors.add(actor);
        }

        rs.close();
        stmt.close();

        return allActors;
    }
}

およびDBConnector

package biz.tugay.sakila.dao;
/* User: koray@tugay.biz Date: 25/06/15 Time: 12:35 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnector {

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/sakila";
    static final String USER = "root";
    static final String PASS = "";

    private static Connection connection = null;

    public static final Connection getConnection() {
        if (connection != null) {
            return connection;
        } else {
            try {
                Class.forName(JDBC_DRIVER);
                connection = DriverManager.getConnection(DB_URL, USER, PASS);
                return connection;
            } catch (ClassNotFoundException e) {

            } catch (SQLException e) {

            }
            throw new UnsupportedOperationException();
        }
    }

}

私のサーブレットクラス:

package biz.tugay.sakila.servlet;
/* User: koray@tugay.biz Date: 26/06/15 Time: 14:31 */

import biz.tugay.sakila.dao.ActorDao;
import biz.tugay.sakila.model.Actor;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

@WebServlet(urlPatterns = "/actors")
public class ActorServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        ActorDao actorDao = new ActorDao();
        List<Actor> allActors = null;

        try {
            allActors = actorDao.getAllActors();
            req.setAttribute("allActors",allActors);
            req.getRequestDispatcher("/actors.jsp").forward(req, resp);
        } catch (SQLException e) {

        }
    }
}

また、/actors.jspは HTML テーブルをユーザーに表示します。

この演習は、MySQL が提供する sakila サンプル データベースを使用して自分で行いました。

私の質問は、Spring や Struts などのフレームワークを使用せずに、どうすればより良い分離を実現できるでしょうか? たとえば、現在 ActorServlet は具体的に ActorDao に依存していますが、これを修正できますか? また、ActorDao は DBConnector に大きく依存しています。例えば、NoSQLコネクタを作成して使えるようにしたいのですが、現状ではできないのでしょうか?

4

1 に答える 1

2

最初のステップは、いくつかのインターフェースを抽象化することです。たとえばActorDao、インターフェイスを作成し、実装を移動しますActorDaoImpl。カバーの下にあるActorDaoFactoryを渡す を作成しますが、サーブレットはそれを知る必要はありません。ActorDaoActorDaoImpl

2 番目のステップはより複雑です... Tomcatのみを使用する場合、インジェクションなどは不要ですが、Tomcat を構成してこれらの新しいインターフェイスを作成し、それらを JNDI に入れることができます。このプロセスはおそらく複雑すぎてここで回答することはできませんが、JNDI に関する Tomcat のドキュメントは非常に優れています。このプロセスでは基本的に、私が上で提唱したようにファクトリを作成し、Tomcat が構成を通じてそのファクトリを呼び出すようにします。

これを行うと、JNDI からそれらを検索するのは次のように簡単です。

// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// Look up our DAO
ActorDao ad = (ActorDao)envCtx.lookup("dao/actor");

幸運を!

于 2015-06-26T13:00:48.017 に答える