java连接类,从servlet传递字符串

时间:2013-05-21 12:52:16

标签: java jsp servlets connection

我正在使用JSP和Servlets开发一个Web应用程序。(数据库:Oracle10,Container: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类来获取连接:

(适用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的编码类似。

所以在所有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. 传递
  4. 将Cookie值传递给getConn()
  5. Conn.java方法

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

    提前致谢。

1 个答案:

答案 0 :(得分: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上下文。

确保在所有webapps中定义servlet过滤器,以便正确设置userId。