Статьи

Семинар по созданию персонального веб-приложения MusicManager с Struts2, Hibernate и MySQL

Обзор:

В этом уроке мы разработаем приложение для персонального менеджера музыки с использованием баз данных Struts 2, Hibernate и MySQL. Веб-приложение может быть использовано для добавления вашей музыкальной коллекции в базу данных. Мы покажем форму для добавления записи, а внизу покажем все музыкальные коллекции. Из каждой строки запись можно удалить, нажав ссылку «Удалить». Мы выбрали Struts2, поскольку это один из гибких J2EE-фреймворков. База данных MySQL, и мы использовали Hibernate в качестве инструмента ORM.

Используемые инструменты:

  1. Eclipse Indigo Java EE IDE для веб-разработчиков
  2. Struts 2
  3. Hibernate 3
  4. Hibernate Tools Eclipse Plugin Версия 3.5.1
  5. jar-файл JDBC для mysql (mysql-connector-java-5.1.23)
  6. Tomcat 7

Шаг 1: Подготовка базы данных

Мы использовали phpMyAdmin для разработки базы данных и добавления к ней таблицы. Вы можете использовать любой инструмент для создания таблицы в MySQL. Ниже приведен скриншот таблицы.

image001

Созданная нами база данных — 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, как показано на скриншоте

image003-300x183

  • Пакет ‘businessobjects’ будет содержать Java-бины POJO полей в таблице базы данных.
  • В пакете ‘dao’ будут находиться Java-классы уровня доступа к данным. У нас есть интерфейс dao и версия его реализации. Этот дао фактически сделает грязную работу по разговору и обновлению таблицы.
  • Пакет ‘hbm’ содержит файл * .hbm для отображения полей hibernate xml в таблицу.
  • Пакет ‘utils’ содержит весь класс Utility, который будет использоваться другими классами.
  • «Действия» будут иметь все классы действий Struts 2.
  • Пакет «делегатов» содержит Java-классы делегатов, которые будут служить мостом между внешним интерфейсом и уровнем гибернации dao.
  • Пакет ‘forms’ является необязательным в Struts 2, так как он не имеет концепции ActionForm. Однако для простоты и удобства обслуживания мы оставим здесь все установщики геттеров, и класс будет расширяться.

Шаг 3: Скопируйте файлы JAR в папку lib

image005

Вам потребуется файл servlet-api.jar, который вы получите из установочного каталога Tomcat. Мой Tomcat находится в папке C: \ Java \ Tomcat \ tomcat7.

image007

Шаг 4. Добавление поддержки Struts 2

Включите Struts2.xml и поместите ссылку в web.xml для поддержки struts2.

image009

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.

image011

Шаг 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"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<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: Окончательная интеграция

Как только все будут интегрированы, окончательная структура пакета будет выглядеть следующим образом:

image013
Создайте проект, щелкните правой кнопкой мыши по нему и выберите «Экспортировать как файл войны» и сохраните в известной папке Откройте консольное приложение Tomcat и просмотрите файл WAR, чтобы установить его.

image015

После установки запустите приложение как (http: // localhost: 8080 / PersonalMusicManagerApp — URL-адрес может отличаться в зависимости от папки / порта установки Tomcat и т. Д.)

Если все работает успешно, появится экран —

image017