使用Struts2,Hibernate和MySQL BLOB开发个人迷你相册应用程序–第1部分

概述:

在本研讨会中,我们将开发一个Web应用程序,可用于创建漂亮的照片库。 您可以将其托管在Web服务器中,也可以在自己的PC中使用以维护和管理照片集。 使用本教程,您将能够了解与Struts2和Hibernate相关的以下重要内容:

  • 如何将Struts2框架与Hibernate集成
  • 如何在Struts2中上传照片或文件
  • 如何在MySQL BLOB字段之间动态上传/下载照片
  • 如何在Struts2中将参数从一个动作动态传递给另一个动作

在本教程的第1部分中,我们将开发管理面板。 管理面板将用于创建相册并将照片上传到相册。 在第2部分中,我们将创建前端主Web应用程序,该应用程序将按管理面板中添加的相册显示照片。

使用的工具:

  1. 面向Web开发人员的Eclipse Indigo Java EE IDE
  2. Struts2
  3. 休眠3
  4. Hibernate Tools Eclipse插件版本3.5.1
  5. mysql JDBC jar(mysql-connector-java-5.1.23)
  6. 雄猫7

步骤1:为照片库应用程序准备数据库MySQL

我们将使用MySQL数据库。 Belw是用于您创建数据库表的脚本。 使用的数据库名称是'tctalk_apps_photoalbum'。 但是,您可以创建任何数据库名称。 只要记住您需要在Hibernate配置文件中更改数据库名称即可。 以下是两个表Album和phototbl的SQL。

