Создание серверных приложений
Вызов методов компонентов JAVABEANS из JSP-файла
Для того чтобы создать новый JSP-файл, использующий рассмотренный выше бин, выполните следующие действия:
- Создайте новый JSP-файл, выполнив команду меню File|New, а затем на вкладке Web выбрав пиктограмму JavaServer Page.
- Снимите флажки Generate submit form и Generate sample bean и завершите данный диалог.
-
В окне редактора после тега <body> введите следующий код:
<jsp:useBean id="jdbc_bean" scope="application" class="myjspjdbc1.HttpJDBCBean" />
JSP-действие jsp:useBean создает объект типа HttpJDBCBean с идентификатором jdbc_bean
Атрибут class определяет класс создаваемого объекта, квалифицированный именем пакета.
- Введите после описания действия jsp:useBean следующий код, выполняющий подключение всех файлов из пакета myjspjdbc1:
<%@ page import = "myjspjdbc1.*" session="false" %>
- Выполните вызов метода processRequest класса HttpJDBCBean:В качестве параметров метода указываются предопределенные переменные request и response, используемые для доступа к параметрам запроса и к формированию ответа.
<% jdbc_bean.processRequest(request, response); %>
- Введите код шаблона, отображающий заголовок JSP-страницы. Например:Атрибут size тега font определяет размер шрифта, а тег hr используется для отображения горизонтальной линии.
<p><center><font size=2><b>JSP</b></font></center></p> <p >Доступ к базе данных через JDBC</p><hr></p>
- Используйте тег FORM для создания формы, в которую будут помещаться результаты SQL-запроса. Например, введите следующий код:При обработке формы будет использоваться этот же файл Jsp1.jsp.
<FORM action=Jsp1.jsp method=post> </FORM>
- Сформируйте код, выполняющий определение параметров запроса. Для этого, например, используя тег <TABLE>, разместите в форме таблицу, первый столбец которой будет содержать имя запрашиваемого параметра, а второй столбец - текстовое поле, предназначаемое для ввода значения. Каждое текстовое поле создаваемой таблицы будет соответствовать свойству бина JDBCBean.
Например:
<table> <tr> <td> JDBC-драйвер:</td> <td><input type="text" name="classname" value=" <%= jdbc_bean.getClassname() %>" size="40"></td> <td></td> </tr><!- JSP-выражение <%= jdbc_bean.getClassname() %>" формирует начальное значение текстового поля, вызывая метод getClassname для определения значения свойства classname объекта с идентификатором jdbc_bean. ->
<tr> <td></td> <td><i>sun.jdbc.odbc.JdbcOdbcDriver</i></td> </tr>
<! - Класс sun.jdbc.odbc.JdbcOdbcDriver реализует JDBC-ODBC драйвер для доступа к источнику данных. Загрузка драйвера выполняется на ПК, на котором запущен Web-сервер.-->
<tr> <td>JDBC URL-адрес источника данных:</td> <td><input type="text" name="url" value=" <%= jdbc_bean.getUrl() %>" size="40"></td> </tr> <tr> <td></td>> <td><i>jdbc:odbc:MyDB</i></td> </tr> <tr> <td>Имя пользователя:</td> <td><input type="text" name="username" value=" <%= jdbc_bean.getUsername() %>" size="25"></td> </tr> <tr> <td>Пароль:</td> <td><input type="text" name="password" value=" <%= jdbc_bean.getPassword() %>" size="25"></td> </tr> <tr> <td>Выполняемый SQL-оператор:</td> <td><textarea cols=35 rows=3 name="query" wrap="soft"> <%= jdbc_bean.getQuery() %></textarea></td><!-- Тег textarea используется для создания текстовой области. Атрибуты cols и rows определяют размер создаваемой области. -->
</tr></table>
Тег input с атрибутом type="text" определяет текстовое поле. Атрибут name тега input определяет имя параметра, передаваемого JSP-файлу при обработки формы. Формируемый POST-запрос будет содержать список параметров, указываемых атрибутами name, со значениями, указываемыми атрибутами value.
- Добавьте в форму кнопку Submit, при щелчке пользователя по которой на web-сервер будет передан POST-запрос с параметрами, указанными в форме.
Например:
<input type="submit" name="submit" value="Выполнить SQL-оператор">
В результате выполненных действий WEB-сервер получит POST-запрос, который будет обработан указанным в теге FORM JSP-файлом. При этом как результат выполнения SQL-оператора будет создан результирующий набор. Далее JSP-файл, используя методы бина, может получить доступ к сформированной информации.
Для того чтобы отобразить на формируемой HTML-странице данные результирующего набора, выполните следующие действия:
-
Определите число столбцов и выведите строку заголовка таблицы, в которой будет отображаться результирующий набор.
Например:
<!-- Метод getColumnLabels бина JDBCBean возвращает заголовок столбца с указанным индексом --><% if (jdbc_bean.getColumnCount() != 0){ %><% -- JSP-скриплет --%> <table cellspacing="0" cellpadding="5" border="0" BGCOLOR=#EDECE5> <% for (int i=0; i<jdbc_bean.getColumnCount(); i++){ String str0 = jdbc_bean.getColumnLabels(i); %><th><%= str0 %></th> <% } %> <% } %>
-
Запишите JSP-скриплет, формирующий строки результирующего набора в формате HTML.
Например:
<% for (int row=1; row<jdbc_bean.getRowCount(); row++) {%> <tr></tr> <% for (int col=0; col<jdbc_bean.getColumnCount(); col++) { String str1 = jdbc_bean.getCell(col, row); %> <td ><%= str1 %></td> <% } %> <% } %> </table>
Приведенный выше JSP-скриплет использует метод getRowCount бина JDBCBean для выполнения цикла по количеству строк, а метод getColumnCount - для выполнения цикла по количеству столбцов. Метод getCell бина JDBCBean возвращает массив строк, содержащий значения всех полей одной записи результирующего набора.
Перед выполнением JSP-файла следует откомпилировать классы используемых бинов.
В JBuilder для компиляции данных классов в проект следует добавить библиотеку Servlet. Для этого предварительно скопируйте файл библиотеки Servlet.library в каталог проекта. Для подключения библиотеки выполните команду меню Project|Project Properties и на вкладке Paths выберите страницу Required Libraries. Далее для добавления новой библиотеки щелкните мышью на кнопке Add и в секции Project выберите библиотеку Servlet.
Добавленная библиотека будет отображена в списке библиотек на вкладке Required Libraries.
Для выполнения JSP-файла на Web-сервере Tomcat выделите в окне проекта имя JSP-файла и выполните для него команду контекстного меню Web Run.
После введения значений в отображаемый на вкладке Web View окна содержания результат выполнения JSP-файла, web-сервер формирует HTML-страницу (рис. 14.3), содержащую результат выполнения JSP-скриптов.
Далее приводится код используемых классов ( JDBCBean и HttpJDBCBean ):
// Код файла JDBCBean.java:
package myjspjdbc1;
import java.io.*;
import java.util.*;
import java.sql.*;
public class JDBCBean {
String classname ; // JDBC-драйвер
String url ;
String username ;
String password ;
String query ; // SQL-оператор.
int rows, cols; // Число строк и столбцов результирующего набора
Vector result;
public void setClassname(String classname) {
this.classname = classname; }
public String getClassname() { return classname; }
public void setUrl(String url) {
this.url = url;
}
public String getUrl(){ return url; }
public void setUsername(String username) {
this.username = username; }
public String getUsername() { return username; }
public void setPassword(String password) {
this.password = password; }
public String getPassword() { return password; }
public void setQuery(String query) { this.query = query; }
public String getQuery() { return query; }
protected void go() // Подключение к БД и выполнение запроса
throws ClassNotFoundException, SQLException
{
// Загрузка JDBC-драйвера
Class.forName(classname);
// Создание соединения с базой данных
Connection con = DriverManager.getConnection(url,
username,
password);
// Создание и выполнение запроса
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
cols = rsmd.getColumnCount();
rows = 0;
result = new Vector();
String s[] = new String[cols];
for (int i=1; i<=cols; i++) {
s[i-1] = rsmd.getColumnLabel(i) ;
}
result.addElement(s);
rows ++;
// Извлечение данных
while (rs.next()) {
s = new String[cols];
for (int i=1; i<=cols; i++) {
s[i-1] = helper(rs, rsmd.getColumnType(i), i);
}
result.addElement(s);
rows ++;
}
}
public static void main (String[] args)
{
JDBCBean jdbcBean = new JDBCBean();
String classname = "com.imaginary.sql.msql.MsqlDriver";
//String url = "jdbc:msql://gaby.eng:4333/demo";
String url = "jdbc:msql://ridgetop.eng:1114/test";
String username = "lfu";
String password = "password";
//String query = "select * from details";
String query = "select * from table1";
jdbcBean.setClassname(classname);
jdbcBean.setUrl(url);
jdbcBean.setUsername(username);
jdbcBean.setPassword(password);
jdbcBean.setQuery(query);
try {
jdbcBean.go();
System.out.println("Seems okay");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public int getColumnCount() { return cols; }
public int getRowCount() { return rows; }
public String getColumnLabels(int col) {
String[] s = (String[])result.firstElement();
return s[col];
}
public String getCell(int col, int row) {
String[] s = (String[])result.elementAt(row);
return s[col];
}
protected String helper (ResultSet rs, int dataType, int col)
throws SQLException
{ String retVal = null; Integer intObj;
// Запрос данных в зависимости от их типа
switch(dataType) {
case Types.DATE:
java.sql.Date date = rs.getDate(col);
retVal = date.toString();
break;
case Types.TIME:
java.sql.Time time = rs.getTime(col);
retVal = time.toString();
break;
case Types.TIMESTAMP:
java.sql.Timestamp timestamp = rs.getTimestamp(col);
retVal = timestamp.toString();
break;
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
retVal = rs.getString(col);
break;
case Types.NUMERIC:
case Types.DECIMAL:
java.math.BigDecimal numeric = rs.getBigDecimal(col, 10);
retVal = numeric.toString();
break;
case Types.BIT:
boolean bit = rs.getBoolean(col);
Boolean boolObj = new Boolean(bit);
retVal = boolObj.toString();
break;
case Types.TINYINT:
byte tinyint = rs.getByte(col);
intObj = new Integer(tinyint);
retVal = intObj.toString();
break;
case Types.SMALLINT:
short smallint = rs.getShort(col);
intObj = new Integer(smallint);
retVal = intObj.toString();
break;
case Types.INTEGER:
int integer = rs.getInt(col);
intObj = new Integer(integer);
retVal = intObj.toString();
break;
case Types.BIGINT:
long bigint = rs.getLong(col);
Long longObj = new Long(bigint);
retVal = longObj.toString();
break;
case Types.REAL:
float real = rs.getFloat(col);
Float floatObj = new Float(real);
retVal = floatObj.toString();
break;
case Types.FLOAT:
case Types.DOUBLE:
double longreal = rs.getDouble(col);
Double doubleObj = new Double(longreal);
retVal = doubleObj.toString();
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
byte[] binary = rs.getBytes(col);
retVal = new String(binary);
break;
}
return retVal;
}
}
// Код файла HttpJDBCBean.java:
package myjspjdbc1;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import java.sql.*;
public class HttpJDBCBean extends JDBCBean {
public void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws IOException
{
// Получение значений параметров, если они заданы
String _p ;
if ((_p = request.getParameter("classname")) != null) {
classname = _p;
}
if ((_p = request.getParameter("url")) != null) {
url = _p;
}
if ((_p = request.getParameter("username")) != null) {
username = _p;
}
if ((_p = request.getParameter("password")) != null) {
password = _p;
}
if ((_p = request.getParameter("query")) != null) {
query = _p;
}
// Если параметры не заданы, то отображать только форму
boolean form_only = false;
if (classname == "" || classname == null) form_only = true;
if (url == "" || url == null) form_only = true;
if (username == null) form_only = true;
if (password == null) form_only = true;
if (query == null) form_only = true;
if (form_only) {
return;
}
try {
this.go(); // Вызов метода, выполняющего запрос
} catch (ClassNotFoundException ex) {
PrintWriter writer = response.getWriter(); // Поток вывода
writer.println("class " + classname + " not found.");
} catch (SQLException ex) {
PrintWriter writer = response.getWriter();
writer.println("Message: " + ex.getMessage());
writer.println("Error code: " + ex.getErrorCode());
ex.printStackTrace(writer);
} catch (Exception ex) {
PrintWriter writer = response.getWriter();
ex.printStackTrace(writer);
}
} }
