如何使用Struts2

时间:2015-04-22 10:04:51

标签: java image hibernate jsp struts2

我正在尝试使用Struts2在JSP中显示字节数组图像。 首先,图像上传如下:

saveImage.jsp

<s:form action="saveImage" enctype="multipart/form-data" method="POST">
   <s:file name="file"/>
</s:form>

struts.xml中

<action name="saveImage" class="com.actions.ImageAction" method="save">
        <result name="success" type="redirect">listImages</result>
</action>
<action name="listImages" class="com.actions.ImageAction" method="list">
        <result name="success">listImages.jsp</result>
</action>

ImageAction.class

public class ImageAction extends ActionSupport  implements ModelDriven<Image> {

    private Image = new Image();
    private File file;
    private List<Image> imageList = new ArrayList<>();

    public Image getImage() {
       return image;
    }
    public void setImage(Image image) {
       this.image = image;
    } 
    public File getFile() {
            return file;
    } 
    public List<Image> getImageList() {
        return imageList;
    }

    public void setImageList(List<Image> imageList) {
        this.imageList = imageList;
    }

Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);

Session session = null;

    @SkipValidation
    public String save() {
        try {
             session = sessionFactory.openSession();
             session.beginTransaction();

            byte[] byteFile = new byte[(int) file.length()];
                try {
                    FileInputStream fs = new FileInputStream(file);
                    fs.read(byteFile);
                    fs.close();
                } catch (Exception e) {}
            image.setImageData(byteFile);

             session.saveOrUpdate(image);
             session.getTransaction().commit()
        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }
        return SUCCESS;
    }

    @SkipValidation
    public String list() {
        try {
            session = sessionFactory.openSession();
            session.beginTransaction();
            imageList = session.createQuery("from Image").list();
            session.getTransaction().commit();
        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }
        return SUCCESS;
    }

@Override
public Image getModel() {
    return image;
}

}

Image对象具有 byte [] imageData 属性,并使用Hibernate保存到DB。 现在,在成功将图像字节数组保存到DB后,Struts调用 listImages 操作,该操作在 listImages.jsp 中显示数据库中的现有图像列表。

listImages.jsp

     <s:if test="imageList.size() > 0">
       <ul>
        <s:iterator value="imageList">
         <li><s:property value="imageData" /></li>
        </s:iterator>
       </ul>
     </s:if>

使用这个“property”标签只显示一些与图像字节数组相关的字符串,例如“[B @ 2eeb2d23”。我的问题是:如何显示可点击的缩略图甚至是URL而不是该字符串?然后,当我单击缩略图或URL时,显示完整大小的图像。我尝试了很多不同的方法,但没有一种方法有效。也许这是我在上传文件或将其保存在数据库上时做错了...请提供一个有效的解决方案。感谢。

2 个答案:

答案 0 :(得分:1)

在HTML中,图像和其他资源不是HTML页面的一部分,而是由它引用。

因此,您的HTML需要<img src="[URL TO THE IMAGE]"/>,而您的JSP将类似于

<s:iterator value="imageList">
  <img src="[DOWNLOAD_URL]?id=${imageId}"/>
</s:iterator>

其中DOWNLOAD_URL将指向基于其ID提供图像数据的HttpServlet

答案 1 :(得分:0)

使用此解决方案找到部分解决方法:http://java.dzone.com/articles/struts2-tutorial-part-67

所以基本上我不再将图像的字节数组保存到DB了。通过struts上传图像时,我只将图像的文件名保存到DB中,然后复制图像(因为临时图像将在上传操作结束后立即删除)并将副本保存在服务器上,如下所述上面提供的教程。然后,为了显示某个图像,我从DB查询它的名字,然后在我第一次将它复制到服务器上时从我复制它的位置检索它。感谢SJuan76的暗示。