使用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,一经查实,立即删除!

相关文章

基于 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返回给最终用户。…

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…

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

做价值的传播者&#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;出了相应的策…

[译] 帮助你成为一名成功的 Web 开发工程师的 21 步

前言 随着 Web 开发的蓬勃发展&#xff0c;许多人都在问这样一个问题&#xff1a;我如何才能成为一名 Web 开发者&#xff1f;我认为这个问题不应该这样问&#xff0c;而应该是&#xff1a;我如何才能成为一名成功的 Web 开发者&#xff1f;这样的问题是很有必要的&#xff0c;…

循环卷积和周期卷积的关系_基于单口RAM读写的卷积电路(下)

这是迟到很久的卷积电路verilog设计的下篇。。。你看我还有机会吗。。。上回我们给出系统的层次结构、卷积计算模块以及用于数据缓存的fifo模块&#xff0c;今天我们首先回顾一下上一次的关键内容。系统结构回顾RTL代码文件可以分为结构如下所示 ~|--top_conv_tb.v|--top_conv.…

浅析 PHP 中的 Generator

浅析 PHP 中的 Generator Miss Wang php开发案例 前天 何为 Generator 从 PHP 5.5 开始&#xff0c;PHP 加入了一个新的特性&#xff0c;那就是 Generator&#xff0c;中文译为生成器。生成器可以简单地用来实现对象的迭代&#xff0c;让我们先从官方的一个小例子说起。 xrange…

注意安全!XSS 和 XSRF

[Tips] 本文是从 jianshu 平台重新修改编辑后移植来的&#xff0c;比上一版本做了些修订。 最近在看一些关于网络安全的问题&#xff0c;当然许多是跟前端相关的&#xff0c;包括且不局限于xss和xsrf 了&#xff0c;那么小编就结合最近的学习实践谈一些粗浅的认识。&#xff08…

go分析和kegg分析_干货预警:3分钟搞定GO/KEGG功能富集分析(2)

在 3分钟了解GO/KEGG功能富集分析 一文中给大家讲解了GO和KEGG的基本概念和内涵,并且给大家介绍了DAVID这一神奇网站。今天我们就把GO/KEGG功能富集分析的详细教程按部就班地呈现给大家,有请小猎豹。 多图预警,轻点图片,查看高清大图 1 Step1: 打开DAVID官网:https://dav…

如何在本地开发环境调试微信 JS-SDK

以下篇幅将会描述不同前提下对应的调试策略&#xff0c;当然也有可能不是最优解&#xff0c;望斧正 →_→ 前言 何谓「安全域名限制」&#xff1f; 以微信 JS-SDK 的使用为例&#xff0c;每个公众号被限制最多可设置三个安全域名&#xff0c;且必须能被腾讯服务器所验证&#…

云南省农村信用社计算机岗位待遇如何,云南农村信用社薪资待遇如何?

在云南如果去存钱&#xff0c;相信大多数人都会把自己的小钱钱存在农村信用社而不是XX银行。在这一块风景秀丽&#xff0c;人美山美水美的地方&#xff0c;就金融行业来说云南农村信用社要是说自己差&#xff0c;那基本没有谁敢说自己做的好。所以在云南农信社这家企业里做一名…

小票上为啥指甲能划出印_指甲上出现竖纹,除遗传问题,或是身体在向你拉警报了,别忽视...

生活中常见女生给指甲抹上各种不同的颜色来让它变得美美的&#xff0c;指甲起着修饰人的形象的作用。而指甲的状况也能折射出身体的健康状态如何。每个人的指甲形态不一&#xff0c;有的润滑饱满&#xff0c;光滑平整&#xff0c;有月牙&#xff1b;有的坑坑洼洼&#xff0c;凸…

require.context

带表达式的 require 语句 如果你的 require参数含有表达式(expressions)&#xff0c;会创建一个上下文(context)&#xff0c;因为在编译时(compile time)并不清楚具体是哪一个模块被导入 require("./template/" name ".ejs");webpack 解析 require() 的…

使用JSF 2.2功能来开发可滚动,可延迟加载的Ajax数据表

这次&#xff0c;我想与您分享我最近从JSF 2.2功能中学到的知识。 为此&#xff0c;我决定创建一个简单的ajax&#xff0c;可滚动的延迟加载数据表。 请注意&#xff0c; 绝不这是相当大的库如Primefaces &#xff0c; RichFaces的或ICEFaces的 。 这只是为了告诉您我学到了什…

如何监视ps/查询的性能和使用

可以使用“查询管理”页面监视查询性能和使用情况。您可以获得的一些统计信息包括平均运行时、运行次数和上次运行日期。使用预定义的搜索&#xff0c;还可以选择要检查和报告的查询。查询管理还允许您取消当前在查询管理器和查询查看器中运行的查询&#xff0c;以及启用和禁用…

金融计算机怎么调成链式,FRM金融计算器使用方法

2020FRM考试计算器&#xff1a;想一想FRM一级考试基本上按计算器停不下来&#xff0c;我们就一定要买一个简单易操作的计算器&#xff0c;但是GARP对于FRM考生所使用的计算器是有规定的&#xff1a;所有参加FRM考试的考生必须使用GARP指定的计算器&#xff0c;如果考生在考试期…

参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

本文主要分享火焰图使用技巧&#xff0c;介绍 systemtap 的原理机制&#xff0c;如何使用火焰图快速定位性能问题原因&#xff0c;同时加深对 systemtap 的理解。让我们回想一下&#xff0c;曾经作为编程新手的我们是如何调优程序的&#xff1f;通常是在没有数据的情况下依靠主…