Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 18.05.2011
Сообщений: 68

Простое Web приложение с использованием Hibernate + JSF

05.09.2017, 16:08. Показов 1564. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать CRUD приложение примерно с таким(для начала) функционалом:
- Две статьи бюджета: Доходы, Расходы;
- Операции над ними: Создать, Найти, Изменить, Удалить, Вывести все.

Мне удалось написать консольное приложение с использованием Hibernate.
Ссылка на гитхаб: https://github.com/kurnakov92/... rnate-JSF-

Что мы имеем:

1) Слой DAO:

Интерфейс IncomeDao:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package training.budget.dao;
 
import training.budget.model.Income;
 
import java.util.List;
 
public interface IncomeDao {
 
    public Income addIncome(String name, double amount);
 
    public void updateIncome(int id, String name, double amount);
 
    public void removeIncome(int id);
 
    public Income getIncomeById(int id);
 
    public List<Income> listIncomes();
 
}
Реализация интерфейса IncomeDaoImpl:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package training.budget.dao;
 
import org.hibernate.Transaction;
import training.budget.model.Income;
 
import java.util.List;
 
import org.hibernate.Session;
 
 
public class IncomeDaoImpl implements IncomeDao {
 
    Session session;
 
    public IncomeDaoImpl() {
        session = HibernateSessionFactory.getSessionFactory().openSession();
    }
 
    public Income addIncome(String name, double amount) {
 
        Transaction transaction = null;
 
        transaction = session.beginTransaction();
        Income income = new Income(name, amount);
 
        session.save(income);
        transaction.commit();
 
        return income;
    }
 
    public void updateIncome(int incomeId, String incomeName, double incomeAmount) {
 
        Transaction transaction = null;
 
        transaction = session.beginTransaction();
        Income income = (Income) session.get(Income.class, incomeId);
        income.setName(incomeName);
        income.setAmount(incomeAmount);
        session.update(income);
        transaction.commit();
 
    }
 
    public void removeIncome(int incomeId) {
        Transaction transaction = null;
 
        transaction = session.beginTransaction();
        Income income = (Income) session.get(Income.class, incomeId);
        session.delete(income);
        transaction.commit();
    }
 
    public Income getIncomeById(int incomeId) {
        Transaction transaction = null;
 
        transaction = session.beginTransaction();
        Income income = (Income) session.get(Income.class, incomeId);
        transaction.commit();
 
        return income;
    }
 
    public List<Income> listIncomes() {
        Transaction transaction = null;
        transaction = session.beginTransaction();
 
        List incomes = session.createQuery("FROM Income ").list();
 
        return incomes;
    }
 
    public void closeSession() {
        session.close();
    }
}
Класс HibernateSessionFactory (честно скопированный на каком-то ресурсе):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package training.budget.dao;
 
 
 
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 
public class HibernateSessionFactory {
 
    private static SessionFactory sessionFactory = buildSessionFactory();
 
    protected static SessionFactory buildSessionFactory() {
        // A SessionFactory is set up once for an application!
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() // configures settings from hibernate.cfg.xml
                .build();
        try {
            sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
        }
        catch (Exception e) {
            // The registry would be destroyed by the SessionFactory, but we had trouble building the SessionFactory
            // so destroy it manually.
            StandardServiceRegistryBuilder.destroy( registry );
 
            throw new ExceptionInInitializerError("Initial SessionFactory failed" + e);
        }
        return sessionFactory;
    }
 
 
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
 
    public static void shutdown() {
        // Close caches and connection pools
        getSessionFactory().close();
    }
 
}
2) Модель:
Класс Income(статья дохода):
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package training.budget.model;
 
import javax.persistence.*;
/**
 * Аннотация @Entity используется для того, чтобы сообщить Hibernate, что класс взаимодействует с Hibernate.
 * Аннотация @Table - аннотация, используемая для явного указания названия таблицы.
 */
@Entity
@Table(name = "incomes")
public class Income {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "amount")
    private double amount;
 
    /**
     * Construcors
     */
    public Income() {
    }
 
    public Income(String name, double amount) {
        this.name = name;
        this.amount = amount;
    }
 
    /**
     * Getters and Setters
     */
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public double getAmount() {
        return amount;
    }
 
    public void setAmount(double amount) {
        this.amount = amount;
    }
 
    @Override
    public String toString() {
        return "Income{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", amount=" + amount +
                '}';
    }
}
3)Консольный Runner для проверки работоспособности приложения:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package training.budget.consoleRunners;
 
 
import training.budget.dao.IncomeDaoImpl;
import training.budget.model.Income;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
 
public class IncomeRunner {
 
    public static void main(String[] args) {
        String userInput = ""; // Line read from standard in
        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);
 
        IncomeDaoImpl incomeDaoImpl = new IncomeDaoImpl();
 
