【问题标题】:java connection class, passing string from servletjava连接类,从servlet传递字符串
【发布时间】:2013-05-21 12:52:15
【问题描述】:

我正在使用 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 类来获取连接:

(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() 类的 selectData() 方法并从该类传递
  3. 将cookie值传递给Conn.java类的getConn()方法

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

提前致谢。

【问题讨论】:

  • HttpSession 处理与会话相关的信息。通常,您会将您的用户信息存储在那里,并让服务器处理其存储方式的详细信息。
  • @SJuan76 是的 HttpSession 是正确的方法,但我正在使用 Cookies 在同一服务器上部署的所有 Web 应用程序共享 USERID

标签: java jsp servlets connection


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2021-11-18
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多