Обзор:
В этом уроке мы разработаем приложение для персонального менеджера музыки с использованием баз данных Struts 2, Hibernate и MySQL. Веб-приложение может быть использовано для добавления вашей музыкальной коллекции в базу данных. Мы покажем форму для добавления записи, а внизу покажем все музыкальные коллекции. Из каждой строки запись можно удалить, нажав ссылку «Удалить». Мы выбрали Struts2, поскольку это один из гибких J2EE-фреймворков. База данных MySQL, и мы использовали Hibernate в качестве инструмента ORM.
Используемые инструменты:
- Eclipse Indigo Java EE IDE для веб-разработчиков
- Struts 2
- Hibernate 3
- Hibernate Tools Eclipse Plugin Версия 3.5.1
- jar-файл JDBC для mysql (mysql-connector-java-5.1.23)
- Tomcat 7
Шаг 1: Подготовка базы данных
Мы использовали phpMyAdmin для разработки базы данных и добавления к ней таблицы. Вы можете использовать любой инструмент для создания таблицы в MySQL. Ниже приведен скриншот таблицы.
Созданная нами база данных — music_manager, а таблица albumtbl будет использоваться для хранения музыкальных данных. Пока игнорируйте genretbl, так как мы будем использовать эту таблицу в качестве мастер-таблицы для хранения всех музыкальных жанров в следующей части урока.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
CREATE TABLE IF NOT EXISTS `albumtbl` ( `music_id` INT(4) NOT NULL AUTO_INCREMENT, `album_title` VARCHAR(255) NOT NULL, `album_genre` VARCHAR(255) NOT NULL, `album_artists` text NOT NULL, `no_of_tracks` INT(2) NOT NULL, PRIMARY KEY (`music_id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;INSERT INTO `albumtbl` (`music_id`, `album_title`, `album_genre`, `album_artists`, `no_of_tracks`) VALUES(1, 'Trouble-Akon', 'Hip Hop', 'Akon', 11),(3, 'Savage Island', 'Contemporary R&B', 'Savage, Ganxstardd, Soulja Boy, David Dallas, Sean P, Pitbull', 16),(4, 'Kiss (Carly Rae Jepsen album)', 'Pop', 'Carly Rae Jepsen, Justin Bieber, Owl City', 12),(5, 'Taylor Swift (album)', 'Pop', 'Taylor Swift', 15); |
Шаг 2. Создайте пакеты в исходном коде java, как показано на скриншоте
- Пакет ‘businessobjects’ будет содержать Java-бины POJO полей в таблице базы данных.
- В пакете ‘dao’ будут находиться Java-классы уровня доступа к данным. У нас есть интерфейс dao и версия его реализации. Этот дао фактически сделает грязную работу по разговору и обновлению таблицы.
- Пакет ‘hbm’ содержит файл * .hbm для отображения полей hibernate xml в таблицу.
- Пакет ‘utils’ содержит весь класс Utility, который будет использоваться другими классами.
- «Действия» будут иметь все классы действий Struts 2.
- Пакет «делегатов» содержит Java-классы делегатов, которые будут служить мостом между внешним интерфейсом и уровнем гибернации dao.
- Пакет ‘forms’ является необязательным в Struts 2, так как он не имеет концепции ActionForm. Однако для простоты и удобства обслуживания мы оставим здесь все установщики геттеров, и класс будет расширяться.
Шаг 3: Скопируйте файлы JAR в папку lib
Вам потребуется файл servlet-api.jar, который вы получите из установочного каталога Tomcat. Мой Tomcat находится в папке C: \ Java \ Tomcat \ tomcat7.
Шаг 4. Добавление поддержки Struts 2
Включите Struts2.xml и поместите ссылку в web.xml для поддержки struts2.
web.xml
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>PersonalMusicManagerApp</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping></web-app> |
struts.xml
|
01
02
03
04
05
06
07
08
09
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
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" /> <package name="default" extends="struts-default" namespace="/"> <default-action-ref name="index" /> <action name="index"> <result>index.jsp</result> </action> <action name="listAlbum" class="com.tctalk.apps.mmgr.web.actions.MusicManagerAction" method="getAllAlbumList" > <result name="success">/WEB-INF/web/jsps/musicmgr.jsp</result> </action> <action name="addAlbum" class ="com.tctalk.apps.mmgr.web.actions.MusicManagerAction" method="addAlbumToCollection" > <result name="input">listAlbum</result> <result name="success" type="redirectAction">listAlbum</result> </action> <action name="delAlbum" class ="com.tctalk.apps.mmgr.web.actions.MusicManagerAction" method="delAlbumFromCollection" > <result name="success" type="redirectAction">listAlbum</result> </action> </package></struts> |
Шаг 5: Добавьте поддержку Hibernate
Для работы с Hibernate мы использовали плагин Jboss Elipse Hibernate для генерации hbm-файлов для этого. Этот плагин не является обязательным, так как он сэкономит некоторое время, легко генерируя «конфигурацию гибернации» и файлы hbm У нас уже есть хорошее пошаговое руководство о том, как вы можете использовать этот плагин для автоматической генерации файлов hbm и java. Нажмите здесь, чтобы перейти к учебнику — http://www.techcubetalk.com/2013/04/step-by-step-auto-code-generation-for-pojo-domain-java-classes-and-hbm-files- используя-ELIPSE-спящий режим-плагин /
Вы можете скачать плагин с jboss.org в зависимости от версии Eclipse.
Шаг 5а. Создайте файл hibernate.cfg.xml — он будет содержать всю информацию аутентификации базы данных
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"<hibernate-configuration> <session-factory name=""> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/music_manager</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource="com/tctalk/apps/mmgr/db/hbm/Albumtbl.hbm.xml" /> </session-factory></hibernate-configuration> |
Шаг 5b: AlbumBO.java — POJO соответствует таблице albumtbl
|
01
02
03
04
05
06
07
08
09
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
|
package com.tctalk.apps.mmgr.db.businessobjects;// Generated by Hibernate Tools 3.4.0.CR1/** * AlbumtblBO generated by hbm2java */public class AlbumtblBO implements java.io.Serializable { private static final long serialVersionUID = -1445059679188116334L; private int musicId; private String albumTitle; private String albumGenre; private String albumArtists; private int noOfTracks; public AlbumtblBO() { } public AlbumtblBO(int musicId, String albumTitle, String albumGenre, String albumArtists, int noOfTracks) { this.musicId = musicId; this.albumTitle = albumTitle; this.albumGenre = albumGenre; this.albumArtists = albumArtists; this.noOfTracks = noOfTracks; } public int getMusicId() { return this.musicId; } public void setMusicId(int musicId) { this.musicId = musicId; } public String getAlbumTitle() { return this.albumTitle; } public void setAlbumTitle(String albumTitle) { this.albumTitle = albumTitle; } public String getAlbumGenre() { return this.albumGenre; } public void setAlbumGenre(String albumGenre) { this.albumGenre = albumGenre; } public String getAlbumArtists() { return this.albumArtists; } public void setAlbumArtists(String albumArtists) { this.albumArtists = albumArtists; } public int getNoOfTracks() { return this.noOfTracks; } public void setNoOfTracks(int noOfTracks) { this.noOfTracks = noOfTracks; }} |
Шаг 5c: Albumtbl.hbm.xml — содержит отображение между полями таблицы tabletbl таблицы и полями класса POJO AlbumBO.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<!-- Generated Mar 17, 2013 11:53:52 PM by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO" table="albumtbl" catalog="music_manager"> <id name="musicId" type="int"> <column name="music_id" /> <generator class="assigned" /> </id> <property name="albumTitle" type="string"> <column name="album_title" not-null="true" /> </property> <property name="albumGenre" type="string"> <column name="album_genre" not-null="true" /> </property> <property name="albumArtists" type="string"> <column name="album_artists" length="65535" not-null="true" /> </property> <property name="noOfTracks" type="int"> <column name="no_of_tracks" not-null="true" /> </property> </class></hibernate-mapping> |
Шаг 5d: HibernateUtils.java — это служебный класс для обработки сеанса гибернации.
Также MusicMgrConstant.java имеет местоположение / путь к файлу hibernate.cfg.xml, на который ссылаются.
|
01
02
03
04
05
06
07
08
09
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
|
package com.tctalk.apps.mmgr.utils;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtils { private static SessionFactory hbmSessionFactory; static { try { Configuration cfg = new Configuration() .configure(MusicMgrConstant._HIBERNATE_CONFIG_LOCATION); hbmSessionFactory = cfg.buildSessionFactory(); } catch (RuntimeException ex) { System.out.println("********* Error occurred while reading config file *********"); ex.printStackTrace(); } } /** * getSession creates hibernate Session & returns it */ public static Session getSession() { return hbmSessionFactory.openSession(); } /** * closeSession closes the session, if it exists */ public static void closeSession(Session inSession) { if (inSession != null) { inSession.close(); } }} |
|
1
2
3
4
5
6
|
package com.tctalk.apps.mmgr.utils;public interface MusicMgrConstant { String _HIBERNATE_CONFIG_LOCATION = "hibernate.cfg.xml";} |
Шаг 5e: MusicManagerDao.java и MusicManagerDaoImpl.java — это классы DAO, которые имеют методы для вывода, добавления и удаления данных в базе данных.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
package com.tctalk.apps.mmgr.db.dao;import java.util.List;import com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO;public interface MusicManagerDao { public List getAllMusicAlbumsFromCollection(); public boolean addAlbum(AlbumtblBO album); public boolean delAlbum(int albumId);} |
|
01
02
03
04
05
06
07
08
09
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
|
package com.tctalk.apps.mmgr.db.dao;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Session;import com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO;import com.tctalk.apps.mmgr.utils.HibernateUtils;public class MusicManagerDaoImpl implements MusicManagerDao { public List getAllMusicAlbumsFromCollection() { List albumList = null; Session hbmSession = null; try { hbmSession = HibernateUtils.getSession(); Criteria criteria = hbmSession.createCriteria(AlbumtblBO.class); albumList = criteria.list(); } catch (Exception ex) { ex.printStackTrace(); } finally { HibernateUtils.closeSession(hbmSession); } return albumList; } public boolean addAlbum(AlbumtblBO album) { Session hbmSession = null; boolean STATUS_FLAG = true; try { hbmSession = HibernateUtils.getSession(); hbmSession.beginTransaction(); //add the album to the hibernate session to save hbmSession.save(album); hbmSession.getTransaction().commit(); } catch (Exception ex) { ex.printStackTrace(); STATUS_FLAG = false; } finally { HibernateUtils.closeSession(hbmSession); } return STATUS_FLAG; } public boolean delAlbum(int albumId) { Session hbmSession = null; boolean STATUS_FLAG = true; try { hbmSession = HibernateUtils.getSession(); hbmSession.beginTransaction(); //first retrieve the album corresponds to that id AlbumtblBO albumObj = (AlbumtblBO)hbmSession.load(AlbumtblBO.class, albumId); hbmSession.delete(albumObj); hbmSession.getTransaction().commit(); } catch (Exception ex) { ex.printStackTrace(); STATUS_FLAG = false; } finally { HibernateUtils.closeSession(hbmSession); } return STATUS_FLAG; }} |
Шаг 6. Создайте слой пользовательского интерфейса в разделе WebContent.
Мы создали папку «web» для хранения всех файлов, связанных с пользовательским интерфейсом. Поскольку у этого приложения есть только одна JSP, мы создадим папку jsp и скопируем musicmngr.jsp.
В мы публикуем данные формы для действия addAlbum. Ниже мы перебираем список альбомов в таблице, чтобы вывести список музыкальных альбомов.
Musicmngr.jsp
|
01
02
03
04
05
06
07
08
09
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
|
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>TechcubeTalk.com - Let's build apps from scratch series - Personal Music Manager Application</title></head><body><h2>:: TechcubeTalk.com - Personal Music Manager ::</h2><div style="margin-bottom: 25px;"><s:form action="addAlbum" method="POST"> <s:textfield label="Album Title" name="album.albumTitle"/> <s:textfield label="Music Genre" name="album.albumGenre"/> <s:textarea label="Artist Names" name="album.albumArtists" cols="40" rows="10"/> <s:textfield label="Total No of Tracks" name="album.noOfTracks"/> <s:submit value="Add Music Album" align="center"/></s:form></div><div> <table style="border: 1px dotted black;"> <tr> <th style="background-color:#ABDCFF;">Album Title</th> <th style="background-color:#ABDCFF;">Music Genre</th> <th style="background-color:#ABDCFF;">Artist Names</th> <th style="background-color:#ABDCFF;">Total No of Tracks</th> <th style="background-color:#ABDCFF;">Delete</th> </tr> <s:iterator value="albumList" var="album"> <tr> <td><s:property value="albumTitle"/></td> <td><s:property value="albumGenre"/></td> <td><s:property value="albumArtists"/></td> <td><s:property value="noOfTracks"/></td> <td><a href="delAlbum.action?musicId=<s:property value="musicId"/>">delete</a></td> </tr> </s:iterator> </table></div></body></html> |
Шаг 7: Добавить класс действий
Класс действия MusicManagerAction.java будет обрабатывать всю обработку данных для jsp. Этот класс расширяет MusicManagerForm, который является ничем иным, как POJO, чтобы все геттеры / установщики соответствовали всем значениям формы и albumList для jsp.
- Метод getAllAlbumList () извлекает список музыкальных альбомов из базы данных через MusicManagerDelegate и устанавливает переменную albumList.
- Метод addAlbumToCollection () добавляет музыкальный альбом в базу данных.
- delAlbumFromCollection () удаляет конкретный альбом на основе musicId из базы данных.
MusicManagerAction.java
|
01
02
03
04
05
06
07
08
09
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
|
package com.tctalk.apps.mmgr.web.actions;import java.util.List;import com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO;import com.tctalk.apps.mmgr.web.delegates.MusicManagerDelegate;import com.tctalk.apps.mmgr.web.forms.MusicManagerForm;public class MusicManagerAction extends MusicManagerForm { private static final long serialVersionUID = 9168149105719285096L; private MusicManagerDelegate musicMgrDelegate = new MusicManagerDelegate(); public String getAllAlbumList(){ List albumList = musicMgrDelegate.getAllMusicAlbums(); String returnString = ERROR; if(albumList != null) { setAlbumList(albumList); returnString = SUCCESS; } return returnString; } public String addAlbumToCollection(){ String returnString = ERROR; AlbumtblBO album = getAlbum(); if(musicMgrDelegate.addAlbumToCollection(album)){ returnString = SUCCESS; } return returnString; } public String delAlbumFromCollection(){ String returnString = ERROR; int albumId = getMusicId(); if(musicMgrDelegate.delAlbumFromCollection(albumId)) { returnString = SUCCESS; } return returnString; }} |
MusicManagerForm.java
|
01
02
03
04
05
06
07
08
09
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
|
package com.tctalk.apps.mmgr.web.forms;import java.util.List;import com.opensymphony.xwork2.ActionSupport;import com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO;public class MusicManagerForm extends ActionSupport { private static final long serialVersionUID = 706337856877546963L; private List albumList = null; private AlbumtblBO album = null; private int musicId; public AlbumtblBO getAlbum() { return album; } public void setAlbum(AlbumtblBO album) { this.album = album; } public List getAlbumList() { return albumList; } public void setAlbumList(List albumList) { this.albumList = albumList; } public int getMusicId() { return musicId; } public void setMusicId(int musicId) { this.musicId = musicId; }} |
Шаг 8: Добавить делегатский класс
Класс делегата действует как мост между уровнем представления и уровнем обработки базы данных. Требуется ввод и передача на уровень базы данных (классы дао) для добавления / удаления данных в базе данных. Точно так же это выбирает данные из базы данных и показывает на странице.
MusicManagerDelegate.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.tctalk.apps.mmgr.web.delegates;import java.util.List;import com.tctalk.apps.mmgr.db.businessobjects.AlbumtblBO;import com.tctalk.apps.mmgr.db.dao.MusicManagerDao;import com.tctalk.apps.mmgr.db.dao.MusicManagerDaoImpl;public class MusicManagerDelegate { MusicManagerDao mmgrDao = (MusicManagerDao) new MusicManagerDaoImpl(); public List getAllMusicAlbums() { return mmgrDao.getAllMusicAlbumsFromCollection(); } public boolean addAlbumToCollection(AlbumtblBO albumobj) { return mmgrDao.addAlbum(albumobj); } public boolean delAlbumFromCollection(int albumId) { return mmgrDao.delAlbum(albumId); }} |
Шаг 9: Окончательная интеграция
Как только все будут интегрированы, окончательная структура пакета будет выглядеть следующим образом:

Создайте проект, щелкните правой кнопкой мыши по нему и выберите «Экспортировать как файл войны» и сохраните в известной папке Откройте консольное приложение Tomcat и просмотрите файл WAR, чтобы установить его.
После установки запустите приложение как (http: // localhost: 8080 / PersonalMusicManagerApp — URL-адрес может отличаться в зависимости от папки / порта установки Tomcat и т. Д.)
Если все работает успешно, появится экран —







