#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 за ваш комментарий.
- (базовое решение) Вы можете создать соединение внутри doPost() вместо init() .
или
- (расширенное решение) Вы можете использовать пул соединений, например 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, которое при правильном импорте не понадобится. Обязательно по-прежнему закрывайте соединение, которое вы получаете обратно — пул сделает все правильно.