Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

JSF डेटाटेबल में MySQL डेटाबेस से चित्र प्रदर्शित करना

आप <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);
    }

}

यह भी देखें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में Key, Primary Key, Unique Key और Index के बीच अंतर

  2. दिनांक के अनुसार MySQL परिणाम प्रदर्शित करें

  3. MySQL में दिनांक और समय को कैसे प्रारूपित करें

  4. समय ओवरलैप के लिए एक टेबल की जाँच?

  5. चेक कॉलम/कुंजी मौजूद है?