программа jdbc, написанная на сервлете с использованием oracle в eclipse

#eclipse #servlets #jdbc

#eclipse #сервлеты #jdbc

Вопрос:

Я искал ответы, но я получаю соответствующие ответы. Хотя мое исключение не является новым, но я не могу найти ответ. Я получаю исключение, сервер столкнулся с внутренней ошибкой, которая не позволила ему выполнить это

  request.Exception:java.lang.NullPointerException
    com.src.pkg.DepositServlet.doPost(DepositServlet.java:82)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
  

обратите внимание, что полная трассировка стека основной причины доступна в журналах Apache Tomcat / 7.0.37.

Я также отправлю свой код. В методе doPost() DepositServlet указывается, что он также показывает ошибку в приведенной ниже строке- инструкции st = ((java.sql.Connection) con).createStatement(); Пожалуйста, помогите мне в решении этой проблемы.

 //DepositServlet.java
package com.src.pkg;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.corba.se.pept.transport.Connection;

/**
 * Servlet implementation class DepositServlet
 */
public class DepositServlet extends HttpServlet {
    Connection con;

    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */


    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=(Connection) DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","rekha");
        }
        catch(ClassNotFoundException e)
        {
            System.out.println(e);
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
        try
        {
            con.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */


    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    int ano = Integer.parseInt(request.getParameter("accno"));
    float amt = Float.parseFloat(request.getParameter("amount"));
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    try
    {
    Statement st = ((java.sql.Connection) con).createStatement();
        int n = st.executeUpdate("update account set balance = balance   " amt " where accno = " ano);
        if(n==1)
        {
            out.println("<body bgcolor=green>");
            out.println("<h1> Successfully deposited </h1>");
        }
        if(n==0)
        {
            out.println("<body bgcolor=wheat>");
            out.println("<h1> Wrong a/c no </h1>");
        }
        st.close();
    }
        catch(SQLException e)
        {
            out.println("<body bgcolor=red>");
                out.println("<h1> Server problem </h1>");
            }
        out.println("</body>");
        out.println("</html>");
        out.close();
        }
    }


//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <welcome-file-list>
    <welcome-file>deposit.html</welcome-file>

  </welcome-file-list>
  <servlet>

    <servlet-name>DepositServlet</servlet-name>
    <servlet-class>com.src.pkg.DepositServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DepositServlet</servlet-name>
    <url-pattern>/DepositServlet</url-pattern>
  </servlet-mapping>
</web-app>


//deposit.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body bgcolor="cyan">
<center>
<h1> Deposit screen</h1>
<form action = "./DepositServlet" method = "post">
A/C No <input type="text" name="accno"> <br> <br>
Amount <input type="text" name="amount"> <br> <br>
<input type="submit" value="deposit">
</form>
</center>

</body>
</html>
  

Комментарии:

1. com.sun.corba.se.pept.transport. Соединение — это не то соединение, которое вы ищете — вам нужен java.sql.Connection

Ответ №1:

Проблемная часть:

Во-первых, вам нужно знать, что это опасная и нестабильная вещь.

Метод «init» вызывается один раз, когда сервлет загружен. Метод «doPost» потенциально может вызываться сотни или тысячи раз в течение недель, месяцев или лет.

Почти все базы данных будут «отключены» и отключат открытые соединения, если они остаются открытыми слишком долго. Если вы открываете соединение только в «init», оно может даже «тайм-аут», прежде чем вы сможете его использовать. Это также означает, что у вас нет возможности повторно открыть закрытое соединение без перезагрузки сервлета, т. Е. перезапуска вашего веб-сервера.

В целом, открывать соединение с базой данных «init» — это плохо.

===================

Теперь часть решения.

На самом деле вы должны делать это в прослушивателе, точнее в ServletContextListener.

Спасибо @stdunbar за ваш комментарий.

  1. (базовое решение) Вы можете создать соединение внутри doPost() вместо init() .

или

  1. (расширенное решение) Вы можете использовать пул соединений, например Tomcat JDBC или DBCP2.

Комментарии:

1. И чем отличается ваше решение? Вы усугубили ситуацию, оставив соединение открытым на протяжении всего срока службы сервера.

2. Спасибо за ваши предложения. Я попробую использовать данное вами решение.

Ответ №2:

Вам нужно взглянуть на документы пула подключений к базе данных от Tomcat. В конечном итоге вам нужны три вещи. Первым будет META-INF/context.xml файл в корневом каталоге вашего веб-приложения. Это будет выглядеть примерно так:

 <?xml version='1.0' encoding='utf-8'?>

<Context path="">
  <Resource name="jdbc/someName"
            auth="Container"
            type="javax.sql.DataSource"
            username="system"
            password="rekha"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@localhost:1521:xe"/>
</Context>
  

Затем в каталоге WEB-INF / lib вашего веб-приложения вам нужно будет поместить файл Oracle thin driver jar / zip. Наконец, когда вам понадобится подключение к базе данных, ваш код будет выглядеть примерно так:

 import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

private static final String dbJNDIName = "jdbc/someName"; // matches context.xml name

public static Connection getConnection() {
    try {
        Context ctx = new InitialContext();

        DataSource ds = (DataSource)ctx.lookup( "java:comp/env/"   dbJNDIName );
        if( ds != null ) {
            return ds.getConnection();
         }
         else {
             // log error somehow
            }
        }
        catch( Exception e ) {
            // log error
        }
    return( null );
}
  

Наконец, когда вам потребуется подключение к базе данных в вашем коде, вы сделаете это, вызвав этот метод. В вашем коде есть приведение java.sql.Connection, которое при правильном импорте не понадобится. Обязательно по-прежнему закрывайте соединение, которое вы получаете обратно — пул сделает все правильно.