我正在处理一个我正面临问题的小型Web应用程序。在这里,我有一个内容列表,我使用迭代器在jsp页面中显示。对于每个内容,可以存在与其相关联的一些图像。我想显示这些图像以及内容。如何实现这一目标。
这是我的内容迭代器。
<s:iterator value="contentList">
<s:property value="id"/>
<s:property value="topic"/>
现在在这个迭代器标记中,我想用第一个迭代器的“id”属性动态生成第二个迭代器。我有一个通过“id”属性映射到每个内容的图像数据库表。我想获取与该特定内容相关联的图像列表,然后在jsp页面中显示它们。图像可以是多个。如何实现这一目标。请帮忙。
图像存储在文件系统中,路径存储在数据库中。为了显示单个图像,我正在做的是,我从动作类中的数据库获取图像路径,然后通过fileInputStream将图像传递给jsp页面。当我尝试显示多个图像时出现问题。
用于在jsp中显示图像的代码
<img src="contentimage.action?contentID=<s:property value="id"/>"/>
<s:property value="id"/>
是内容迭代器可用的值。
在行动课
Image ImageObject=cd.getImageObject(contentID);
File file = new File(ImageObject.getFilePath()+"/"+ImageObject.getFileName());
FileInputStream fileInputStream = new FileInputStream(file);
Image
是一个具有图像属性的Bean类,如文件系统中的FilePath,图像文件名等。
现在,对于给定的contentID
,数据库中可以有多个图像,所有图像都具有不同的文件名和文件路径。我可以将它们放在Image
类型的列表中。现在如何在jsp页面中迭代它们并显示这些路径的图像。希望,这次我的问题很明确。
修改
我的内容类映射到Hibernate。
private int id;
private String topic;
//getters and Setters
我的ContentImage类映射到Hibernate。
private int contentId; // this is the id of the Content class
private String fileName; //image file name
private String filePath; // image file path, actual file is stored in file system
private String imageByte; //Base64 string of the image file
//getters and setters
现在,在加载视图jsp之前的action类中,我得到了Content List。
contentList=//got the list here;
现在使用迭代器在jsp中显示它。
<s:iterator value="contentList">
<s:property value="id"/>
<s:property value="topic"/>
Now here i want a second iterator of my ContentImage class having a list of images corresponding to the id value of the contentList iterator.
//This is where i am having the problem. I can display single image with this:
<img src="contentimage.action?contentID=<s:property value="id"/>"/> //But i need to display all the images associated with this id.
So i need an iterator created dynamically here with the id attribute and then display the images. Like:
<s:iterator value="contentImageList">
<img src="displayimage.action?filepath=<s:property value="filePath"/>"/>
</s:iterator>
</s:iterator>
我无法创建第二个迭代器。请帮助我。
答案 0 :(得分:3)
这里有很多变量:数据库中的图像,还是文件系统中的图像,只有路径/ URI在数据库中?你如何在页面上显示它们? Base64 data-URI Scheme( ouch 没有缓存)?你如何加载它们?在页面加载之前的Action中,或者在迭代中使用例如<s:action />
tag?
假设一个基本场景,你有一个具有简单属性的对象,并且List<String>
包含来自字节数组的Base64转换图像(使用Apache Commons的encodeBase64URLSafeString):
class Row {
private Long id;
private String topic;
private List<String> images;
/* GETTERS AND SETTERS */
}
并在到达视图之前在操作中加载这些对象的List:
private List<Row> rows;
/* GETTER AND SETTER */
public String execute(){
rows = loadRowsInSomeWay();
return SUCCESS;
}
然后在JSP中你可以像这样绘制它们:
<s:iterator value="rows">
<s:property value="id"/>
<s:property value="topic"/>
<s:iterator value="images">
<img src="data:image/jpeg;base64,<s:property/>"/>
</s:iterator>
</s:iterator>
修改强>
假设你已经为一个图像工作了,并且你有一个像上面这样的结构,有一些属性和一个名为“images”的String(或Long,或其他)列表,其中包含id
图像:
<s:iterator value="rows">
<s:property value="id"/>
<s:property value="topic"/>
<s:iterator value="images">
<img src="contentimage.action?contentID=<s:property />"/>
</s:iterator>
</s:iterator>