|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 писал(а): |
| Как лучше писать? |
дай контейнеру контролировать создание инстансов, используй
|
|
|
|
 |
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: Программа на вашем хост-компьютере разорвала установленное подключение |
|
такое бывает напр когда сервер соединяется с клиентским браузером, начинает высылать данные, а клиент неожиданно закрывает сокет. У тебя похожая ситуация, только кто-то запрещает соединение с субд, возможно брандмауер - попробуй выключить. |
|
|
|
 |
|
|
|