概述:
在本研讨会教程中,我们将使用Struts 2,Hibernate和MySQL数据库开发一个个人音乐管理器应用程序。 该Web应用程序可用于将您的音乐收藏添加到数据库中。 我们将显示用于添加唱片的表格,并在下面显示所有音乐收藏。 通过单击“删除”链接,可以从每一行中删除记录。 我们选择Struts2是因为它是灵活的J2EE框架之一。 该数据库是MySQL,我们已使用Hibernate作为ORM工具。
使用的工具:
- 面向Web开发人员的Eclipse Indigo Java EE IDE
- Struts2
- 休眠3
- Hibernate Tools Eclipse插件版本3.5.1
- mysql JDBC jar(mysql-connector-java-5.1.23)
- 雄猫7
步骤1:准备数据库
我们使用phpMyAdmin设计数据库并向其中添加表。 您可以使用任何工具在MySQL中创建表。 下面是表格的屏幕截图。
我们创建的数据库是music_manager,并且表albumtbl将用于存储音乐数据。 暂时忽略genretbl,因为在本教程的后面部分中,我们将使用此表作为主表来存储所有音乐流派。
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”包将包含数据库表中字段的POJO Java bean。
- 在“ dao”包中将包含数据访问层java类。 我们有一个接口dao及其实现版本。 该Dao实际上将完成交谈和更新表的工作。
- 'hbm'软件包包含* .hbm文件,用于将Hibernate xml映射到表字段。
- 'utils'软件包包含所有要由其他类使用的Utility类。
- “动作”将具有所有Struts 2动作类。
- 'delegates'包具有委托java类,它将充当前端层和休眠dao层之间的桥梁。
- 'forms'包在Struts 2中是可选的,因为它没有ActionForm概念。 但是,为了简单起见和可维护性,我们将所有getter设置程序保留在此处,并且该类将从其扩展。
步骤3:将jar文件复制到lib文件夹中
您将需要从Tomcat安装目录中获取的servlet-api.jar文件。 我的Tomcat位于C:\ Java \ Tomcat \ tomcat7文件夹中。
步骤4:添加Struts 2支持
包括Struts2.xml并将引用放在web.xml中以支持struts2。
web.xml
<?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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><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-使用椭圆休眠的插件/
您可以从Eclipse版本从jboss.org下载该插件。
步骤5a:创建hibernate.cfg.xml-这将具有所有数据库身份验证信息
<?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
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 –它包含表Albumtbl表的字段和POJO类AlbumBO的字段之间的映射。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 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的位置/路径。
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();}}
}
package com.tctalk.apps.mmgr.utils;public interface MusicMgrConstant {String _HIBERNATE_CONFIG_LOCATION = "hibernate.cfg.xml";
}
步骤5e:MusicManagerDao.java和MusicManagerDaoImpl.java –这些是DAO类,具有列出,添加和删除数据库中数据的方法。
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);
}
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 savehbmSession.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 idAlbumtblBO 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”部分中创建UI层
我们创建了“ web”文件夹,以将所有与UI相关的文件保留在那里。 由于此应用程序只有一个JSP,因此我们将创建jsp文件夹并复制musicmngr.jsp。
在中,我们将表单数据发布到操作addAlbum。 在此之下,我们遍历表中的专辑列表以列出音乐专辑。
Musicmngr.jsp
<%@ 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,以使所有getter / setter对应于jsp的所有表单值和albumList。
- getAllAlbumList()方法通过MusicManagerDelegate从数据库中检索音乐专辑列表,并在albumList变量中进行设置。
- addAlbumToCollection()方法将音乐专辑添加到数据库中。
- delAlbumFromCollection()从数据库中删除基于musicId的特定专辑。
MusicManagerAction.java
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
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:添加代表类
委托类充当表示层和数据库处理层之间的桥梁。 它接受输入并传递到数据库层(dao类)以在数据库中添加/删除数据。 同样,它从数据库中获取数据并显示在页面中。
MusicManagerDelegate.java
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安装文件夹/端口等而异)运行该应用程序。
如果一切顺利运行,将显示屏幕–
- 从GitHub存储库中以zip和war下载项目
翻译自: https://www.javacodegeeks.com/2013/12/workshop-on-creating-a-personal-musicmanager-web-application-with-struts2-hibernate-and-mysql.html