Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RSS клиент 
V
    Опции темы
Shklyar
Дата 22.8.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Добрый день.
Вот решил делать RSS клиент как свою первую программу на Java.
Подскажите:
1. Что обязательно к прочтению?
2. Какие необходимы классы? Мысли такие: непосредственно RSSReader, он будет создавать Article-ы и где-то должен присутствовать SubscriptionToFeeds. А где использовать интерфейсы? Может где-то паттерн? Какой? И что из API мне нужно? Спрашиваю т.к. опыта нет..
Спасибо.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
LSD
Дата 22.8.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ну для начала почитай описание формата RSS и про сам XML. Потом парсинг XML в Java (есть пара статей в FAQ).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 25.8.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Почитал, научился парсить XML (по примеру из FAQ, более детально буду разбираться непосредственно при решении своей задачи). Подскажите, что такое RSS парсер.

2. Помогите представить общую картину желаемого приложения (все-же хочу начать с uml диаграммы классов).
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 27.8.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Несмотря на то, что какого-то представления о том, как будет выглядеть программа целиком у меня нет, я решил попробовать написать ту часть, где происходит парсинг XML или RSS? Собственно вот код. Покричите, подскажите как правильно писать.
Код
package rssclient;

/**
 *
 * @author Oleg
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            for (Article article : SAXHandler.parse("rss.xml"))
                System.out.println("Title: " + article.getTitle() + "\n" +
                "Date: " + article.getDate() + "\n" +
                "Link: " + article.getLink() + "\n" +
                "Description: " + article.getSummary() + "\n");
        } catch(Exception e) {
            System.out.println(e);
        }
    }

}


Код
package rssclient;

/**
 *
 * @author Oleg
 */
public class Article {
    private String title;
    private String date;
    private String link;
    private String summary;
    
    public Article() {
    }
    
    /**
     * 
     * @param title
     * @param link
     * @param summary
     */
    public Article(String title, String date, String link, String summary) {
        setTitle(title);
        setDate(date);
        setLink(link);
        setSummary(summary);
    }
    
    public void setTitle(String t) {
        title = t;
    }
    public String getTitle() {
        return title;
    }
    
    public void setDate(String d) {
        date = d;
    }
    public String getDate() {
        return date;
    }
    
    public void setLink(String l) {
        link = l;
    }
    public String getLink() {
        return link;
    }
    
    public void setSummary(String s) {
        summary = s;
    }
    public String getSummary() {
        return summary;
    }
}


Код
package rssclient;

import java.io.*;
import java.util.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

/**
 *
 * @author Oleg
 */
public class SAXHandler extends DefaultHandler {
    private ArrayList<Article> articles;
    private boolean isItemTag = false;
    private boolean isDateTag = false;
    private boolean isTitleTag = false;
    private boolean isLinkTag = false;
    private boolean isSummaryTag = false;
    
    private String title;
    private String date;
    private String link;
    private String summary;
    
    private Article[] getArticles() {
        return articles.toArray(new Article[articles.size()]);
    }
    
    @Override
    public void startDocument() throws SAXException {
        articles = new ArrayList<Article>();
    }
    
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if (isItemTag) {
            isTitleTag = "title".equals(qName);
            isDateTag = "date".equals(qName);
            isLinkTag = "link".equals(qName);
            isSummaryTag = "summary".equals(qName);
        } else isItemTag = "item".equals(qName);
    }
    
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (isTitleTag) title = new String(ch, start, length);
        else if (isDateTag) date = new String(ch, start, length);
        else if (isLinkTag) link = new String(ch, start, length);
        else if (isSummaryTag) summary = new String(ch, start, length);
    }
    
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("item".equals(qName)) {
            articles.add(new Article(title, date, link, summary));
            isItemTag = false;
            isTitleTag = false;
            isLinkTag = false;
            isSummaryTag = false;
            title = null;
            date = null;
            link = null;
            summary = null;
        } else if ("title".equals(qName)) isTitleTag = false;
        else if ("date".equals(qName)) isDateTag = false;
        else if ("link".equals(qName)) isLinkTag = false;
        else if ("summary".equals(qName)) isSummaryTag = false;
    }
    
    @Override
    public void endDocument() throws SAXException {
    }
    
    /**
     * 
     * @param xml the path to *.xml file
     * @return array of Articles
     * @throws java.lang.Exception
     */
    public static Article[] parse(String xml) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        
        SAXHandler handler = new SAXHandler();
        parser.parse(new File(xml), handler);
        
        return handler.getArticles();
    }
}


Код
import org.junit.*;
import static org.junit.Assert.*;
import java.util.*;
import rssclient.*;

/**
 *
 * @author Oleg
 */
public class TestArticle {
    @Test
    public void testArticleSetGetTitle() {
        Article article = new Article();
        article.setTitle("Title1");
        assertEquals("Title1", article.getTitle());
    }
    
    @Test
    public void testSecondConstructor() {
        Article article = new Article("T", "D", "L", "S");
        assertEquals(true, article.getTitle()=="T" && article.getDate()=="D" &&
                article.getLink() == "L" && article.getSummary()=="S");
    }
    
    public static junit.framework.Test suite() {
        return new junit.framework.JUnit4TestAdapter(TestArticle.class);
    }
    
    public static void main(String[] args) {
        org.junit.runner.JUnitCore.main("TestArticle");
    }
}


Код
<?xml version="1.0" encoding="UTF-8"?>
<channel>
        <title>chanelTitle</title>
        <date>Tue, 26 Aug 2008 11:12:27 +0000</date>
        <link>chanelLink</link>
        <summary>chanelSummary</summary>
    <item>
        <title>Title 1</title>
        <date>Tue, 26 Aug 2008 11:24:48 +0000</date>
        <link>Link 1</link>
        <summary>Summary 1</summary>
    </item>
    <item>
        <title>Title 2</title>
        <link>Link 2</link>
        <summary>Summary 2</summary>
    </item>
    <item>
        <title>Title 3</title>
        <link>Link 3</link>
        <summary>Summary 3</summary>
    </item>
    <item>
        <title>Title 4</title>
        <link>Link 4</link>
        <summary>Summary 4</summary>
    </item>
</channel>


И появился ряд маленьких вопросов:
1. Тут, как и в примере из FAQ, с которого я это делал, xml читаем из файла. А как в реальном клиенте? Т.е. как изменится строчка
Код
parser.parse(new File(xml), handler);
?
2. JavaDoc. Что нужно комментировать, а что нет?
3. RSS. Если посмотрите мой пример xml-я - увидите, что сперва идет <channel> со своим описанием, потом - <item>-ы. Как и зачем использовать описания <channel> (интересует логика, как прочитать как-бы понятно)?
4. Есть разные форматы RSS, значит мне надо наследовать мой SAXHandler и реализовать наследников для разных форматов? ЗЫ: тут можно использовать паттерн абстрактная фабрика (как-то просматривал статьи про паттерны, могу все путать)?
5. Планирую сделать "caching of articles", ну т.е. писать все в БД. Подскажите, как различать новые итемы от существующих (наверное сравнивать какие-то поля. какие поля? есть какое-то общепринятое решение)?
6. По тестам. Что необходимо тестить в приведенном коде?
7. Последнее. Класс Article. Полей в нем достаточно?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
ivg
Дата 28.8.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Для полноты картины: wiki: RSS (внизу есть ссылки на спецификации), Open Source RSS & RDF Tools in Java(На случай если вдруг вы захотите использовать готовые решения, а не изобретать своё);
1. В реальном клиенте, а точнее в классе/интерфейсе, предназначенном непосредственно для использования в клиентском коде, будет куча одноимённых методов, различающихся типом входных параметров. Например содержимое входного xml может быть предано как String, File, InputStream и т.д. Естественно никакого handler'а в параметрах не будет - это наше дело, каким способом мы парсим xml.
2. Комментировать лучше всё, а вот JavaDoc формировать по классам/пакетам, которые могут быть использованы клиентом, исключив private поля/методы/внутренние классы;
3. См. первую ссылку.
4.
Цитата(Shklyar @  27.8.2008,  22:04 Найти цитируемый пост)
Есть разные форматы RSS, значит мне надо наследовать мой SAXHandler и реализовать наследников для разных форматов?

Не факт. Как вы будете определять объект какого класса инстанциировать? Заставлять клиента определять? - Нехорошо. На основе содержимого xml - для этого нужно его распарсить. Может лучшим решением будет распарсить в каком то общем виде, определить формат, а потом уже сформировать ответ для клиента.
5. См. первую ссылку.
6. Ну классы модели, представляющие из себя POJO классы, по моему, тестировать ни к чему. Тестировать надо функционал, логику работы самого парсера. На вход даёте, заранее определённый xml, получаете результат и проверяете его.
7. См. первую ссылку. Кстати, по моему, результат работы парсера, лучше выдавать как объект одного класса, например RSSChannel или типа того.
В качестве резюме, попробую всё таки посоветовать использовать готовое решение, а не "изобретать велосипед". smile
PM MAIL   Вверх
Nudnik
Дата 28.8.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



а не красивее ли будет попробовать с помощью JAXB?
PM MAIL   Вверх
Shklyar
Дата 28.8.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цель этой программы - получить опыт, маленький. Вот и приглянулась мне идея RSSClient-а, так программа будет включать работу с xml, с БД, чем-то еще. По этому, как для обучения, наверное, лучше "изобретать велосипед".
Подскажите что счас (маленькое) сделать?
Сенкс.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
LSD
Дата 28.8.2008, 14:29 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Продолжай делать свой RSS клиент. Раз с  парсингом XML разобрался, делай получение RSS из интернета (поищи по форуму: URL openConnection) . Потом попробуй совместить код парсинга и чтения из интернета.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 28.8.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Дык а это не HTTPClient (такое когда-то делал)?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
LSD
Дата 28.8.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Можно и HTTPClient использовать, раз ты с ним знаком.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 28.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Код
package rssclient;

import java.net.*;
import java.io.*;

/**
 *
 * @author Oleg
 */
public class HTTPClient {
    private String answer = "";
    
