Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

не передается ArrayList jsp-странице
Список форумов
 ->  Основы веб-программирования на Java


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
ymka : 19
Новичок

СообщениеФев 19, 2012 21:57 
Ответить с цитатой
Подскажите почему может не передаваться ArrayList jsp-странице.
Код jsp-страницы:
Код:
<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
    import="books.*, java.util.*, java.io.*"
    session="true"%>
<!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>Book List</title>
<link rel="stylesheet" href="styles.css" type="text/css"/>
</head>
<body>
<p class = "bigFont">Avalible books</p>
<p class = "bold">Click a link to view book information</p>
<p>
   <%   
      BooksBean curentBook;
      TitlesBean titlesBean = new TitlesBean();
      ArrayList<BooksBean> titles = titlesBean.getTitles();
      out.print(titles.size());
      session.setAttribute("titles", titles);
      Iterator iterator = titles.iterator();
      while(iterator.hasNext()){
         out.print("gtt");
         curentBook = (BooksBean)iterator.next();
   %>
<span class="bold">
   <a href   ="displayBook?nameBook=<%= curentBook.getNameBook() %>">
      <%= curentBook.getNameBook() + ", " + curentBook.getAutorName() %>
   </a>
   <br>
</span>   
<% } %>
</p>
</body>
</html>

вот класс в котором создается ArrayList и осуществляется подключение к БД, ArrayList будет использован в jsp-странице.
Код:
package books;
import java.io.PrintWriter;
import java.io.Serializable;
import java.sql.*;
import java.util.*;

public class TitlesBean implements Serializable{
   Connection con;
   PreparedStatement state;
   public TitlesBean(){
      String url = "jdbc:mysql://localhost/books";
      String user = "root";
      String password = "asd123";
      try{
         con = DriverManager.getConnection(url, user, password);
         state = con.prepareStatement("SELECT nameBook, autorName, year, cost FROM books order by nameBook");
      }
      catch(Exception e){
         e.printStackTrace();
      }
   }
   
   public ArrayList<BooksBean> getTitles(){
      ArrayList<BooksBean> titleList = new ArrayList<BooksBean>();
      try{
         ResultSet results = state.executeQuery();
         while(results.next()){
            BooksBean book = new BooksBean();
            book.setAutorName(results.getString("autorName"));
            book.setNameBook(results.getString("nameBook"));
            book.setCost(results.getDouble("cost"));
            book.setYear(results.getInt("year"));
            titleList.add(book);
         }
      }
      catch(Exception e){
         e.printStackTrace();
      }
      finally{
         return titleList;
      }
   }
   protected void finalize(){
      try{
         con.close();
      }
      catch(Exception e){
         e.printStackTrace();
      }
   }
}


пробовал добавлять для теста в класс функцию для тестирования класса, все отрабатывает. но когда передаю ArrayList в jsp-страницу, то передается пустой ArrayList. Есть у кого идеи что может быть?
К началу Посмотреть профиль Отправить личное сообщение
Ivan Skrypka : 63
Новичок

СообщениеФев 20, 2012 1:07 
Ответить с цитатой
Ну во-первых за такой код я бы руки отбивал. Ну да ладно.
1) finallize ?? Серьезно?? Почитайте вообще что это. (По секрету он работает не как деструктов в С++).
2) возвращаете значение из finally?? Если у вас произойдет ексепшен(что скорее всего у вас и происходит), то в таком случае он пойдет нах. Т.е. вам вернется пустой ArrayList, а про exception вы даже не узнаете.
3) Перенесите логигу из конструктора. Это же вообще жесть. Он не для подключения и роботы с бд.

А по поводу почему у вас пустой ArrayList (я уже написал выше): в методе getTitles() у вас скорее всего бросаеться exception, который благополучно хериться из - за finally { return }.

И да, чуть не забыл - матчасть.
Почитайте: Thinking Java, Java Core.
А то у вас ну вообще очень печально с основами.
К началу Посмотреть профиль Отправить личное сообщение
ymka : 19
Новичок

СообщениеФев 20, 2012 11:03 
Ответить с цитатой
спасибо за ответ и замечания. Приму к сведению.
Скажите, а почему getTitles работает нормально в самом классе, т.е. если я создаю функцию для тестирования в классе, то все отрабатывается, ArrayList не пустой. Проблема возникает только когда я хочу использовать getTitles в jsp-странице.


Попробовал создать другой класс в который подключил TitlesBean.class . Все нормально работает, ArrayList не пустой.
Может я что неправильно написал в самой jsp-странице.
К началу Посмотреть профиль Отправить личное сообщение
Ivan Skrypka : 63
Новичок

СообщениеФев 20, 2012 22:39 
Ответить с цитатой
первое что приходит в голову: проверьте положили ли вы в томкате в папку libs драйвер для mysql. Попробуйте запустить в дебаг режими и пройтись дебагером по коду.
И по поводу jsp. Писать скриплеты очень плохая практика. Код дико нечитаем, его тяжело поддерживать(так как логика размыта по всем слоям)
К началу Посмотреть профиль Отправить личное сообщение
ymka : 19
Новичок

СообщениеФев 22, 2012 10:55 
Ответить с цитатой
вы правы, проблема в драйвере подключения, в папке libs драйвер лежал... но что-то это не очень помогло... вот теряюсь в догадках... в самом проекте WEB-INF\lib тоже положил коннектор... но положительных результатов нет.

Что порекомендуете по поводу jsp? Как лучше писать?
К началу Посмотреть профиль Отправить личное сообщение
valid_name : 202
Новичок

СообщениеФев 22, 2012 12:29 
Ответить с цитатой
ymka писал(а):
в самом проекте WEB-INF\lib тоже положил коннектор... но положительных результатов нет.

Что порекомендуете по поводу jsp? Как лучше писать?

Когда положили, добавили в classpath?

В jsp не нужно пихать логику.
К началу Посмотреть профиль Отправить личное сообщение
surlac : 381
Бывалый

СообщениеФев 25, 2012 19:00 
Ответить с цитатой
ymka писал(а):
Как лучше писать?

дай контейнеру контролировать создание инстансов, используй
Код:
<jsp:useBean>
К началу Посмотреть профиль Отправить личное сообщение
ymka : 19
Новичок

СообщениеФев 27, 2012 0:47 
Ответить с цитатой
Необходимо было добавить в блок try перед подключением:
Код:
Class.forName("com.mysql.jdbc.Driver");

Вдруг кому поможет...
Всем спасибо за советы. Тему можно закрывать.
К началу Посмотреть профиль Отправить личное сообщение
surlac : 381
Бывалый

СообщениеФев 29, 2012 19:58 
Ответить с цитатой
ymka писал(а):

Код:
Class.forName("com.mysql.jdbc.Driver");


deprecated since jdbc 4.0
К началу Посмотреть профиль Отправить личное сообщение
Using_System : 36
Новичок

СообщениеАпр 24, 2012 15:22 
Ответить с цитатой
Здравствуйте, у меня похожая проблема. Вот, вроде бы логика отдельно от вида:

servlet
Код:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
         
         Connection connect = dbManager.getConnection();
         
         PreparedStatement statement = connect.prepareStatement("select * from catalog");
         ResultSet result = statement.executeQuery();
         ArrayList<Catalog> catalogs = new ArrayList<Catalog>();
         
         while (result.next()) {
               Catalog catalog = new Catalog();
               catalog.setId(result.getInt("id"));
               catalog.setType(result.getString("type"));
               catalog.setGenre(result.getString("genre"));
               catalog.setTitle(result.getString("title"));
               catalogs.add(catalog);
            }
         
         request.setAttribute("catalogs", catalogs);
         result.close();
         statement.close();
         
         } catch (SQLException ex) {
            Logger.getLogger(ShowCatalog.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
            request.getRequestDispatcher("/disk_shop/catalog.jsp").forward(request, response);
         }
}


dbManager.java
Код:
public final class dbManager {

   static Connection con;
   static String url;
   
   public static Connection getConnection()
   {
      try {
         String url = "jdbc:mysql:" + "//localhost:3306/test";
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         try
         {
            con = DriverManager.getConnection(url, "root", "root");
         }
         catch (SQLException ex)
         {
            ex.printStackTrace();
         }
      }
      catch(ClassNotFoundException e)
      {
         System.out.println(e);
      }
      return con;
   }
}


CatalogBean.java
Код:

public class Catalog {
private int id;
private String type;
private String genre;
private String title;

public int getId()
{ return id; }
public void setId(int newId)
{ id = newId; }


public String getType()
{ return type; }
public void setType(String newType)
{ type = newType; }

public String getGenre()
{ return genre; }
public void setGenre(String newGenre)
{ type = newGenre; }

public String getTitle()
{ return title; }
public void setTitle(String newTitle)
{ type = newTitle; }
}


