1

JSPとサーブレットを使ってWebアプリケーションを開発しています(データベース:Oracle10、コンテナ:Glassfish)。

接続を作成するためのクラスを開発しました。

(Conn.java) :

public class Conn
{
    private Connection con = null;
    public Connection getCon()
    {
        String home = System.getProperty("user.home");
        home  = home+"\\dbFile.properties";
        //Read properties of Connection String from that file and Create Connection
        return con;
    }
}

Conn.java次に、接続を取得するために上記のクラスを使用している SELECT、INSERT、UPDATE、DELETE トランザクション用の 4 つの他のクラスがあります。

(Select.java)

public class Select
{
    private Conn connection = new Conn();
    private Connection con = null;
    private PreparedStatement pstmt = null;
    private ResultSet rs=null;

    public String[][] selectData(String query)
    {
        String[][] data=null;
        if(con==null)
        {
            con = connection.getCon();
        }
        //execute query put data in two dimensional array and then return it
        return data;
    }
}

INSERT、UPDATE、および DELETE は、上記と同様の方法Select.javaでコーディングされます。

したがって、すべてのサーブレットで、これらの 4 つの (SELECT、INSERT、UPDATE、DELETE) クラスを使用し、それらにクエリを渡して結果を取得しています。

サンプルサーブレット

public class SampleServ extends HttpServlet 
{
    Select select = new Select();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        String data[][];
        data = select.selectData(QUERY_GOES_HERE);
        //AND OTHER CODE
    }
}

それは完全に機能しますがDatabase String、ユーザーがログインした後に変更する必要があります。User specificそのため、プロパティ ファイル名をConn.javaクラスに渡したいと思います。そのため、プロパティ ファイル名を に保存していますcookie

私はこれを行う1つの方法を考えています:

  1. すべてのサーブレットで Cookie 値を取得する
  2. selectData()cookie 値をクラスのメソッドに渡し、Select.javaそのクラスから
  3. クラスのgetConn()メソッドにクッキーの値を渡すConn.java

Conn.javaこの接続文字列ファイル名をクラスに渡すより良い方法があるかどうか知りたいですか?

前もって感謝します。

4

1 に答える 1

1

HttpSession は、ユーザー情報を保存する場所です (いくつかの懸念があります)。

あなたの場合、多くの異なる Web アプリケーションがあるように見えますが、それぞれに異なるセッションがあり、それらすべてを更新する必要があります。

私は、ThreadLocal クラスに基づく別のアプローチを好みます (これは個人的な意見であり、議論することができます)。サーブレットフィルターを書くことができます。

  • クッキーの値を読む
  • ThreadLocal に格納する
  • filter.doFilter メソッドの後、それをきれいにする必要があります (これは非常に重要なので、セッションを混在させる可能性はありません)。clean メソッドを finally ブロックに入れて、何が起こっても実行されるようにします。

このアプローチの主な利点は、HttpSession または HttpServletRequest にアクセスできなくても、ThreadLocal で値を取得できることです。

使用できる ThreadLocal コンテナの例は次のとおりです。

public class ThreadLocalContainer {
   private static ThreadLocal<String> userId=new ThreadLocal<String>();
   public static String getUserId(){
       return userId.get();
   }
   public static void setUserId(String uid){
        userId.set(uid);
   }
   public static void resetUserId(){
        userId.remove();
   }
}

ThreadLocalContainer.getUserId()そうすれば、http コンテキストにアクセスできない場合でも、コード内のどこでも呼び出すだけで userId にアクセスできます。

userId が適切に設定されるように、すべての Web アプリケーションでサーブレット フィルタを定義してください。

于 2013-05-22T15:19:30.973 に答える