    public HTTPClient(String url) {
        try {
            URL s = new URL(url);
            URLConnection sc = s.openConnection();
            
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(sc.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                answer += inputLine + "\n";
            in.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public String getAnswer() {
        return answer;
    }
}


И вызываю его:
Код
        HTTPClient httpClient = new HTTPClient("http://rss.net/rss.xml");
        System.out.println(httpClient.getAnswer());


А как модифицировать
Код
parser.parse(new File(xml), handler);
?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 28.8.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Переделал, чуток HTTPClient:
Код
package rssclient;

import java.net.*;
import java.io.*;

/**
 *
 * @author Oleg
 */
public class HTTPClient {
    private String answer = "";
    private InputStream isAnswer;
    
    public HTTPClient(String url) {
        try {
            URL s = new URL(url);
            URLConnection sc = s.openConnection();
            
            isAnswer = sc.getInputStream();
            
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(isAnswer));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                answer += inputLine + "\n";
            in.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public String getAnswer() {
        return answer;
    }
    
    public InputStream getISAnswer() {
        return isAnswer;
    }
}
, добавил, в SAXHandler метод:
Код
    public static Article[] parse(InputStream httpAnswer) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        
        SAXHandler handler = new SAXHandler();
        parser.parse(httpAnswer, handler);
        
        return handler.getArticles();
    }

И вызываю все так:
Код
        try {
            HTTPClient httpClient = new HTTPClient("http://rss.net/rss.xml");
            for (Article article : SAXHandler.parse(httpClient.getISAnswer()))
                System.out.println("Title: " + article.getTitle() + "\n" +
                "Date: " + article.getDate() + "\n" +
                "Link: " + article.getLink() + "\n" +
                "Description: " + article.getSummary() + "\n");
        } catch(Exception e) {
            System.out.println(e);
        }

И получаю org.xml.sax.SAXParseException: Premature end of file.
Почему?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 28.8.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



К предыдущему посту:
Что происходит - понятно (функция httpClient.getISAnswer() возвращает некую пустоту), но почему?
ЗЫ: плохое имя придумал для переменной "isAnswer", как answer типа InputStream, очень смахивает на boolean "это answer?". Посоветуйте лучшее имя.

Добавлено через 2 минуты и 49 секунд
Классссс
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 28.8.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



К предыдущему посту:
Что происходит - понятно (функция httpClient.getISAnswer() возвращает некую пустоту), но почему?
ЗЫ: плохое имя придумал для переменной "isAnswer", как answer типа InputStream, очень смахивает на boolean "это answer?". Посоветуйте лучшее имя.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
LSD
Дата 30.8.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Не надо никакого BufferedReader и чтения в промежуточный буфер. Скармливай парсеру просто InputStream, тот сам с кодировкой разберется.

Просто добавь в твой SAXHandler метод парсинга. Передаеш туда URL, он открывает URLConnection и сразу же парсит полученный результат. После чего закрывает соединение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 30.8.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Вроде видал в документации даже метод с такой сигнатурой:
SAXParser.parse(String url, SAXHandler handler);


А InputStream может быть прочитан только один раз?
Парсеру пробовал дать InputStream, принимает, но InputStream оказывается пустым (выше есть код этого).
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 30.8.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Гы, действительно, InputStream можно прочесть один раз. Подскажите по теории, почему так?

С последнего поста, с кодом, поменял только HTTPClient class, так:
Код
package rssclient;

import java.net.*;
import java.io.*;

/**
 *
 * @author Oleg
 */
public class HTTPClient {
    private String answer = "";
    private InputStream isAnswer;
    
    public HTTPClient(String url) {
        try {
            URL s = new URL(url);
            URLConnection sc = s.openConnection();
            
            isAnswer = sc.getInputStream();
            
            /*BufferedReader in = new BufferedReader(
                    new InputStreamReader(isAnswer));
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                answer += inputLine + "\n";
            in.close();*/
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public String getAnswer() {
        return answer;
    }
    
    public InputStream getISAnswer() {
        return isAnswer;
    }
}


HTTPClient решил оставить в отдельном классе, т.к. это учебная программа и в ней появился новый рассмотренный вопрос. В перспективе, если из этого получиться что-то приличное - оформлю и выложу все в интернете и дам ссылку со своего резюме. Думаю это будет мне плюсом.

Что дальше? БД?
А вообще, то у меня душа лежит реализовать uml диаграмму классов приложения целиком. Вот только я его (приложение), пока, целиком смутно представляю. :(
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 30.8.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



После использования URL.openConnection() его нужно закрывать?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
ivg
Дата 1.9.2008, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Shklyar @  30.8.2008,  17:37 Найти цитируемый пост)
Гы, действительно, InputStream можно прочесть один раз. Подскажите по теории, почему так?

Это довольно таки широко распостранённая абстракция в Java (и не только), представляющая собой доступ к устройствам последовательного ввода данных (сеть, последовательный доступ к файлу, куча различных переферийных последовательных интерфейсов и т. п.)
PM MAIL   Вверх
LSD
Дата 1.9.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Shklyar @  30.8.2008,  17:11 Найти цитируемый пост)
После использования URL.openConnection() его нужно закрывать?

Желательно. 

Но сам URLConnection закрыть нельзя. Надо или приводить к HttpURLConnection или закрыть полученный InputStream.


Цитата(Shklyar @  30.8.2008,  15:37 Найти цитируемый пост)
Что дальше? БД?

БД, GUI как хочешь.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shklyar
Дата 1.9.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Думал заняться БД, но начал с того, что снова посмотрел форматы RSS (на перспективу хочу RSS 1.0, RSS 2.0, Atom) на предмет того, какие поля будут присутствовать в моем RSSClient-е, а соответственно как будет выглядеть БД. Результат - нужно еще посмотреть. Трудность у меня в том, что мне, как я понимаю необходимо придумать какой-то свой формат, который будет содержать главные (необходимые) и пересекающиеся поля из указанный форматов.
Одновременно наткнулся в интернете на тему проверки файла на обновление перед тем, как качать. Тож нужно посмотреть. Глупо качать то, что уже есть.. Или это делать после того, как будет получена первая программа, которая что-то делает?
И снова мысли о том, как будет выглядеть приложение целиком. Вот появился вопрос: нормально-ли когда основа приложения GUI? Т.е. алгоритм такой: получение итемов новостей с RSS канала -> запись их в БД -> чтение БД -> отображение новостей. Ох эта диаграмма классов. Она сильно отбирает у меня покой.
GUI, наверное, логично делать после БД.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 2.9.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Решил делать БД (в MySQL). Выглядеть она будет так (прочитал недавно статью IBM Ajax RSS-reader. Себя чувствую нормально с БД, но код взял из статьи. Онная, просто, придала уверенности в том, какие поля будут присутствовать):
Код
CREATE TABLE rss_feeds (
        rss_feed_id MEDIUMINT NOT NULL AUTO_INCREMENT,
        url TEXT NOT NULL,
        name TEXT NOT NULL,
        last_update TIMESTAMP,
        PRIMARY KEY ( rss_feed_id )
);

CREATE TABLE rss_articles (
        rss_feed_id MEDIUMINT NOT NULL,
        link TEXT NOT NULL,
        title TEXT NOT NULL,
        description TEXT NOT NULL
);

Интерестно видеть PRIMARY KEY ( rss_feed_id ) в MySQL.
Приведенный код будет чуть изменен, а именно, будет добавлено поле date в rss_articles и поле last_file_size в rss_feeds (для проверки обновлен ли rss).

Еще. Тут появился человек, который будет участвовать в разработке программы. Принимайте.

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 2.9.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Сделал первые наброски работы с БД (по мотивам Студенческого отдела кадров, было дело, когда изучал его  smile ). Смотрим:
Код
-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
-- 
-- Хост: localhost
-- Время создания: Сен 02 2008 г., 19:22
-- Версия сервера: 4.1.16
-- Версия PHP: 5.1.6
-- 
-- БД: `rssclient`
-- 

-- --------------------------------------------------------

-- 
-- Структура таблицы `articles`
-- 

CREATE TABLE `articles` (
  `article_id` mediumint(9) NOT NULL auto_increment,
  `title` text NOT NULL,
  `link` text NOT NULL,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `description` text NOT NULL,
  `is_readed` char(1) NOT NULL default 'F',
  `feed_id` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

-- 
-- Дамп данных таблицы `articles`
-- 

INSERT INTO `articles` VALUES (1, 'Title 1', 'Link 1', '2008-09-02 19:12:52', 'Summary 1', 'F', 0);
INSERT INTO `articles` VALUES (2, 'Title 2', 'Link 2', '2008-09-02 19:12:52', 'Summary 2', 'F', 0);
INSERT INTO `articles` VALUES (3, 'Title 3', 'Link 3', '2008-09-02 19:12:52', 'Summary 3', 'F', 0);
INSERT INTO `articles` VALUES (4, 'Title 4', 'Link 4', '2008-09-02 19:12:52', 'Summary 4', 'F', 0);

-- --------------------------------------------------------

-- 
-- Структура таблицы `feeds`
-- 

CREATE TABLE `feeds` (
  `feed_id` mediumint(9) NOT NULL auto_increment,
  `name` text NOT NULL,
  `url` text NOT NULL,
  `last_update` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `last_size` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`feed_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

-- 
-- Дамп данных таблицы `feeds`
-- 

Код
package rssclient;

import java.sql.Connection;
//import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.io.*;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author Oleg
 */
public class JDBC {
    private static Connection con;
    private static JDBC instance;
    
    private JDBC() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost/rssclient";
            con = DriverManager.getConnection(url,"root", "");
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static synchronized JDBC getInstance() {
        if (instance == null) instance = new JDBC();
        return instance;
    }
    
    public void insertNewArticles(InputStream ISAnswer) throws Exception {
        for (Article article : SAXHandler.parse(ISAnswer)) {
            PreparedStatement stmt = con.prepareStatement(
                    "INSERT INTO articles " +
                    //"(title, link, date, description) " +
                    "(title, link, description) " +
                    "VALUES (?, ?, ?)");
            stmt.setString(1, article.getTitle());
            stmt.setString(2, article.getLink());
            //stmt.setString(3, article.getDate());
            stmt.setString(3, article.getSummary());
            
            stmt.execute();
        }
    }
    
    public Collection getAllArticles() throws SQLException {
        Collection articles = new ArrayList();
        
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(
                "SELECT title, link, description FROM articles");
        
        while(rs.next()) {
            Article article = new Article();
            article.setTitle(rs.getString(1));
            article.setLink(rs.getString(2));
            article.setSummary(rs.getString(3));
            articles.add(article);
        }
        rs.close();
        stmt.close();
        
        return articles;
    }
}

В классе Article добавил:
Код
@Override
    public String toString() {
        return title + "\n" + link + "\n" + date + "\n" + summary + "\n";
    }

Ну и Main.java стал таким:
Код
package rssclient;

import java.util.Iterator;

/**
 *
 * @author Oleg
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            HTTPClient httpClient = new HTTPClient("http://rss.net/rss.xml");

            JDBC db = JDBC.getInstance();
            db.insertNewArticles(httpClient.getISAnswer());
            
            httpClient.closeISAnswer();
            
            for(Iterator i = db.getAllArticles().iterator(); i.hasNext();)
                System.out.println(i.next().toString());
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

}

Только возникли проблемы с полем даты. Как я понимаю в RSS стандартного формата нет и это просто String. Как мне его превращать в Date date?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
duk
Дата 2.9.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Посмотри: DateFormat.parse(String s).



Это сообщение отредактировал(а) duk - 2.9.2008, 20:21
PM MAIL   Вверх
Shklyar
Дата 2.9.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(duk @ 2.9.2008,  20:07)
Посмотри: DateFormat.parse(String s).

Сенкс, но:
date = DateFormat.getDateInstance().parse("Tue, 26 Aug 2008 11:24:48 +0000");
дает
java.text.ParseException: Unparseable date: "Tue, 26 Aug 2008 11:24:48 +0000"

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
duk
Дата 2.9.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



static DateFormat    getDateInstance(int style)
          Gets the date formatter with the given formatting style for the default locale.
static DateFormat    getDateInstance(int style, Locale aLocale)
          Gets the date formatter with the given formatting style for the given locale. глянь вот это. 
PM MAIL   Вверх
garbuz
Дата 2.9.2008, 22:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Shklyar, молодец! Слежу за темой с самого ее начала! Давай не останавливайся! smile Если что - спрашивай!
PM MAIL   Вверх
Shklyar
Дата 3.9.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Нашел решение вопроса прасинга даты у родственника DateFormat - SimpleDateFormat

java.lang.Object
  extended by java.text.Format
      extended by java.text.DateFormat
          extended by java.text.SimpleDateFormat

Код
package testdateformatparsestring;

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Locale;
import java.util.Date;

/**
 *
 * @author Oleg
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            Date date = new SimpleDateFormat(
                    "EEE, dd MMM yyyy HH:mm:ss Z", Locale.US).
                    parse("Tue, 26 Aug 2008 12:24:48 +0000");
            System.out.println(date);
        }
        catch(ParseException e) {
            e.printStackTrace();
        }
    }

}

Подскажите: правильно-ли написан паттерн даты и выбрана Locale?
Результат работы - Tue Aug 26 15:24:48 EEST 2008
Что такое EEST, почему происходит сдвиг на 3 часа?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 3.9.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Теперь GUI (дорабатывать нужно все, но это на последующих итерациях, логично?).
И вопрос: в визуальном редакторе (с последующей доработкой, при надобности) или полностью руками?
Мысли такие: в визуальном редакторе быстрее.
А как работают в реальных и больших проектах?
Сам, уже пробовал и так и так (руками - в Eclipse, с визуальным редактором - в NetBeans, счас работаю с NetBeans). Т.е. вариант руками из за того, что это обучение - отбросил.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 3.9.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(Shklyar @  3.9.2008,  18:36 Найти цитируемый пост)
Т.е. вариант руками из за того, что это обучение - отбросил. 

Написание GUI рукми - это не обучение smile Я все же посоветовал бы именно руками. На мой взгляд ГУЙ у RSS ридера не должен быть сложным. Посмотрите в этой ветке прикрепленную тему "Маленькие классы", кто-то выкладывал класс, для работы с GridBaglayout, возможго поможет.

PM MAIL   Вверх
Shklyar
Дата 4.9.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



GUI, для меня, получилась самой сложной темой. layout решил взять попроще. В общем вот, что сделал:
Код
package rssclient;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.AbstractListModel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;

import java.util.Iterator;
import java.util.Vector;

import java.sql.SQLException;

/**
 *
 * @author Oleg
 */
public class MainForm extends JFrame implements ActionListener,
        ListSelectionListener {
    // Names for buttons
    private static final String OPEN_FEED = "openFeed";
    private static final String NEW_FEED = "newFeed";
    private static final String UPDATE_FEED = "updateFeed";
    private static final String DELETE_FEED = "deleteFeed";
    private static final String UPDATE_ARTICLES = "updateAtricles";
    private static final String DELETE_ARTICLE = "deleteArticle";
    private static final String CLOSE_TAB = "closeTab";
    
    public MainForm() {
        setTitle("RSS Client");
        
        // set layout for form
        getContentPane().setLayout(new BorderLayout());
        
        // create west panel
        JPanel west = new JPanel();
        west.setLayout(new BorderLayout());
        
        // create west button for open selected feed
        JButton btnOpenFeed = new JButton("Открыть канал");
        btnOpenFeed.setName(OPEN_FEED);
        btnOpenFeed.addActionListener(this);
        west.add(btnOpenFeed, BorderLayout.NORTH);
        
        // create other west buttons
        JButton btnAddFeed = new JButton("Добавить");
        btnAddFeed.setName(NEW_FEED);
        btnAddFeed.addActionListener(this);
        JButton btnUpdFeed = new JButton("Редактировать");
        btnUpdFeed.setName(UPDATE_FEED);
        btnUpdFeed.addActionListener(this);
        JButton btnDelFeed = new JButton("Удалить");
        btnDelFeed.setName(DELETE_FEED);
        btnDelFeed.addActionListener(this);
        
        // create panel for other west buttons
        JPanel westBtnPanel = new JPanel();
        westBtnPanel.add(btnAddFeed);
        westBtnPanel.add(btnUpdFeed);
        westBtnPanel.add(btnDelFeed);
        west.add(westBtnPanel, BorderLayout.SOUTH);
        
        // create list
        JList feedsList = new JList();
        feedsList.setModel(new AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }        
        });
        feedsList.addListSelectionListener(this);
        west.add(new JScrollPane(feedsList), BorderLayout.CENTER);
        
        // create east tabbed pane
        JTabbedPane eastTabbedPane = new JTabbedPane();
        
        // create east panel, add this panel to east tabbed pane
        JPanel east = new JPanel();
        east.setLayout(new BorderLayout());
        eastTabbedPane.add("Channel 1", east);
        
        // create east buttons
        JButton btnUpdArticles = new JButton("Обновить новости");
        btnUpdArticles.setName(UPDATE_ARTICLES);
        btnUpdArticles.addActionListener(this);
        JButton btnDelArticle = new JButton("Удалить новость");
        btnDelArticle.setName(DELETE_ARTICLE);
        btnDelArticle.addActionListener(this);
        JButton btnCloseTab = new JButton("Закрыть вкладку");
        btnCloseTab.setName(CLOSE_TAB);
        btnCloseTab.addActionListener(this);
        
        // create panel for east buttons
        JPanel eastBtnPanel = new JPanel();
        eastBtnPanel.add(btnUpdArticles);
        eastBtnPanel.add(btnDelArticle);
        eastBtnPanel.add(btnCloseTab);
        east.add(eastBtnPanel, BorderLayout.NORTH);
        
        // create eastCenter panel
        JPanel eastCenter = new JPanel();
        eastCenter.setLayout(new GridLayout(2, 1));
        east.add(eastCenter, BorderLayout.CENTER);
        
        // create table
        JTable articlesTable = new JTable(getTitleAndDateFromDB(),
                getTableTitle());
        eastCenter.add(new JScrollPane(articlesTable));
        
        // create text area
        JTextArea summaryArea = new JTextArea();
        summaryArea.setText("Summary\nLink");
        eastCenter.add(new JScrollPane(summaryArea));
        
        // insert west and east in form
        getContentPane().add(west, BorderLayout.WEST);
        getContentPane().add(eastTabbedPane, BorderLayout.CENTER);
        
        //set corners for form
        setBounds(100, 100, 760, 500);
    }
    
    public static void main(String args[]) {
        MainForm mf = new MainForm();
        mf.setDefaultCloseOperation(EXIT_ON_CLOSE);
        mf.setVisible(true);
    }
    
    // for interface ActionListener
    public void actionPerformed(ActionEvent e) {
    }
    
    // for interface ListSelectionListener
    public void valueChanged(ListSelectionEvent e) {
    }
    
    private Vector getTitleAndDateFromDB() {
        Vector titleAndDate = new Vector();
        /*try {
            JDBC db = JDBC.getInstance();
            for (Iterator i = db.getAllArticles().iterator(); i.hasNext();) {
                Article article = (Article) i.next();
                Vector vector = new Vector();
                vector.add(article.getTitle());
                vector.add(article.getStringDate());
                titleAndDate.add(vector);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }*/
        Vector vector = new Vector();
        vector.add("T");
        vector.add("D");
        titleAndDate.add(vector);
        titleAndDate.add(vector);
        
        return titleAndDate;
    }
    
    private Vector getTableTitle() {
        Vector vector = new Vector();
        vector.add("Title");
        vector.add("Date");
        return vector;
    }
}

Появился вопрос: подскажите, как на JTable-е сделать SelectionListener?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 4.9.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(Shklyar @  4.9.2008,  17:49 Найти цитируемый пост)

Появился вопрос: подскажите, как на JTable-е сделать SelectionListener? 

Ну наверно стоит добавить листенер. Вот тут посмотри:
http://jug.org.ua/wiki/display/JavaAlmanac...Table+Component
http://java.sun.com/docs/books/tutorial/ui...onlistener.html

еще  может тут чего найдешь полезного  smile 
http://www.java2s.com/Code/Java/Swing-JFC/Table.htm


Это сообщение отредактировал(а) garbuz - 4.9.2008, 23:40
PM MAIL   Вверх
Shklyar
Дата 5.9.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Сенкс,
Ну а вообще? Нужна критика, чтоб я мог ориентироваться в правильном ли направлении работаю.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 5.9.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Shklyar, я вообще не специалист по юзабилити, но мне кажется что интерфейс вполне приличный, мне сразу стало все понятно что к чему smile Вот только бы я кнопку открыть перенес бы в какое-нибудь другое место, не смотриться она там smile Понравились симпатичные вкладочки!
Короче продолжай в том же направлении! Молоток!  smile 

PS. Как допишешь первую бету - готов потестить smile
PM MAIL   Вверх
Shklyar
Дата 6.9.2008, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Для кнопки сделал отступ, стало лучше.
Получилось сделать листенер для таблицы (с второй ссылки).
Добавил модель для таблицы (модель - представление - контроллер).
+ всякая мелочь.

Основной вопрос - как и что необходимо сделать для корректной работы с JTabbedPane.
На каждой его вкладке должны быть следующие элементы:
Код
JPanel
     JPanel
          JButton
          JButton
          JButton
     JPanel
          JScrollPane
               JTable
     JPanel
          JScrollPane
               JTextArea

Каждая вкладка создается кнопкой вне JTabbedPane.
На одной вкладке JTabbedPane все сделано и прекрасно работает.
Добавить вкладку понятно как.
Вопрос в том, как организовать данные (т.е. связанную работу трех JButton, JTable и JTextArea на каждой вкладке, только внутри ее).

Думаю, что надо сделать отдельный (внутренний) класс для наполнения JTabbedPane.
В этот класс внести всю иерархию представления, модель таблицы и, наверно обработчики трех кнопок? Или как быть с обработчиками?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 6.9.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Что, если сделать так:
1. Описать внутренний (в MainForm) класс, для наполнения вкладок (включить туда из MainForm() панель (и все ее содержимое), которую кладу на JTabbedPane).
2. При создании новой вкладки (через создание нового экземпляра вышеуказанного класса) заносить объект в ArrayList.
3. Т.е., неявным образом, выйдет, что вкладка и объект, который ее заполнил имеют одинаковый индекс (к объекту, который заполнил вкладку, можно будет получить доступ получив индекс активной вкладки и попросив элемент из ArrayList по этому индексу).

Прокомментируйте, плис.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 7.9.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Сделал первую версию. Посмотрите, скажите свое мнение.


Присоединённый файл ( Кол-во скачиваний: 35 )
Присоединённый файл  RSSClient.7z 448,17 Kb
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 7.9.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Да, для программки необходима MySQL.
:|
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
garbuz
Дата 7.9.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Shklyar, супер! Все работает! Завтра получше потыкаюсь и постараюсь написать конаструктив smile Молодец!  smile 

ЗЫ. А можно исходники сюда выложить? ну или хотя бы в приват? smile 

ЗЫЫ. Кстать mysql-connector есть версия поновее, 5 с чем-то smile

Это сообщение отредактировал(а) garbuz - 7.9.2008, 23:11
PM MAIL   Вверх
garbuz
Дата 7.9.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Все таки решил сейчас немного потыркаться smile Нашел небольшой косяк, если его можно так назвать. 
Как я понимаю, приложение не открывает две одинаковых вкладки с рсс. Когда открыт канал, жмакаем на кнопку редактировать, изменяем имя канала, жмем окей, а потом снова открыть, открывается вторая вкладка с таким же содержимым как и первая, только с другим именем, причем в списке каналов, только один. Тут я вижу два варианта.

1) При редактировании канала, редактируется и надпись на вкладке, если канал открыт.
2) При редактировании канала, если он открыт, вкладка закрывается и тогда уже в следующий раз она откроется с новым именем smile
PM MAIL   Вверх
SoulKeeper
Дата 7.9.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Цитата(Shklyar @  7.9.2008,  21:36 Найти цитируемый пост)
Да, для программки необходима MySQL.
:| 


Для чего MySQL? Ибо так все делают? H2DB, HSQLDB, Apache Derby (и т.д.) - на вкус и цвет. Ну не будет обычный пользователь ставить MySQL, а RSS ридер - программа в первую очередь ориентирована на обычных пользователей. В общем, пока еше не поздно, лутше перейти на какую-то из джавишных баз данных. И скорость выше (т.к. не через сокеты связь) и весит меньше, да и ресурсы экономит.
PM MAIL   Вверх
Shklyar
Дата 8.9.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(SoulKeeper @ 7.9.2008,  23:49)
Для чего MySQL? Ибо так все делают? H2DB, HSQLDB, Apache Derby (и т.д.) - на вкус и цвет. Ну не будет обычный пользователь ставить MySQL, а RSS ридер - программа в первую очередь ориентирована на обычных пользователей. В общем, пока еше не поздно, лутше перейти на какую-то из джавишных баз данных. И скорость выше (т.к. не через сокеты связь) и весит меньше, да и ресурсы экономит.

Тут вопрос кроется во мне. Просто я стремлюсь стать junior Java developer (в этом и есть цель этой программки - опыт, посмотрите по вопросам: xml + db + http + gui ++), а в прошлом работал с php + MySQL. Думаю, что для желаемой должности учить дополнительно что-то про ДБ нет смысла (попасть на желаемую СУБД трудно, а SQL одинаков), есть куча более необходимых на сейчас вопросов. MySQL и так знаю + поселилась она на моем компе давно и основательно. Потому и выбрал.

А перейти на другую СУБД можно всегда - поменять драйвер и, возможно, почитать один класс (а, возможно, и так заработает).
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 8.9.2008, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(garbuz @ 7.9.2008,  23:10)
Shklyar, супер! Все работает! Завтра получше потыкаюсь и постараюсь написать конаструктив smile Молодец!  smile 

ЗЫ. А можно исходники сюда выложить? ну или хотя бы в приват? smile 

ЗЫЫ. Кстать mysql-connector есть версия поновее, 5 с чем-то smile

1. Сенкс, очень приятно. Хотя, когда первый раз ты меня похвалил, то я подумал: ну все, щас расслаблюсь (и на этом программка будет закончена). Сенкс.

2. Да. Только, когда я заканчивал с гуи, то начался такой код, что стыдно показывать. Вообще, то и по началу много всякого стыдного, но концовка...

3. Наверно. Нашел библиотеку на своем компе (с тех времен, когда смотрел Студенческий отдел кадров).

Добавлено через 1 минуту и 31 секунду
Цитата(garbuz @ 7.9.2008,  23:25)
Нашел небольшой косяк. 
Когда открыт канал, жмакаем на кнопку редактировать, изменяем имя канала, жмем окей, а потом снова открыть, открывается вторая вкладка с таким же содержимым как и первая, только с другим именем, причем в списке каналов, только один.

Косяк. Но перед его исправлением нужно подумать про структуру программки (как красиво связать закладки, их модели и список и его модель). Как я писал выше они связаны совпадающими индексами (сразу понимал, что идея хлипкая) и под конец гуи начал это чувствовать.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
SoulKeeper
Дата 8.9.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Цитата(Shklyar @  8.9.2008,  01:03 Найти цитируемый пост)
Тут вопрос кроется во мне. Просто я стремлюсь стать junior Java developer (в этом и есть цель этой программки - опыт, посмотрите по вопросам: xml + db + http + gui ++), а в прошлом работал с php + MySQL. Думаю, что для желаемой должности учить дополнительно что-то про ДБ нет смысла (попасть на желаемую СУБД трудно, а SQL одинаков),


Ну джуниром возьмут по любому, после университета бывает народ что вообще нифига не понимает, но ничего, проводят пару месяцев на курсах, потом идут на работу. Но, по моему, не в ту степь копаете. GUI на джаве мало где делают, а вот вебом занимаются активно.

Цитата(Shklyar @  8.9.2008,  01:03 Найти цитируемый пост)
 есть куча более необходимых на сейчас вопросов. MySQL и так знаю + поселилась она на моем компе давно и основательно. Потому и выбрал.


Один с необходимых навыков программисат - умение принимать оптимальные\правильные решения. MySQL в данном случае к ним не относится ;)
PM MAIL   Вверх
Platon
Дата 8.9.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(SoulKeeper @  8.9.2008,  09:59 Найти цитируемый пост)
GUI на джаве мало где делают, а вот вебом занимаются активно.

Да это правда. Я - белая ворона в этом сообществе :( 
К сожалению, я не предприниматель, чтоб продвигать Java GUI, да и надо ли? Есть технология, которая предлагает готовое решение и популярна в сфере десктоп приложений (не Java)

Не знаю радоваться ли расстраиваться твоему решению писать GUI на Java...

...

Добавлено через 10 минут и 29 секунд
А так посмотрел, всё тип-топ. Для полноценного RSSClient не хватает малости - нормального HTML Renderer.

Добавлено через 12 минут и 22 секунды
И мои фиды обижает :( http://yanaidu.ru/jobs/feed

Это сообщение отредактировал(а) Platon - 8.9.2008, 09:16
PM MAIL ICQ   Вверх
Shklyar
Дата 8.9.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(SoulKeeper @ 8.9.2008,  08:59)
Ну джуниром возьмут по любому, после университета бывает народ что вообще нифига не понимает, но ничего, проводят пару месяцев на курсах, потом идут на работу.

Но, по моему, не в ту степь копаете. GUI на джаве мало где делают, а вот вебом занимаются активно.

Один с необходимых навыков программисат - умение принимать оптимальные\правильные решения. MySQL в данном случае к ним не относится ;)

1. Ох, больной, для меня, это вопрос.

2. Вы про сервлеты?

3. Давайте определимся с вопросом (для правильного решения). Если вопрос о том, какая СУБД нужна для RSSClient - согласен с вами. Если -  что в данном случае и на данном этапе использовать - MySQL.

Добавлено через 24 секунды
Цитата(Platon @ 8.9.2008,  09:15)
Не знаю радоваться ли расстраиваться твоему решению писать GUI на Java...

А так посмотрел, всё тип-топ. Для полноценного RSSClient не хватает малости - нормального HTML Renderer.


И мои фиды обижает :( http://yanaidu.ru/jobs/feed

1. А можно детальнее?

2. Да, это точно, но пока решил на этом сэкономить время.

3. Посмотрел. Да, он поступил плохо. Думаю это нужно решать через второй пункт.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
SoulKeeper
Дата 8.9.2008, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Цитата(Shklyar @  8.9.2008,  14:39 Найти цитируемый пост)
2. Вы про сервлеты?


Для начала про сервлеты, а вообще про JSP, Struts, Hibernate, JPA, Spring, JavaScript, Ajax, etc... smile Базово надо освоить хотя-бы сервлеты и JSP.

Цитата(Shklyar @  8.9.2008,  14:39 Найти цитируемый пост)
3. Давайте определимся с вопросом (для правильного решения). Если вопрос о том, какая СУБД нужна для RSSClient - согласен с вами. Если -  что в данном случае и на данном этапе использовать - MySQL.


Вопрос однозначно должен решатся с точки зрения того, на кого ориентирована ваша программа. Правильные технологические решения должны приниматься на начальном этапе разработки, ибо чем дальше в лес... Потом либо прийдется потратить слишком много усилий на переработку, либо уже сидеть скрипя зубами на изначально не верном решении.
PM MAIL   Вверх
Shklyar
Дата 8.9.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(SoulKeeper @  8.9.2008,  15:06 Найти цитируемый пост)
Для начала про сервлеты, а вообще про JSP, Struts, Hibernate, JPA, Spring, JavaScript, Ajax, etc... smile Базово надо освоить хотя-бы сервлеты и JSP.

JavaScript, Ajax?
Моя душа, честно говоря, ближе к толстому клиенту..

Отдельно: прикрепил код программы.

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  rssclientSrc.7z 5,91 Kb
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Platon
Дата 8.9.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Цитата(Shklyar @  8.9.2008,  15:39 Найти цитируемый пост)
1. А можно детальнее?


Цитата(SoulKeeper @  8.9.2008,  09:59 Найти цитируемый пост)
GUI на джаве мало где делают, а вот вебом занимаются активно.


Цитата(Platon @  8.9.2008,  10:15 Найти цитируемый пост)
Есть технология, которая предлагает готовое решение и популярна в сфере десктоп приложений (не Java)


Под "Есть технология" подразумевал .NET

Добавлено через 3 минуты и 44 секунды
Хотя, есть позывы к улучшению ситуации: http://forum.vingrad.ru/forum/topic-227207/index.html
PM MAIL ICQ   Вверх
Platon
Дата 8.9.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



Пока в java расстраивает изменение размера окна.

user posted image 

Это сообщение отредактировал(а) Platon - 8.9.2008, 20:00
PM MAIL ICQ   Вверх
Shklyar
Дата 8.9.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(Platon @  8.9.2008,  18:27 Найти цитируемый пост)
Цитата(Platon @  8.9.2008,  10:15 Найти цитируемый пост)
Есть технология, которая предлагает готовое решение и популярна в сфере десктоп приложений (не Java)
Под "Есть технология" подразумевал .NET


Да, возможно, .NET для GUI получше будет, но я за Java.
Хотя, одновременно, "сервлеты и JSP" менее интересны мне, хотя знать необходимо.

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
SoulKeeper
Дата 8.9.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Одно дело что нравится, другое - за что деньги платят. Я бы тоже с удовольствием толстые клиенты\игрушки писал, но увы...

Цитата

JavaScript, Ajax?


Под жабоскриптом имеется ввиду жабоскрипт который заполняет\проверяет формочки, календарики, прочее. Под аджаксом - перезагрузка кусочков странички без других частей smile

К примеру, Struts2 умеет работать с аджаксом, хотя там есть своя таглиба, которая использует dojo, через который уже и работают аджаксовские запросы smile

Это сообщение отредактировал(а) SoulKeeper - 8.9.2008, 21:16
PM MAIL   Вверх
garbuz
Дата 8.9.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 3
Всего: 11



Цитата(Shklyar @  8.9.2008,  19:32 Найти цитируемый пост)
Хотя, одновременно, "сервлеты и JSP" менее интересны мне, хотя знать необходимо.

Согласен что это надо знать, это можно так сказать основы Java EE. Уже только на основе этого + бд можно приличное веб приложение разработать. Вопрос вопрос в том, сколько сил и времени придется на это потратить, без использования каких-либо фреймворков.
В какой последовательности учился я.
Core java -> Swing -> БД -> Servlets -> Jsp -> Hibernate -> Struts -> начал Spring, но пока так и не осилил -> Portlets. Ко всему этому html, css, ajax.
Последовательность хоть и не закончена, но кажется вполне адекватной.

Shklyar, если ты раньше писал на пыхе, то для тебя не составит труда понять servlets и jsp smile
PM MAIL   Вверх
Shklyar
Дата 8.9.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(SoulKeeper @  8.9.2008,  21:12 Найти цитируемый пост)
Одно дело что нравится, другое - за что деньги платят. Я бы тоже с удовольствием толстые клиенты\игрушки писал, но увы...

Тогда такой вопрос: есть ли специализации Java EE программистов?
Все ли (на коммерческом уровне) работает в веб интерфейсе (через браузер)?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 8.9.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(garbuz @  8.9.2008,  23:09 Найти цитируемый пост)
Core java -> Swing -> БД -> Servlets -> Jsp -> Hibernate -> Struts -> начал Spring, но пока так и не осилил -> Portlets. Ко всему этому html, css, ajax.
Последовательность хоть и не закончена, но кажется вполне адекватной.

Shklyar, если ты раньше писал на пыхе, то для тебя не составит труда понять servlets и jsp

Понять servlets и jsp, наверное дело чести. html, css - исходя из прошлого опыта известны.
А вот JavaScript (а, как следствие, и Ajax) ... Максимум - заюзать какуюто фичу. Большое желание отдать это ...
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1352 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.