catalog.jsp
Код:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!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>Каталог</title>
</head>
<body>
<table>
   <thead>
   <tr>
      <td>Id</td>
      <td>Type</td>
      <td>Genre</td>
      <td>Title</td>
   </tr>
   </thead>
   <tbody>
      <c:forEach items="${requestScope['catalogs']}" var="catalog"></c:forEach>
      <tr>
         <td>${catalog.id}</td>
         <td>${catalog.type}</td>
         <td>${catalog.genre}</td>
         <td>${catalog.title}</td>
      </tr>
   </tbody>
</table>
</body>
</html>


Если просто в сервлете что то сделать "левое" то все работает, с базой проблема, не пойму какая..
descriptionThe requested resource () is not available.

Где проблема? И как в таких случаях можно выявить проблему? А то хоть башкой об стенку..
К началу Посмотреть профиль Отправить личное сообщение
surlac : 381
Бывалый

СообщениеАпр 25, 2012 22:55 
Ответить с цитатой
Using_System писал(а):
Если просто в сервлете что то сделать "левое" то все работает, с базой проблема, не пойму какая..
descriptionThe requested resource () is not available.

мало информации. база описание ошибки выдает?
К началу Посмотреть профиль Отправить личное сообщение
Using_System : 36
Новичок

СообщениеАпр 25, 2012 23:14 
Ответить с цитатой
Код:
Exception when handling error trying to reset the response. org.apache.catalina.connector.ClientAbortException: java.io.IOException: Программа на вашем хост-компьютере разорвала установленное подключение at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:425) at com.sun.grizzly.util.buf.ByteChunk.append(ByteChunk.java:351) at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:450) at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:437) at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:160) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.flushAttributes(HtmlResponseWriter.java:1088) at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.closeStartIfNecessary(HtmlResponseWriter.java:1038) at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startElement(HtmlResponseWriter.java:599) at com.sun.webui.jsf.renderkit.html.TreeNodeRenderer.encodeEnd(TreeNodeRenderer.java:131) at


Мне кажется вот здесь что то неверно:
Код:

try {
         
         Connection connect = dbManager.getConnection();
         ...
            }
         
         ...
         result.close();
         statement.close();
         
         } catch (SQLException ex) {
            Logger.getLogger(ShowCatalog.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
            request.getRequestDispatcher("/disk_shop/catalog.jsp").forward(request, response);
         }


Сегодня читал книгу где раздел о БД, создается пул соединений:


Код:

try {
 Connection conn = source.getConnection();
 try {
 Statement stat = conn.createStatement();
 String command = "Select ....";
 stat.executeQuery(command);
     }
finally { conn.close(); }
}
catch(SQL Exception) { //log error }
}


А мы тут закрываем соединение в блоке try.. может в этом дело? Как определить, происходит соединение с БД или нет? Запрос проверяла, вроде бы работает верно, запись есть. [/code]
К началу Посмотреть профиль Отправить личное сообщение
valid_name : 202
Новичок

СообщениеАпр 26, 2012 10:34 
Ответить с цитатой
Using_System писал(а):
Как определить, происходит соединение с БД или нет? Запрос проверяла, вроде бы работает верно, запись есть. [/code]

Подключиться к бд, сделать запрос, сохранить результат, вывести его куда-нибудь (в логи, к примеру), et voilà. Если запрос работает (как вы, в общем-то, и написали), значит, и подключение работает. А закрывать лучше в finally, да. Например, так:
Код:
                finally {
                    if (resultst != null)
                    resultst.close();
                    if (statem != null)
                    statem.close();
                    if (conn != null)
                    conn.close();
                }
К началу Посмотреть профиль Отправить личное сообщение
surlac : 381
Бывалый

СообщениеАпр 29, 2012 0:05 
Ответить с цитатой
Using_System писал(а):
Код:
Exception when handling error trying to reset the response. org.apache.catalina.connector.ClientAbortException: java.io.IOException: Программа на вашем хост-компьютере разорвала установленное подключение 


такое бывает напр когда сервер соединяется с клиентским браузером, начинает высылать данные, а клиент неожиданно закрывает сокет. У тебя похожая ситуация, только кто-то запрещает соединение с субд, возможно брандмауер - попробуй выключить.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Основы веб-программирования на Java


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru