Сервлеты
В листингах П.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.