        try {
            while (!"0".equals(userInput)) {
                System.out.println("1. Добавить доход");
                System.out.println("2. Найти доход");
                System.out.println("3. Редактировать доход");
                System.out.println("4. Удалить доход");
                System.out.println("5. Вывести все записи");
                System.out.println("0. Выход");
 
                userInput = in.readLine();
 
                if ("1".equals(userInput)) {
                    try {
                        String incomeName = "";
                        double incomeAmount = 0;
                        System.out.print(" Введите название дохода: ");
                        incomeName = in.readLine();
                        System.out.print(" Введите сумму дохода: ");
                        incomeAmount = Double.parseDouble(in.readLine());
 
                        Income income = incomeDaoImpl.addIncome(incomeName, incomeAmount);
                        System.out.println("Доход создан. Название: "
                                + income.getName() + " сумма: " + income.getAmount());
                    } catch (Exception e) {
                        System.out.println("FAIL");
                    }
                } else if ("2".equals(userInput)) {
                    try {
                        int incomeId = 0;
                        System.out.print(" Введите ID дохода: ");
                        incomeId = Integer.parseInt(in.readLine());
                        Income income = incomeDaoImpl.getIncomeById(incomeId);
                        System.out.println("Статья дохода получена из базы данных. Название: "
                                + income.getName() + " сумма: " + income.getAmount());
                    } catch (Exception e) {
                        System.out.println("FAIL");
                    }
                } else if ("3".equals(userInput)) {
                    try {
                        int incomeId = 0;
                        String incomeName = "";
                        double incomeAmount = 0;
                        System.out.print(" Введите ID дохода: ");
                        incomeId = Integer.parseInt(in.readLine());
                        Income income = incomeDaoImpl.getIncomeById(incomeId);
                        System.out.print(" Введите название дохода: ");
                        incomeName = in.readLine();
                        System.out.print(" Введите сумму дохода: ");
                        incomeAmount = Double.parseDouble(in.readLine());
                        incomeDaoImpl.updateIncome(income.getId(), incomeName, incomeAmount);
                    } catch (Exception e){
                        System.out.println("FAIL");
                    }
                } else if ("4".equals(userInput)) {
                    try {
                        int incomeId = 0;
                        System.out.print(" Введите ID дохода: ");
                        incomeId = Integer.parseInt(in.readLine());
                        incomeDaoImpl.removeIncome(incomeId);
                        System.out.println("Статья дохода с ID =  " + incomeId + " удаленa из базы данных.");
                    } catch (Exception e) {
                        System.out.println("FAIL");
                    }
                } else if ("5".equals(userInput)){
                    try {
                        System.out.println("==========ДОХОДЫ=========");
                        List<Income> incomes = incomeDaoImpl.listIncomes();
                        for (Income income : incomes) {
                            System.out.println(income);
                            System.out.println("\n================\n");
                        }
                    } catch (Exception e){
                        System.out.println("FAIL");
                    }
                }
            }
            incomeDaoImpl.closeSession();
        } catch (Exception ex) {
            System.out.println("FAIL");
        }
 
    }
 
}
Теперь нужно сделать слой View. Я хочу сделать это с использованием JSF(насколько я знаю это самая свежая технология на данный момент). Вывести какой-то определенный текст на JSF-страницу мне удавалось, но вопрос в том как сделать так, чтобы на странице был доступ к базе данных? Как я понимаю, нужно написать контроллер, который поможет связать представление со слоем дао. Есть пример (который по сути отражает весь нужный мне функционал) https://www.youtube.com/watch?v=e7swABdqOS4&t=4s, в котором помимо контроллера есть еще слой сервиса(вот здесь мой мозг был взорван), но в нем не объясняется как именно реализуются эти слои, иными словами я не могу понять что там происходит.
Надеюсь на Вашу помощь, ув. форумчане!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.09.2017, 16:08
Ответы с готовыми решениями:

Простое win приложение с использованием БД
дабы не изобретать велосипедов) с C# знаком буквально пару дней. понадобилось срочно написать десктопное приложение под виндоус....

JSF Hibernate Data base
Делаю простую програмку CRUD с использованием JSF i Hibernate Следовала инструкциям на сайте...

JSF 2.2 + PrimeFaces 4.0 + Hibernate 4.3.6 + PostgreSQL 9.3 не работает
Здравствуйте! Я решил создать тестовый проект с описанными технологиями в NetBeans на сервере Glassfish 4. Создал проект, подключил все,...