CREATE TABLE IF NOT EXISTS `album` (`albumid` INT(4) NOT NULL AUTO_INCREMENT,`albumname` VARCHAR(55) NOT NULL,`albumdesc` text NOT NULL,`albumcreatedate` DATE NOT NULL,PRIMARY KEY (`albumid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `phototbl` (`photoid` INT(4) NOT NULL AUTO_INCREMENT,`albumid` INT(4) NOT NULL,`phototitle` VARCHAR(255) NOT NULL,`photoname` VARCHAR(255) NOT NULL,`imgcontenttype` VARCHAR(255) NOT NULL,`photocreatedate` datetime NOT NULL,`photodata` longblob NOT NULL,PRIMARY KEY (`photoid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

步骤2:在Java源代码中创建包

在Eclipse中创建动态Web项目之后,在java src端创建软件包。 请记住,包com.tctalk.apps.album.db.xxx包含所有Java和其他文件,可在数据库/休眠端使用,而com.tctalk.apps.album.web.xxx将具有所有使用struts2的表示层的Java文件。框架。

image001

Businessobject将使所有BO类都与表映射。 Dao将具有DAO类以使用Hibernate调用数据库。 Hbm将具有* .hbm.xml文件,该文件具有表字段和表Java的映射。 实用程序将具有各种实用程序类。 动作将具有Struts2框架的所有动作类。 委托将把委托类作为UI层和DB层之间的桥梁。 表单将具有与UI字段相对应的POJO(普通Java对象)。 Hibernate.cfg.xml具有hibernate配置文件,以具有数据库连接信息以连接到数据库。 Struts.xml具有Struts配置数据。

步骤3:将jar文件复制到lib文件夹中

image003

您将需要从Tomcat安装目录中获取的servlet-api.jar文件。 我的Tomcat位于C:\ Java \ Tomcat \ tomcat7文件夹中。

步骤4:将Struts 2支持添加到我们的应用中

我们的应用程序中已经具有支持Struts2所需的jar文件。 现在是时候包括Struts2.xml并将引用放在web.xml中,以便让Tomcat知道这一点。

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>PersonalPhotoAlbumApp</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="/"><result-types><result-type name="imageResult" class="com.tctalk.apps.album.web.actions.CustomPhotoResult" /></result-types><default-action-ref name="index" /><action name="index"><result>index.jsp</result></action><action name="admin"><result name="success" type="redirectAction">listAlbumAdmn</result></action><action name="listAlbumAdmn" class="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="getAllAlbumList" ><result name="success">/WEB-INF/admin/jsp/showalbums.jsp</result></action><action name="addAlbumAdmn" class ="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="addAlbumToCollection" ><result name="input">listAlbumAdmn</result><result name="success" type="redirectAction">listAlbumAdmn</result></action><action name="delAlbumAdmn" class ="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="delAlbumFromCollection" ><result name="success" type="redirectAction">listAlbumAdmn</result></action><action name="listPhotosByAlbumAdmn" class="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="listAllPhotos" ><result name="success">/WEB-INF/admin/jsp/showphotos.jsp</result></action><action name="addPhotoAcion" class ="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="uploadPhotoToAlbum" ><interceptor-ref name="exception"/><interceptor-ref name="i18n"/><interceptor-ref name="fileUpload"><param name="allowedTypes">image/x-png,image/png,image/gif,image/jpeg,image/pjpeg</param></interceptor-ref> <interceptor-ref name="params"><param name="excludeParams">dojo\..*,^struts\..*</param></interceptor-ref><interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><result name="success" type="redirectAction"><param name="actionName">listPhotosByAlbumAdmn</param><param name="albumid">${albumid}</param></result><result name="input">/WEB-INF/admin/jsp/showphotos.jsp</result></action><action name="delPhotoFrmAlbumAdmn" class ="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="delPhoto" ><result name="success" type="redirectAction"><param name="actionName">listPhotosByAlbumAdmn</param><param name="albumid">${albumid}</param></result></action><action name="showPhotoAction"  class="com.tctalk.apps.album.web.actions.PhotoAlbumAdminAction" method="showPhoto"><result name="success" type="imageResult"/></action></package></struts>

步骤5:将Hibernate支持添加到我们的相册应用程序

要使用hibernate,我们已经有一个不错的分步教程,它显示了如何在Eclipse中使用Hibernate插件自动生成与数据库表相对应的hbm和java文件。 查看教程– http://www.techcubetalk.com/2013/04/step-by-step-auto-code-generation-for-pojo-domain-java-classes-and-hbm-files-using-elipse-休眠插件/

  1. 使用数据库连接信息创建hibernate.cfg.xml以连接到数据库
  2. 使用插件创建POJO类,并将其保存在与表相对应的包中。 在我们的应用程序中,我们将使用两个表相册和phototbl,因此我们有两个POJO类。
  3. 然后添加与上述步骤中创建的两个POJO类相对应的hbm文件
  4. 接下来,我们将添加HibernateUtils.java,以便在我们的应用程序中轻松处理休眠会话。 同样在同一个包中,我们保留一个常量文件,以保留我们项目中的所有常量。
  5. 现在,我们将添加DAO类,该类将具有与数据库交互的所有方法。
    1. ListgetAllPhotoAlbums()–从数据库返回所有相册的列表
    2. boolean addAlbum(AlbumBO album)–这会将一个专辑添加到数据库
    3. boolean delAlbum(int albumId)–删除相册以及该相册下的所有照片
    4. ListgetAllPhotosFromAlbum(int albumid)–根据相册ID返回相册中的所有照片
    5. boolean addPhotoToAlbum(PhototblBO photo)–将照片对象添加到相册
    6. boolean delPhotoFromAlbum(int photoid)–从相册中删除照片
    7. ListgetPhoto(int photoid)–返回要显示在页面中的照片对象

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><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tctalk_apps_photoalbum</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password"></property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="show_sql">true</property><mapping resource="com/tctalk/apps/album/db/hbm/Album.hbm.xml" /><mapping resource="com/tctalk/apps/album/db/hbm/Phototbl.hbm.xml" /></session-factory>    
</hibernate-configuration>

相册BO.java

package com.tctalk.apps.album.db.businessobjects;
// Generated Apr 22, 2013 1:26:39 PM by Hibernate Tools 3.4.0.CR1import java.util.Date;/*** Album generated by hbm2java*/
public class AlbumBO implements java.io.Serializable {private Integer albumid;private String albumname;private String albumdesc;private Date albumcreatedate;public AlbumBO() {}public AlbumBO(String albumname, String albumdesc, Date albumcreatedate) {this.albumname = albumname;this.albumdesc = albumdesc;this.albumcreatedate = albumcreatedate;}public Integer getAlbumid() {return this.albumid;}public void setAlbumid(Integer albumid) {this.albumid = albumid;}public String getAlbumname() {return this.albumname;}public void setAlbumname(String albumname) {this.albumname = albumname;}public String getAlbumdesc() {return this.albumdesc;}public void setAlbumdesc(String albumdesc) {this.albumdesc = albumdesc;}public Date getAlbumcreatedate() {return this.albumcreatedate;}public void setAlbumcreatedate(Date albumcreatedate) {this.albumcreatedate = albumcreatedate;}}

PhototblBO.java

package com.tctalk.apps.album.db.businessobjects;
// Generated Apr 22, 2013 1:26:39 PM by Hibernate Tools 3.4.0.CR1import java.util.Date;/*** Phototbl generated by hbm2java*/
public class PhototblBO implements java.io.Serializable {private int photoid;private int albumid;private String phototitle;private String photoname;private String imgcontenttype;private Date photocreatedate;private byte[] photodata;public PhototblBO() {}public PhototblBO(int photoid, int albumid, String phototitle,String photoname, String imgcontenttype, Date photocreatedate,byte[] photodata) {this.photoid = photoid;this.albumid = albumid;this.phototitle = phototitle;this.photoname = photoname;this.imgcontenttype = imgcontenttype;this.photocreatedate = photocreatedate;this.photodata = photodata;}public int getPhotoid() {return this.photoid;}public void setPhotoid(int photoid) {this.photoid = photoid;}public int getAlbumid() {return this.albumid;}public void setAlbumid(int albumid) {this.albumid = albumid;}public String getPhototitle() {return this.phototitle;}public void setPhototitle(String phototitle) {this.phototitle = phototitle;}public String getPhotoname() {return this.photoname;}public void setPhotoname(String photoname) {this.photoname = photoname;}public String getImgcontenttype() {return this.imgcontenttype;}public void setImgcontenttype(String imgcontenttype) {this.imgcontenttype = imgcontenttype;}public Date getPhotocreatedate() {return this.photocreatedate;}public void setPhotocreatedate(Date photocreatedate) {this.photocreatedate = photocreatedate;}public byte[] getPhotodata() {return this.photodata;}public void setPhotodata(byte[] photodata) {this.photodata = photodata;}}

Album.hbm.xml

<?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 Apr 22, 2013 1:26:40 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping><class name="com.tctalk.apps.album.db.businessobjects.AlbumBO" table="album" catalog="tctalk_apps_photoalbum"><id name="albumid" type="java.lang.Integer"><column name="albumid" /><generator class="identity" /></id><property name="albumname" type="string"><column name="albumname" length="55" not-null="true" /></property><property name="albumdesc" type="string"><column name="albumdesc" length="65535" not-null="true" /></property><property name="albumcreatedate" type="date"><column name="albumcreatedate" length="10" not-null="true" /></property></class>
</hibernate-mapping>

Phototbl.hbm.xml

<?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 Apr 22, 2013 1:26:40 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping><class name="com.tctalk.apps.album.db.businessobjects.PhototblBO" table="phototbl" catalog="tctalk_apps_photoalbum"><id name="photoid" type="int"><column name="photoid" /><generator class="assigned" /></id><property name="albumid" type="int"><column name="albumid" not-null="true" /></property><property name="phototitle" type="string"><column name="phototitle" not-null="true" /></property><property name="photoname" type="string"><column name="photoname" not-null="true" /></property><property name="imgcontenttype" type="string"><column name="imgcontenttype" not-null="true" /></property><property name="photocreatedate" type="timestamp"><column name="photocreatedate" length="19" not-null="true" /></property><property name="photodata" type="binary"><column name="photodata" not-null="true" /></property></class>
</hibernate-mapping>

HibernateUtils.java

package com.tctalk.apps.album.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(PhotoAlbumConstant._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();}}
}

PhotoAlbumConstant.java

package com.tctalk.apps.album.utils;public interface PhotoAlbumConstant {String _HIBERNATE_CONFIG_LOCATION = "hibernate.cfg.xml";String _HQL_DEL_PHOTOS_ALBUM = "DELETE FROM PhototblBO WHERE albumid= :albumid";	
}

PhotoAlbumAdminDao.java

package com.tctalk.apps.album.db.dao;import java.util.List;import com.tctalk.apps.album.db.businessobjects.AlbumBO;
import com.tctalk.apps.album.db.businessobjects.PhototblBO;public interface PhotoAlbumAdminDao {// Photo Album related operationspublic List<AlbumBO> getAllPhotoAlbums();	public boolean addAlbum(AlbumBO album);public boolean delAlbum(int albumId);//Photo related operationspublic List<PhototblBO> getAllPhotosFromAlbum(int albumid);public boolean addPhotoToAlbum(PhototblBO photo);public boolean delPhotoFromAlbum(int photoid);public List<PhototblBO> getPhoto(int photoid);
}

PhotoAlbumAdminDaoImpl.java

package com.tctalk.apps.album.db.dao;import java.util.Date;
import java.util.List;import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;import com.tctalk.apps.album.db.businessobjects.AlbumBO;
import com.tctalk.apps.album.db.businessobjects.PhototblBO;
import com.tctalk.apps.album.utils.HibernateUtils;
import com.tctalk.apps.album.utils.PhotoAlbumConstant;public class PhotoAlbumAdminDaoImpl implements PhotoAlbumAdminDao, PhotoAlbumConstant {/*** The below methods will be used for handling the Photo album related* operations* *//*** This function retrieves all the photo albums and send the list to the* front end*/public List<AlbumBO> getAllPhotoAlbums() {List<AlbumBO> albumList = null;Session hbmSession = null;try {hbmSession = HibernateUtils.getSession();Criteria criteria = hbmSession.createCriteria(AlbumBO.class);albumList = criteria.list();} catch (Exception ex) {ex.printStackTrace();} finally {HibernateUtils.closeSession(hbmSession);}return albumList;}/*** This function adds one photo album to the database*/public boolean addAlbum(AlbumBO album) {Session hbmSession = null;boolean STATUS_FLAG = true;try {hbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();// change the creation date to today's date in the album objectalbum.setAlbumcreatedate(new Date());// add the album to the hibernate session to savehbmSession.save(album);hbmSession.getTransaction().commit();} catch (Exception ex) {hbmSession.getTransaction().rollback();ex.printStackTrace();STATUS_FLAG = false;} finally {HibernateUtils.closeSession(hbmSession);}return STATUS_FLAG;}/*** This function deletes the photoalbum based on the album id. It first* check if the album has any photos or not. If the album is not emptry then* it deletes the photos first and then delete the album itself*/public boolean delAlbum(int albumId) {Session hbmSession = null;boolean STATUS_FLAG = true;try {// get the hibernate session to perform delete operationhbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();//delete all photos from the Photo table correspond to the album idQuery query = hbmSession.createQuery(_HQL_DEL_PHOTOS_ALBUM);query.setInteger("albumid", new Integer(albumId));int rowCount = query.executeUpdate();System.out.println("Rows affected: " + rowCount);//now load the album object from Album table and delete it correspond to the album idAlbumBO albumObj = (AlbumBO) hbmSession.load(AlbumBO.class, albumId);hbmSession.delete(albumObj);hbmSession.getTransaction().commit();} catch (Exception ex) {hbmSession.getTransaction().rollback();ex.printStackTrace();STATUS_FLAG = false;} finally {HibernateUtils.closeSession(hbmSession);}return STATUS_FLAG;}/*** The below functions will be helpful to work on the Photos in the photo* album*//*** This function retrieves all the photos and send the list to the front end*/public List<PhototblBO> getAllPhotosFromAlbum(int albumid) {List<PhototblBO> photoList = null;Session hbmSession = null;Criteria criteria = null;try {hbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();// retrieve all photos from photo table correspond to the album Idcriteria = hbmSession.createCriteria(PhototblBO.class).add(Restrictions.eq("albumid", albumid));photoList = criteria.list();} catch (Exception ex) {ex.printStackTrace();} finally {HibernateUtils.closeSession(hbmSession);}return photoList;}/*** This function adds photo to the album*/public boolean addPhotoToAlbum(PhototblBO photoobj) {Session hbmSession = null;boolean STATUS_FLAG = true;try {hbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();hbmSession.save(photoobj);hbmSession.getTransaction().commit();} catch (Exception ex) {hbmSession.getTransaction().rollback();ex.printStackTrace();STATUS_FLAG = false;} finally {HibernateUtils.closeSession(hbmSession);}return STATUS_FLAG;}/*** This function deletes the photo from the album itself*/public boolean delPhotoFromAlbum(int photoid) {Session hbmSession = null;boolean STATUS_FLAG = true;try {// get the hibernate session to perform delete operationhbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();PhototblBO photoobj = (PhototblBO) hbmSession.load(PhototblBO.class, photoid);hbmSession.delete(photoobj);hbmSession.getTransaction().commit();} catch (Exception ex) {hbmSession.getTransaction().rollback();ex.printStackTrace();STATUS_FLAG = false;} finally {HibernateUtils.closeSession(hbmSession);}return STATUS_FLAG;}/*** This function returns the photo object itself*/public List<PhototblBO> getPhoto(int photoid) {List<PhototblBO> photoList = null;Session hbmSession = null;Criteria criteria = null;try {hbmSession = HibernateUtils.getSession();hbmSession.beginTransaction();// retrieve all photos from photo table correspond to the album Idcriteria = hbmSession.createCriteria(PhototblBO.class).add(Restrictions.eq("photoid", photoid));photoList = criteria.list();} catch (Exception ex) {ex.printStackTrace();} finally {HibernateUtils.closeSession(hbmSession);}return photoList;}}

步骤6:开发UI部分

创建“ admin”文件夹,以保留所有与管理员相关的UI文件。 尽管我们的应用程序中没有CSS或JavaScript文件,但我们仍将创建文件夹作为占位符。 我们将添加两个jsp文件– showalbums.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 Photo Album App</title>
</head>
<body>
<h2>:: TechcubeTalk.com - Personal Photo Album Admin Panel ::</h2>
<div style="margin-bottom: 25px;">
<s:form action="addAlbumAdmn" method="POST"><s:textfield label="Photo Album Name/Title" name="album.albumname"/><s:textfield label="Optional Brief Description" name="album.albumdesc"/><br/>	<s:submit value="Create Photo Album" align="center"/>
</s:form>
<hr/>
</div>
<div><table style="border: 1px dotted black;"><tr><th style="background-color:#ABDCFF;" align="center"> Album Id </th><th style="background-color:#ABDCFF;" align="center"> Photo Album Title </th><th style="background-color:#ABDCFF;" align="center"> Brief Description </th><th style="background-color:#ABDCFF;" align="center"> Created On </th><th style="background-color:#ABDCFF;" align="center"> Delete? </th><th style="background-color:#ABDCFF;" align="center"> View Photos in Album </th></tr><s:iterator value="albumList" var="album"><tr><td align="center"><s:property value="albumid"/></td><td align="center"><s:property value="albumname"/></td><td align="center"><s:property value="albumdesc"/></td><td align="center"><s:property value="albumcreatedate"/></td><td align="center"> <a href="delAlbumAdmn.action?albumid=<s:property value="albumid"/>">Delete</a> </td><td align="center"> <a href="listPhotosByAlbumAdmn.action?albumid=<s:property value="albumid"/>">Click to View</a> </td></tr></s:iterator></table>
</div>
</body>
</html>

showphotos.jsp –此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 Photo Album Admin Panel ::</h2>
<div style="margin-bottom: 25px;">
<s:form action="addPhotoAcion" namespace="/" method="POST" enctype="multipart/form-data">
<s:textfield label="Photo Title" name="photoTitle"/>
<s:file name="fileUpload" label="Select a File to upload" size="40" />
<s:hidden name="albumid" value="%{albumid}" /><s:submit value="Upload Photo to Album" name="submit" />
</s:form></div>
<div> <a href="listAlbumAdmn.action"><< Back to Albums</a></div>
<div><table style="border: 1px dotted black;"><tr><th style="background-color:#ABDCFF;">Photo Id</th><th style="background-color:#ABDCFF;">Photo Title</th><th style="background-color:#ABDCFF;">Upload Date</th><th style="background-color:#ABDCFF;">View Photo</th><th style="background-color:#ABDCFF;">Delete Photo</th></tr><s:iterator value="photoList" var="photo"><tr><td><s:property value="photoid"/></td><td><s:property value="phototitle"/></td><td><s:property value="photocreatedate"/></td><td><a href="showPhotoAction.action?photoid=<s:property value="photoid"/>" target="_blank">View</a></td><td><a href="delPhotoFrmAlbumAdmn.action?albumid=<s:property value="albumid"/>&photoid=<s:property value="photoid"/>">Delete</a></td></tr></s:iterator></table>
</div>
</body>
</html>

步骤7:添加动作类和自定义结果类

PhotoAlbumAdminAction扩展了POJO PhotoAlbumForm.java,以保存UI页面的提交表单字段和其他值。 我们使用一种自定义结果来显示照片,方法是从BLOB字段数据库中将其作为二进制文件获取。

PhotoAlbumAdminAction.java

package com.tctalk.apps.album.web.actions;import java.io.IOException;
import java.util.Date;
import java.util.List;import org.apache.commons.io.FileUtils;import com.tctalk.apps.album.db.businessobjects.AlbumBO;
import com.tctalk.apps.album.db.businessobjects.PhototblBO;
import com.tctalk.apps.album.web.delegates.PhotoAlbumAdminDelegate;
import com.tctalk.apps.album.web.forms.PhotoAlbumForm;public class PhotoAlbumAdminAction extends PhotoAlbumForm {private static final long serialVersionUID = 9168149105719285096L;private PhotoAlbumAdminDelegate delegate = new PhotoAlbumAdminDelegate();public String getAllAlbumList() {List<AlbumBO> albumList = delegate.getAllPhotoAlbums();String returnString = ERROR;if (albumList != null) {setAlbumList(albumList);returnString = SUCCESS;}return returnString;}public String addAlbumToCollection() {String returnString = ERROR;AlbumBO album = getAlbum();if (delegate.addAlbumToCollection(album)) {returnString = SUCCESS;}return returnString;}public String delAlbumFromCollection() {String returnString = ERROR;int albumId = getAlbumid();if (delegate.delAlbumFromCollection(albumId)) {returnString = SUCCESS;}return returnString;}public String listAllPhotos() {List<PhototblBO> photoList = delegate.getAllPhotos(this.getAlbumid());String returnString = ERROR;if (photoList != null) {this.setPhotoList(photoList);returnString = SUCCESS;}return returnString;}public String uploadPhotoToAlbum() {String returnString = ERROR;PhototblBO photoBO = new PhototblBO();// set the uploaded file meta data to the PhototblBO object before// saving to databasephotoBO.setAlbumid(getAlbumid());photoBO.setPhotocreatedate(new Date());photoBO.setImgcontenttype(getFileUploadContentType());photoBO.setPhotoname(getFileUploadFileName());photoBO.setPhototitle(getPhotoTitle());try {// the uploaded file is in File format so we need to convert to// byte[] array for storing in our database. For this apache //common file utility class is used below.photoBO.setPhotodata(FileUtils.readFileToByteArray(getFileUpload()));} catch (IOException e) {e.printStackTrace();}setPhotobo(photoBO);setAlbumid(photoBO.getAlbumid());if (delegate.addAPhoto(getPhotobo())) {returnString = SUCCESS;}return returnString;}public String delPhoto() {String returnString = ERROR;int photoId = getPhotoid();if (delegate.delPhoto(photoId)) {returnString = SUCCESS;}return returnString;}public String showPhoto() {String returnString = ERROR;List<PhototblBO> photoList = delegate.getPhoto(this.getPhotoid());if (photoList != null) {PhototblBO photoBO = (PhototblBO)photoList.get(0);if(photoBO != null){setPhotobo(photoBO);returnString = SUCCESS;}}return returnString;}}

PhotoAlbumForm.java

package com.tctalk.apps.album.web.forms;import java.io.File;
import java.util.List;import com.opensymphony.xwork2.ActionSupport;
import com.tctalk.apps.album.db.businessobjects.AlbumBO;
import com.tctalk.apps.album.db.businessobjects.PhototblBO;public class PhotoAlbumForm extends ActionSupport{private static final long 	serialVersionUID 		 = 706337856877546963L;private List<AlbumBO> 		albumList 				 = null;private List<PhototblBO> 	photoList 				 = null;private AlbumBO 			album					 = null;private PhototblBO 			photobo					 = null;private File 				fileUpload;private String 				fileUploadContentType;private String 				fileUploadFileName;private String 				photoTitle;private int 				photoid;private int 				albumid;public String getFileUploadContentType() {return fileUploadContentType;}public void setFileUploadContentType(String fileUploadContentType) {this.fileUploadContentType = fileUploadContentType;}public String getFileUploadFileName() {return fileUploadFileName;}public void setFileUploadFileName(String fileUploadFileName) {this.fileUploadFileName = fileUploadFileName;}public File getFileUpload() {return fileUpload;}public void setFileUpload(File fileUpload) {this.fileUpload = fileUpload;}public String getPhotoTitle() {return photoTitle;}public void setPhotoTitle(String photoTitle) {this.photoTitle = photoTitle;}public List<AlbumBO> getAlbumList() {return albumList;}public void setAlbumList(List<AlbumBO> albumList) {this.albumList = albumList;}public List<PhototblBO> getPhotoList() {return photoList;}public void setPhotoList(List<PhototblBO> photoList) {this.photoList = photoList;}public AlbumBO getAlbum() {return album;}public void setAlbum(AlbumBO album) {this.album = album;}public PhototblBO getPhotobo() {return photobo;}public void setPhotobo(PhototblBO photobo) {this.photobo = photobo;}public int getPhotoid() {return photoid;}public void setPhotoid(int photoid) {this.photoid = photoid;}public int getAlbumid() {return albumid;}public void setAlbumid(int albumid) {this.albumid = albumid;}
}

CustomPhotoResult.java

package com.tctalk.apps.album.web.actions;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;public class CustomPhotoResult implements Result {private static final long serialVersionUID = 1L;public void execute(ActionInvocation invocation) throws Exception {PhotoAlbumAdminAction action = (PhotoAlbumAdminAction) invocation.getAction();HttpServletResponse response = ServletActionContext.getResponse();response.setContentType(action.getPhotobo().getImgcontenttype());response.setHeader("Content-Disposition", "inline; filename=\""	+ action.getPhotobo().getPhotoname() + "\"");response.setHeader("cache-control", "no-cache");response.getOutputStream().write(action.getPhotobo().getPhotodata());response.getOutputStream().flush();response.getOutputStream().close();}
}

步骤8:添加委托类

委托类充当Struts2表示层和使用Hibernate开发的业务层之间的桥梁。

PhotoAlbumAdminDelegate.java

package com.tctalk.apps.album.web.delegates;import java.util.List;import com.tctalk.apps.album.db.businessobjects.AlbumBO;
import com.tctalk.apps.album.db.businessobjects.PhototblBO;
import com.tctalk.apps.album.db.dao.PhotoAlbumAdminDao;
import com.tctalk.apps.album.db.dao.PhotoAlbumAdminDaoImpl;public class PhotoAlbumAdminDelegate {PhotoAlbumAdminDao admindao = (PhotoAlbumAdminDao) new PhotoAlbumAdminDaoImpl();// Photo Album related functionspublic List<AlbumBO> getAllPhotoAlbums() {return admindao.getAllPhotoAlbums();}public boolean addAlbumToCollection(AlbumBO album) {return admindao.addAlbum(album);}public boolean delAlbumFromCollection(int albumId) {return admindao.delAlbum(albumId);}//Only Photo related functionspublic List<PhototblBO> getAllPhotos(int albumId) {return admindao.getAllPhotosFromAlbum(albumId);}public boolean addAPhoto(PhototblBO photo) {return admindao.addPhotoToAlbum(photo);}public boolean delPhoto(int photoid) {return admindao.delPhotoFromAlbum(photoid);}public List<PhototblBO> getPhoto(int photoid) {return admindao.getPhoto(photoid);}
}

步骤9:最终整合

整个项目结构将类似于以下内容:

image005

在struts.xml文件中,当我们从一个动作重定向到另一个动作时,我们需要传递相册ID。 例如,将照片上传到数据库后,您需要重定向回到该相册下的所有照片列表。 因此,添加照片后,我们还需要发回相册。 为此,我们在struts.xml中使用$ {albumid}来传递POJO表单中的相册。

项目完成后,从eclipse生成WAR文件。 为此,请右键单击项目,然后选择导出-> WAR文件以创建WAR文件并在Tomcat中进行部署。

如果您的部署成功,并且Tomcat控制台中没有错误消息(忽略任何警告,例如LOG4J等),则启动浏览器并输入URL – http:// localhost:8080 / PersonalPhotoAlbumApp / admin.action

这将调用管理面板,并且将显示类别列表(第一次将不会显示结果,因此继续添加一个相册)。

image007

选择“单击以查看”进入“照片”页面,您可以在该页面中上传照片或查看上传的照片。

image009

今天就这些。 在第二部分中,我将开发前端面板,该面板将使用jQuery,Struts2和Hibernate显示相册以及该相册中的照片。

下载源文件:

我已经在上述步骤中提供了所有源代码。 eclipse项目(带有jar)和WAR文件上传到GitHub存储库中。

参考: 使用Struts2,Hibernate和MySQL BLOB开发个人迷你照片库应用程序–来自我们JCG合作伙伴 Suvoraj Biswas的第1部分 ,在TechCubeTalk博客上。

翻译自: https://www.javacodegeeks.com/2013/10/developing-a-personal-mini-photo-gallery-application-using-struts2-hibernate-and-mysql-blob-part-1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Activity并行网关和排他网关

说一说activiti中的排他网关和并行网关 activiti工作流中我们经常用到的网关有两种&#xff1a; 1. Exclusive Gateway 排他网关 排他网关.png 排他网关&#xff08;也叫异或&#xff08;XOR&#xff09;网关&#xff0c;或更技术性的叫法 基于数据的排他网关&#xff09;&…

ValueError: too many values to unpack

Error msg: 执行: python manage,py makemigrations 报错:Value: too many values to unpack 问题: django第一次数据库迁移之后, apps中的model位置改变了, 导致之前生成的迁移文件检测不到原来的位置 解决: 删除所有的迁移文件重新迁移, 或者将之前的迁移文件的路径修改正确 …

安徽省计算机二级考试vfp试题,安徽省计算机二级VFP考试理论模拟试题附答案

《安徽省计算机二级VFP考试理论模拟试题附答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《安徽省计算机二级VFP考试理论模拟试题附答案(19页珍藏版)》请在人人文库网上搜索。1、一、单项选择题(每题1分&#xff0c;共40分) 1. 计算机能够自动工作&#xff0c;主…

你不懂js系列学习笔记-异步与性能- 02

第二章&#xff1a;回调 原文&#xff1a;You-Dont-Know-JS 主要理解 “回调地狱&#xff08;callback hell&#xff09;”痛苦的点到底是哪&#xff0c;以及尝试拯救回调。 1. 首先从实际生活中模拟 我相信大多数读者都曾经听某个人说过&#xff08;甚至你自己就曾这么说&…

c# 计算空格宽度像素_关于C#中换算像素和毫米的说明

在C#中是以像素作为尺寸单位的&#xff0c;像素是一种相对的尺寸概念&#xff0c;与毫米的转换跟当前显示器的分辨率有关&#xff0c;在不同分辨率下转换的系数也不同。借助C#中的GDI可以实现像素与毫米的换算&#xff1a;一、根据Win32 API定义函数获取显示器设备信息&#xf…

使用Apache Commons Net SMTP以Java(和Android)发送邮件:STARTTLS,SSL

最近我正在做一个Android实验&#xff0c;我想使用SMTP服务器通过android应用程序通过身份验证和加密来发送电子邮件。 好吧&#xff0c; 我发现Android上的javax.mail并不是一个很好的选择 &#xff0c;因为它取决于awt类&#xff08;我猜是传统&#xff09;&#xff1b; 有些…

列名无效

数据库增加新&#xff0c;视图没有更新转载于:https://www.cnblogs.com/Neil-Peng/p/9283355.html

天津天河计算机技术有限公司,“天河一号”超级计算机落户天津,命名为“天河”,取天津与“银河团队...

注意问题&#xff1a;一、对语句排序试题一般应注意以下几个问题&#xff1a;1.揣摩语段的整体意义&#xff0c;理清选项内容所提供的信息和表达内容的主旨。2.分析选项内容与整体语段的语境联系。3.进行对比分析&#xff0c;排除干扰项。该类试题几个选项在语句的数量或内容上…

tan和cot的梗_cot和tan的关系

各位家长好&#xff0c;我是51学霸(51xueba.cn)专栏作者&#xff0c;甜老师全文共计521字&#xff0c;建议阅读2分钟cot和tan的关联&#xff1a;tanαcotα1。在三角函数中&#xff0c;cotθcosθ/sinθ&#xff0c;当θ≠kπ&#xff0c;k∈Z时&#xff0c;cotθ1/tanθ&#…

基于 Webpack2、Vue2、iView2 的可视化脚手架 iView Cli 发布 2.0 版本

谷歌今天发布了一系列“性感”的软件&#xff0c;我们也发布了一款大家期待已久的开发者工具&#xff0c;同样很性感 &#xff1a;) iView 2.0 已经发布有两个月了&#xff0c;在 2.0 发布后&#xff0c;npm 下载量、issues 数量都提升了很多&#xff08;可以 watch 下项目&…

在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合

请查看我在Karaf的OSGi中构建普通CXF服务&#xff08;不使用Camel&#xff09;的其他文章 。 这是有关如何 创建一个CXF REST服务 使用骆驼多播&#xff08;并并行化&#xff09;传入的请求 来自两个不同服务的源数据 汇总响应并 最后将合并结果作为JSON返回给最终用户。…

Myeclipse debug时出现跳行问题的解决

1.删除Myeclipse中部署的类似的重复项目&#xff08;例如将测试项目中的代码包直接复制粘贴到另一个项目中&#xff09;。 2.project->clean 3.删除服务器中部署的项目并重新部署。 4.开启debug模式&#xff0c;问题解决。转载于:https://www.cnblogs.com/abortre/p/9999323…

2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段

原标题&#xff1a;快速突破2017年计算机三级考试的几大复习阶段为某种原因&#xff0c;本人共考过2次笔试&#xff0c;3次上机。其中笔试在70左右&#xff0c;3次上机均为满分&#xff0c;看着大批的同学在为三级发愁不知道如何准备和应考。我想我应该把经验和学习的方法写下来…

cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...

导 读北京54坐标和西安80坐标&#xff0c;使用了很多年&#xff0c;为何要统一成CGCS2000坐标&#xff1f;启用CGCS2000坐标有何重大意义&#xff1f;概述北京54坐标系和西安1980坐标系的建立极大的促进了新中国测绘的发展,然而随着空间大地测量技术的兴起,这两种经典的局部大地…

Amazon Elastic Map Reduce使用Apache Mahout计算建议

Apache Mahout是一个“可扩展的机器学习库”&#xff0c;其中包含各种单节点和分布式推荐算法的实现。 在我的上一篇博客文章中&#xff0c; 我描述了如何在单个节点上实现在线推荐系统来处理数据。 如果数据太大而无法放入内存&#xff08;> 100M首选项数据点&#xff09;怎…

基于element-ui实现table可配置化

写在前面 感谢 饿了么前端团队提供组件化框架elememt-ui&#xff0c;本文基础组件使用element-ui。 大背景 在开发一些系统过程中&#xff0c;使用table作数据展示在所难免。先来看看el-table组件。 非常简单易用的组件&#xff0c;根据提供的data数据&#xff0c;配置table…

一种思路,隐藏input标签,通过label关联

一种思路&#xff0c;隐藏input标签&#xff0c;通过label关联 <label class"btn btn-default btn-file">上传图片 <input hidden type"file" class"btn btn-default"></label>posted on 2018-07-09 16:59 .Tang 阅读(...)…

微信小程序 反编译

反编译处于技术学习角度&#xff0c;瞻仰大神代码。 使用工具 node mumu安卓模拟器获取小程序文件 小程序的代码压缩之后 会形成一个后缀为 wxapkg 的文件&#xff0c;下载到微信客户端打开mumu模拟器&#xff0c;安装微信登录之后&#xff0c;打开步步换小程序 &#xff0c;这…

麟龙指标通达信指标公式源码_通达信指标公式源码波段极限副图源码

做价值的传播者&#xff0c;一路同行&#xff0c;一起成长问题&#xff1a;怎样才能每天都收到这类文章&#xff01;答案&#xff1a;只需点击上方《通达信公式指标》{买卖公式}AA:(2*CHIGHLOW)/4;BB:AA-REF(C,12);CC:EMA(BB,13);DD:EMA(CC,2);EE:EMA(BB,34);FF:EMA(BB,55);GG:…

计算机系统备份的原则和策略,计算机系统数据备份机制与策略

计算机系统数据备份机制与策略20年第5 05期华中电力第 l卷 8计算机系统数据备份机制与策略耿煜(樊学院机械系&#xff0c;北襄樊襄湖 4 15 ) 4 03摘要&#xff1a;针对当今计算环境中不断增长的数据量&#xff0c;系统地分析、论述了完整的数据备份机制&#xff0c;出了相应的策…