gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:12 24 4
gpt4 key购买 nike

我正在使用 JSP 和 Servlet 开发一个 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 类来获取连接:

(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
}
}

它工作得很好,但现在我们的要求是在用户登录后更改数据库字符串。因此,我想将用户特定属性文件名传递给Conn.java类。因此,我将属性文件名存储在 cookie 中。

我想到了一种方法:

  1. 获取所有servlet中的cookie值
  2. 将 cookie 值传递给 Select.java 类的 selectData() 方法,并从该类传递
  3. 将 cookie 值传递给 Conn.java 类的 getConn() 方法

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

提前致谢。

最佳答案

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

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

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

  • 读取 cookie 值
  • 将其存储在 ThreadLocal 中
  • 在filter.doFilter方法之后,您必须清理它(这非常重要,因此您没有机会混合 session ),只需将clean方法放在finally block 中,以便无论发生什么情况它都会被执行。

这种方法的主要优点是,您可能无法访问 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();
}
}

然后,即使您无权访问 http 上下文,您也只需在代码中的任何位置调用 ThreadLocalContainer.getUserId() 即可访问 userId。

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

关于java连接类,从servlet传递字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16670499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com