Иллюстрированный самоучитель по Java

Сервлеты

В листингах П.2 и П.3 те же действия, что выполняет программа листинга П. 1, реализованы с помощью сервлета. Апплет теперь не нужен, в окно браузера выводится HTML-форма, описанная в листинге П.2.

Листинг П.2. HTML-форма запроса к базе данных.

<html><head><title> JDBC Servlet</title></head>
<body>
<form method = "POST" action = "/servlet/JdbcServlet">
<pre>
URL базы: <input type = "text" size = "40" name = "url"
value = "jdbc:oracle:thin:@localhost:1521:ORCL">
Имя: <input type = "text" size = "40" name = "login"
value = "scott">
Пароль: <input type = "password" size = "40" name = "password"
value = "tiger">
Запрос:
<textarea rows = "5" cols "70" name = "query">
SELECT * FROM dept
</textarea>
<input type = "submit" value = "Послать">
</pre>
</form>
</body>
</html>

Сервлет получает из этой формы адрес базы url, имя login и пароль password пользователя, а также запрос query. Он обращается к базе данных Oracle через драйвер JDBC Oracle Thin, формирует полученный ответ в виде HTML-страницы и отправляет браузеру.

Листинг П.3. Сервлет, выполняющий запрос к базе Oracle i.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.sql.*;
public class JdbcServlet extends HttpServlet{ static)
try{
DriverManager.registerDriver(
new oracle.j dbc.driver.OracleDriver());
)catch(SQLException e){
System.err.println(e);
}
)
private Vector results = new Vector();
private int n;
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException{
ServletExceptionf String url = req.getParameter("url"),
login = req.getParameter("login"),
password = req.getParameter("password"),
query = req.getParameter("query");
// Задаем MIME-тип и кодировку для выходного потока pw
resp.setContentType("text/html;charset=windows-1251");
PrintWriter pw = resp.getWriter();
try{
Connection con =
DriverManager.getConnection(url, login, password);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
n = rsmd.getColumnCount(); while (rs.next()){
String s = " ";
for (int i = 1; i <= n; i++)
s += " " + rs.getObject(i);
results.addElement(s); }
rs.close();
st.close();
con.close();
}catch(SQLException e){
pw.println("From doPostf): " + e);
}
pw.println("<html><head><title>Answers</titlex/head>");
рw.рrintln("<body><h2>Результаты 3anpoca</h2>");
n = results.size();
for (int i = 0; i < n; i++)
pw.println((String)results.elementAt(i) + "<br>");
pw.println("</bodyx/html>");
pw.flush();
pw.close ();
}
}

Применение сервлета позволило "облегчить" клиент – браузер не загружает апплет, а только отправляет запрос и получает ответ. Вся обработка запроса ведется в сервлете на сервере.

В системе J2SDKEE (Java 2 SDK Enterprise Edition) HTML-файл и сервлет образуют один Web-компонент. Они упаковываются в один файл с расширением .war (web archive) и помещаются в так называемый Web-контейнер, управляемый Web-сервером, расширенным средствами J2SDKEE.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.