我正在使用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
。
我认为有一种方法可以做到这一点:
selectData()
类的Select.java
方法并从该类getConn()
类Conn.java
方法
醇>
所以我想知道是否有更好的方法将此连接字符串文件名传递给Conn.java
类?
提前致谢。
答案 0 :(得分:1)
HttpSession是存储用户信息的地方(有些顾虑)。
在您的情况下,您似乎拥有许多不同的Web应用程序,每个应用程序都会有不同的会话,您需要更新所有这些应用程序。
我更喜欢另一种方法(这是个人意见,可以讨论),它基于ThreadLocal类。 您可以编写一个servlet过滤器,
这种方法的主要优点是您可能无法访问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。