jjzjj

mysql - 如何使用 Hibernate 在 Struts 2 中的 mySql DB 的 jsp 页面中显示图像(blob 类型)

coder 2023-10-25 原文

我面临一个问题,如何使用 Hibernate 在 Struts 2 中的 mySql DB 的 jsp 页面中显示图像(blob 类型)?请分享您的观点。提前致谢。

    public byte[] getrepImagechange2(int loginid) {

    Criteria criteria = null;
    byte[] repCurrentImage = null;

    try {
        session = sessionFactory.openSession();
        criteria = session.createCriteria(Membersdetails.class).add(Expression.eq("logintable.loginId", loginid));
        List list = criteria.list();
        Iterator itr = list.iterator();
        if (itr.hasNext()) {

            Membersdetails get = (Membersdetails) itr.next();
            repCurrentImage = get.getRepPicture();

            HttpServletResponse response23 = ServletActionContext.getResponse();
            response23.setContentType("image/jpg");
            OutputStream out = response23.getOutputStream();
            out.write(repCurrentImage);
            out.close();

        }
    } catch (Exception e) {
        System.out.println("Exception in getrepImage() :" + e);
    } finally {
        try {

            session.flush();
            session.close();
        } catch (Exception e) {
            System.out.println("Exception in getrepImage resource closing  :" + e);
        }
    }
    return repCurrentImage;
}
  And I am displaying this image in jsp page in a table cell using this code :                     
   <img src="<s:property value="bs"/>" 

最佳答案

我使用以下内容从 JPA(Hibernate Backed)渲染图像,示例使用 struts2-conventions-plugin,在结果类型注释中“stream”是 View 的全部内容:

package com.kenmcwilliams.photogallery.action.gallery;

import com.kenmcwilliams.photogallery.orm.Picture;
import com.kenmcwilliams.photogallery.orm.PictureDetails;
import com.kenmcwilliams.photogallery.service.Gallery;
import com.opensymphony.xwork2.ActionSupport;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;

@Result(type = "stream", params = {
    "contentType", "${contentType}",
    "contentLength", "${contentLength}",
    "contentDisposition", "${contentDisposition}",
    "inputStream", "${inputName}",
    "bufferSize", "${bufferSize}",
    "allowCaching", "${allowCaching}"
})
public class Stream extends ActionSupport {
    @Autowired private Gallery gallery; 
    private String contentType = "text/plain";
    private int contentLength = 0;
    private String contentDisposition = "inline";
    private InputStream inputStream;
    public String inputName = "inputStream";//This should not be required
    private Integer bufferSize = 1024;
    private String allowCaching = "true";
    private Integer id = null;

    @Override
    public String execute() {
        if (id != null){
            //gallery.get
            PictureDetails details = gallery.getPictureDetails(id);
            Picture photo = details.getPictureId();
            this.contentType = details.getContentType();
            System.out.println("Content Type: " + contentType);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(photo.getPicture());
            this.contentLength = photo.getPicture().length;
            System.out.println("Content Length: " + contentLength);
            this.inputStream = byteArrayInputStream;
        }else{
            return ERROR;
        }
        return SUCCESS;
    }

    /**
     * @return the contentType
     */
    public String getContentType() {
        return contentType;
    }

    /**
     * @param contentType the contentType to set
     */
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    /**
     * @return the contentLength
     */
    public int getContentLength() {
        return contentLength;
    }

    /**
     * @param contentLength the contentLength to set
     */
    public void setContentLength(int contentLength) {
        this.contentLength = contentLength;
    }

    /**
     * @return the contentDisposition
     */
    public String getContentDisposition() {
        return contentDisposition;
    }

    /**
     * @param contentDisposition the contentDisposition to set
     */
    public void setContentDisposition(String contentDisposition) {
        this.contentDisposition = contentDisposition;
    }

    /**
     * @return the bufferSize
     */
    public int getBufferSize() {
        return bufferSize;
    }

    /**
     * @return the allowCaching
     */
    public String getAllowCaching() {
        return allowCaching;
    }

    /**
     * @param allowCaching the allowCaching to set
     */
    public void setAllowCaching(String allowCaching) {
        this.allowCaching = allowCaching;
    }

    /**
     * @return the inputStream
     */
    public InputStream getInputStream() {
        return inputStream;
    }

    /**
     * @param inputStream the inputStream to set
     */
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
}

您还询问了如何显示上面的内容,下面是一个用于显示图片库的 JSP(因此该操作将为该 JSP 提供图像 ID,上面的操作将使用这些图像 ID 从数据库中获取图片,并且画廊的标题)。

如果我没记错的话,这个图库显示了四张图片,每行的行数足以显示所有图片。

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1><s:property value="photoGallery.name"/></h1>
        <table>
            <s:iterator begin="0" end="pictureDetails.size/4" var="row">
                <tr>
                    <s:subset source="pictureDetails" start="4 * #row" count="4">
                        <s:iterator>
                            <s:url forceAddSchemeHostAndPort="true" namespace="/gallery" action="stream" var="streamURL">
                                <s:param name="id" value="id"/>
                            </s:url>
                            <td>
                                <s:a value="%{#streamURL}"><img width="200px" src="<s:property value="#streamURL"/>"/></s:a>
                            </td>
                        </s:iterator>
                    </s:subset>
                </tr>
            </s:iterator>
        </table>
    </body>
</html>

上面这一行大概是这部分大概是你想要的:

<img width="200px" src="<s:property value="#streamURL"/>"/>

关于mysql - 如何使用 Hibernate 在 Struts 2 中的 mySql DB 的 jsp 页面中显示图像(blob 类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330503/

有关mysql - 如何使用 Hibernate 在 Struts 2 中的 mySql DB 的 jsp 页面中显示图像(blob 类型)的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