java servlet如何从init()方法获取值并在方法外使用它们?

时间:2015-02-09 12:10:40

标签: java servlets axis2 init

请帮助我,我是servlet的新手 我尝试初始化init方法的值并在之后使用它们 但我得到了nullpointerexception 这是我的classe Hello它包含2个方法init()和jdbcinfo() 我需要一次获得数据库连接

 package com.Ws;
    //imports..    
    public class Hello extends HttpServlet {

        public static Connection con;


        @Override
        public void init() throws ServletException
        {





                  try {
                    Class.forName("net.sourceforge.jtds.jdbc.Driver");  
                     con =DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:6543/Dbname","user","");


                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("--printStackTrace--"+e);

                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("--printStackTrace2--"+e);
                }
              }


     }
    //I get nullpointerexception here con = null

        public String jdbcInfo(String req) {

            PreparedStatement statementT;

            try {




    connection =con;

                PreparedStatement statement = connection.prepareStatement(req);
                ResultSet result = statement.executeQuery();

                while (result.next()) {

                    ///

                }
            }

            catch (Exception e) {
                e.printStackTrace();
                System.out.println("exception: Serveur base de donnée indosponnible");

            }



            if (res == "1")
                return res;
            else
                return "false";
        }



        }

我的web.xml

 <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.Ws.Hello</servlet-class>
    <load-on-startup>1</load-on-startup>

</servlet>

2 个答案:

答案 0 :(得分:0)

@ geert3是正确的。您不希望创建连接并将其保存在servlet的init()方法的字段中。 Servlet是单个数据库可以处理来自多个线程的请求,因此所有字段都应该引用深度不可变且线程安全的对象。 Connection个对象是不存在的。

相反,您应该使用database connection pool。不要构建自己的连接池代码;那里有many choices out。如果在应用程序服务器中运行代码,则应用程序服务器可能具有内置数据库池支持。

至于代码的特殊问题,解决问题的最佳方法是查看打印的堆栈跟踪。

答案 1 :(得分:0)

  

//我在这里得到nullpointerexception con = null

如果类连接con的实例变量未初始化,则它可以为null。现在怎么可能这样:

在这一行

  Class.forName("net.sourceforge.jtds.jdbc.Driver");  

如果您的类路径中没有jar文件,则此行将抛出ClassNotFoundException,在这种情况下,它会在不执行此行的情况下从try块中出现

  con =DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:6543/Dbname","user","");

在这种情况下,您的con将为空 因此,只需检查jar文件是否实际存在于类路径中