आप <p:graphicImage>
का उपयोग कर सकते हैं
byte[]
. में संग्रहीत छवियों को प्रदर्शित करने के लिए , byte[]
. की परवाह किए बिना स्रोत (डीबी, डिस्क फाइल सिस्टम, नेटवर्क, आदि)। सबसे सरल उदाहरण है:
<p:graphicImage value="#{bean.streamedContent}" />
जो एक StreamedContent
. को संदर्भित करता है संपत्ति।
हालांकि, इसमें एक नुकसान है, खासकर जब डेटा तालिका जैसे पुनरावृत्त घटक में उपयोग किया जाता है:गेट्टर विधि को दो बार लागू किया जाएगा; JSF द्वारा पहली बार <img src>
. के लिए URL जनरेट करने के लिए और दूसरी बार वेबब्रोसर द्वारा जब उसे <img src>
में URL के आधार पर छवि सामग्री को डाउनलोड करने की आवश्यकता होती है . कुशल होने के लिए, आपको पहले गेटटर कॉल में डीबी को हिट नहीं करना चाहिए। इसके अलावा, गेट्टर मेथड कॉल को पैरामीटराइज़ करने के लिए ताकि आप एक सामान्य विधि का उपयोग कर सकें जिसमें आप एक विशिष्ट छवि आईडी पास करते हैं, आपको <f:param>
का उपयोग करना चाहिए। (कृपया ध्यान दें कि पासिंग मेथड आर्ग्युमेंट्स की EL 2.2 विशेषता बिल्कुल भी काम नहीं करेगी क्योंकि यह <img src>
के URL में समाप्त नहीं होती है। !).
संक्षेप में, यह करना चाहिए:
<p:dataTable value="#{bean.items}" var="item">
<p:column>
<p:graphicImage value="#{imageStreamer.image}">
<f:param name="id" value="#{item.imageId}" />
</p:graphicImage>
</p:column>
</p:dataTable>
#{item.imageId}
स्पष्ट रूप से डीबी (प्राथमिक कुंजी) में छवि का अद्वितीय पहचानकर्ता देता है और इस प्रकार नहीं byte[]
विषय। #{imageStreamer}
एक एप्लिकेशन स्कोप्ड बीन है जो इस तरह दिखता है:
@ManagedBean
@ApplicationScoped
public class ImageStreamer {
@EJB
private ImageService service;
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
// So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
return new DefaultStreamedContent();
} else {
// So, browser is requesting the image. Return a real StreamedContent with the image bytes.
String imageId = context.getExternalContext().getRequestParameterMap().get("imageId");
Image image = imageService.find(Long.valueOf(imageId));
return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes()));
}
}
}
Image
वर्ग इस विशेष उदाहरण में सिर्फ एक @Entity
है एक @Lob
. के साथ bytes
पर संपत्ति (जैसा कि आप जेएसएफ का उपयोग कर रहे हैं, मैं निश्चित रूप से मानता हूं कि आप डीबी के साथ बातचीत करने के लिए जेपीए का उपयोग कर रहे हैं)।
@Entity
public class Image {
@Id
@GeneratedValue(strategy = IDENTITY) // Depending on your DB, of course.
private Long id;
@Lob
private byte[] bytes;
// ...
}
ImageService
सिर्फ एक मानक है @Stateless
EJB, यहाँ देखने के लिए कुछ खास नहीं है:
@Stateless
public class ImageService {
@PersistenceContext
private EntityManager em;
public Image find(Long id) {
return em.find(Image.class, id);
}
}