Московский государственный университет имени М.В.Ломоносова
Опубликован: 20.12.2005 | Доступ: свободный | Студентов: 3142 / 371 | Оценка: 4.22 / 3.86 | Длительность: 12:03:00
ISBN: 978-5-9556-0068-0
Лекция 14:

Создание серверных приложений

< Лекция 13 || Лекция 14: 1234567

Вызов методов компонентов JAVABEANS из JSP-файла

Для того чтобы создать новый JSP-файл, использующий рассмотренный выше бин, выполните следующие действия:

  1. Создайте новый JSP-файл, выполнив команду меню File|New, а затем на вкладке Web выбрав пиктограмму JavaServer Page.
  2. Снимите флажки Generate submit form и Generate sample bean и завершите данный диалог.
  3. В окне редактора после тега <body> введите следующий код:

    <jsp:useBean id="jdbc_bean" scope="application" 
    class="myjspjdbc1.HttpJDBCBean" />

    JSP-действие jsp:useBean создает объект типа HttpJDBCBean с идентификатором jdbc_bean

    Атрибут class определяет класс создаваемого объекта, квалифицированный именем пакета.

  4. Введите после описания действия jsp:useBean следующий код, выполняющий подключение всех файлов из пакета myjspjdbc1:
    <%@ page import = "myjspjdbc1.*" session="false" %>
  5. Выполните вызов метода processRequest класса HttpJDBCBean:
    <% jdbc_bean.processRequest(request, response); %>
    В качестве параметров метода указываются предопределенные переменные request и response, используемые для доступа к параметрам запроса и к формированию ответа.
  6. Введите код шаблона, отображающий заголовок JSP-страницы. Например:
    <p><center><font size=2><b>JSP</b></font></center></p>
    <p >Доступ к базе данных через JDBC</p><hr></p>
    Атрибут size тега font определяет размер шрифта, а тег hr используется для отображения горизонтальной линии.
  7. Используйте тег FORM для создания формы, в которую будут помещаться результаты SQL-запроса. Например, введите следующий код:
    <FORM action=Jsp1.jsp method=post>	
    
    </FORM>
    При обработке формы будет использоваться этот же файл Jsp1.jsp.
  8. Сформируйте код, выполняющий определение параметров запроса. Для этого, например, используя тег <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.

  9. Добавьте в форму кнопку Submit, при щелчке пользователя по которой на web-сервер будет передан POST-запрос с параметрами, указанными в форме.

    Например:

    <input type="submit" name="submit" value="Выполнить SQL-оператор">

В результате выполненных действий WEB-сервер получит POST-запрос, который будет обработан указанным в теге FORM JSP-файлом. При этом как результат выполнения SQL-оператора будет создан результирующий набор. Далее JSP-файл, используя методы бина, может получить доступ к сформированной информации.

Для того чтобы отобразить на формируемой HTML-странице данные результирующего набора, выполните следующие действия:

  1. Определите число столбцов и выведите строку заголовка таблицы, в которой будет отображаться результирующий набор.

    Например:

    <% 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);
    %>
    <!-- Метод getColumnLabels бина JDBCBean возвращает заголовок столбца с указанным индексом -->
    <th><%= str0 %></th>
    <% } %>
    <% } %>
  2. Запишите 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-скриптов.

Результат выполнения web-сервером JSP-файла

Рис. 14.3. Результат выполнения web-сервером 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);
	}
    }  }
< Лекция 13 || Лекция 14: 1234567