9
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
05.09.2017, 19:19
ну так читай про спринг, если хочешь понимать, что там происходит, а сначала лучше про сервлеты
0
1 / 1 / 2
Регистрация: 18.05.2011
Сообщений: 68
05.09.2017, 19:50  [ТС]
А что именно читать по сервлетам? И что именно по спрингу? Я на форум обратился за помощью для того, чтобы если не дадут прямого совета или примера, то сузили хотя бы круг поисков, указали направление итд. Спринг крайне обширный фреймворк, по поводу сервлетов - информации по ним должно быть много, нет, СЛИШКОМ много. Пока я разбирался с тем как приблудить к проекту Hibernate даже в таком простом варианте, пришлось прошерстить приличное количество как видео туториалов, так и статей.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
05.09.2017, 22:09
Цитата Сообщение от Frizka Посмотреть сообщение
Я хочу сделать это с использованием JSF(насколько я знаю это самая свежая технология на данный момент)
самая свежая технология это JS CSS HTML. Остальное все старая некрасивая хрень
2
1 / 1 / 2
Регистрация: 18.05.2011
Сообщений: 68
05.09.2017, 22:28  [ТС]
то есть, лучше забить на JSF, и двигаться в сторону Java + JS CSS HTML? Просто я не в курсе как разрабатываются реальные проекты) И если двигаться в сторону JS, то как примерно работать проект должен отталкиваясь от моего? Если не сложно, опиши схематично как что куда, то есть вот код на яве(описываем модель, создаем слой дао), есть CSS HTML, с их помощью верстаем страничку, и последний блок - JS. Мне интересно что он должен делать и в каких местах взаимодействовать с Java кодом?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
05.09.2017, 22:31
Цитата Сообщение от Frizka Посмотреть сообщение
то есть, лучше забить на JSF, и двигаться в сторону Java + JS CSS HTML?
да

Цитата Сообщение от Frizka Посмотреть сообщение
Если не сложно, опиши схематично как что куда
https://spring.io/guides/gs/rest-service/
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
20.09.2017, 16:08
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Цитата Сообщение от Frizka
то есть, лучше забить на JSF, и двигаться в сторону Java + JS CSS HTML?
да
Кстати, видел в одном месте весь этот фронт-энд сидит на React(вроде аналогично Angular) и все проде бы красивенько и быстро рендерится. Не подскажете, это нормально, часто встречается или это узкая направленность того где я это видел? Спасибо.
0
3 / 3 / 14
Регистрация: 26.01.2016
Сообщений: 481
20.09.2017, 16:55
Реальные проекты Вы разрабатываете под реальные задачи.

KEKCoGEN все верно написал Spring + DB + JS(тут может быть любой или куча вместе JS, Jquery, AngularJS....) + CSS + HTML

Добавлено через 8 минут
Давайте представим что у Вас на сайте есть какие-то поля и Вы эти поля добавляете в БД.

Пишите HTML
Решаете как будете отправлять данные на сервер JS, form...
Создаете класс с описанием таблицы Hibernate
Создаете Repository(dao), через который будете обращаться к таблице.
Создаете DTO, если оно нужно.
Создаете Controller, который будет получать инфу с HTML
Советую создавать Service и в нем уже писать все операции, в данном случае добавление данных в Вашу БД

Порядок создания любой.
Я начинаю с описания таблицы чаще всего, хотя можно с HTML как Вам удобнее
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
20.09.2017, 18:17
Huge, Да я верю что он все правильно написал ))
Просто я был в одной конторе, там они свой фреймворк написали который сидел на React, и я подумал не их ли это специфика. Может мне пока этого не надо. Мне как человеку больше интересующемуся бэк-эндом, пока эти подробности неважны, больше волнует что обязательно надо будет знать, а то "чем дальше в лес, тем больше того что я не знаю" а все знать можно только попорядку.
0
 Аватар для flashcsgroup
20 / 20 / 5
Регистрация: 18.04.2013
Сообщений: 496
03.04.2018, 11:26
Цитата Сообщение от Frizka Посмотреть сообщение
насколько я знаю это самая свежая технология на данный момент
да это самый свежак
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2018, 11:26
Помогаю со студенческими работами здесь

Создать web-приложение с использованием php-фреймворка YII2 и СУБД MySQL
Здравствуйте, прошу помощь в лабораторной работе задание досточно сложное непонимаю немного как все сделать, если у кого-то есть пример,...

Web-приложение с использованием технологии ADO.Net для доступа к данным
Используя MS Access разработать базу данных книжный каталог, состоящую из полей Названия, Автор, Издательство, Год, ...

Web application JSF
Пытаюсь создать проект на Intellij IDE 2018 Ultimate согласно http://javastudy.ru/jsf-2/jsf-hello-world-example-primefaces/ руководству. На...

Как создать новый web-сайт или web-приложение (нет шаблона)
Здравствуйте! Установил Visual C# 2010 Express. При нажатии на кнопку меню &quot;Файл&quot; не вижу возможности создать Web-проект. В шаблонах...

Не завершается приложение c hibernate 4
Здравствуйте. Решил осваивать hibernate 4. Читаю документацию, выполняю примеры описанные в ней. Так вот, мапинг работает. Запись,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru