1 / 1 / 2
Регистрация: 18.05.2011
Сообщений: 68

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

05.09.2017, 16:08. Показов 1594. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru