【问题标题】:java servlet how to get value from init() method and use them outside the method?java servlet 如何从 init() 方法中获取值并在方法外使用它们?
【发布时间】:2015-02-09 12:10:39
【问题描述】:

请帮助我是 servlet 的新手 我正在尝试初始化 init 方法的值并在之后使用它们 但我得到空指针异常 这是我的类你好它包含 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>

【问题讨论】:

  • 您的代码无法编译。你不能在函数之外拥有System.out.println("returned value"+name);
  • 你没有覆盖 contextDestroyed(ServletContextEvent arg0) 方法也是一个错误!!
  • 你在哪里得到异常??
  • 您是否在 init 和 jdbcInfo 中使用断点进行调试以检查 init 是否真的被调用过?
  • 没有回答你问的问题,但我想我还是提到了:你不应该像那样签出和使用 Connections。连接不应该与您的 servlet 一样长。相反,请在需要之前检查连接,并在完成后关闭它。

标签: java servlets axis2 init


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    //这里得到nullpointerexception con = null

    如果未初始化,您的 Class Connection con 的 Instance 变量可以为 null。现在这怎么可能:

    在这一行

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多