1

我正在使用 JSP 和 Servlets 开发一个 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;
    }
}

然后我有 4 个其他类用于 SELECT、INSERT、UPDATE、DELETE 事务,它们使用上面的Conn.java类来获取连接:

(选择.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的编码方式相似。

因此,在所有 servlet 中,我只使用这 4 个(SELECT、INSERT、UPDATE、DELETE)类,将查询传递给它们并获得结果。

示例 Servlet

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. 获取所有 servlet 中的 cookie 值
  2. 将 cookie 值传递给类的selectData()方法Select.java并从该类
  3. 将 cookie 值传递给类的getConn()方法Conn.java

所以我想知道是否有更好的方法将此连接字符串文件名传递给Conn.java类?

提前致谢。

4

1 回答 1

1

HttpSession 是应该存储用户信息的地方(有一些顾虑)。

在您的情况下,您似乎有许多不同的 Web 应用程序,每个应用程序都有不同的会话,您需要更新所有这些应用程序。

我更喜欢基于 ThreadLocal 类的另一种方法(这是个人意见,可以讨论)。您可以编写一个 servlet 过滤器,这将

  • 读取 cookie 值
  • 将其存储在 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()在代码中的任何位置调用来访问 userId,即使您无权访问 http 上下文。

确保在所有 web 应用程序中定义 servlet 过滤器,以便正确设置 userId。

于 2013-05-22T15:19:30.973 回答