使用JPA JSF MySql上传,插入,检索和显示图像

我问这个问题,我打算回答其他人要学习的问题。 它非常简单直接。 我希望它有所帮助。

就是这个

使用blob字段为示例客户创建实体

@Entity public class Customer implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Lob private byte[] logo; //setter and getter required 

例如,创建会话Bean以帮助与实体通信

 @Stateless public class CustomerService { @PersistenceContext(unitName = "ImageTestPU") private EntityManager em; public void persist(Object object) { em.persist(object); } public List customerList(){ return em.createNamedQuery(stat).getResultList(); } public byte[] loadImage(int id){ return em.find(Customer.class, id).getLogo(); } } 

创建您的managedBean。 记下private UploadedFile uploadedFile; 它来自

org.apache.myfaces.custom.fileupload.UploadedFile; 我将在稍后解释。

 public class CustomerManager { @EJB private CustomerService customerService; private Customer customer = new Customer(); private List list; private DataModel dataModel; private UploadedFile uploadedFile; public CustomerManager() { } public void createCustomer() throws IOException{ customer.setId(0); byte[] file = uploadedFile.getBytes(); customer.setLogo(file); customerService.persist(customer); } public void loadTable(){ dataModel = new ListDataModel(); dataModel.setWrappedData(customerService.findStatus(customer)); } public String view(){ customer = dataModel.getRowData(); return "view.xhtml"; } //setter and getter for all //use the loadTable method to load your model table 

创建servlet类。 它是显示图像最重要的。 注意以下几点,它们是最重要的

 @WebServlet(name = "ImageServlet", urlPatterns = {"/ImageServlet"}) 

这是为了避免web.xml编辑,如果你问我,它会更容易。 只需获取文件的URL。

 int id =Integer.parseInt(request.getParameter("id")); byte[] image = customerService.loadImage(id); response.setContentType("image/jpeg"); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(image); outputStream.close(); 

上述界限似乎是自我解释的。 不要担心稍后将用于在xhtml中引用图像的id

所以完整的servlet看起来更像这样

 @WebServlet(name = "ImageServlet", urlPatterns = {"/ImageServlet"}) public class ImageServlet extends HttpServlet { @EJB private CustomerService customerService; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int id =Integer.parseInt(request.getParameter("id")); byte[] image = customerService.loadImage(id); response.setContentType("image/jpeg"); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(image); outputStream.close(); } //  /** * Handles the HTTP * GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP * POST method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }//  } 

这是create xhtml,它将图像字节上传并保存到db

      Title     username : Status :         

这是列出db中数据的列表页面。 它附带一个命令链接,可以将您带到视图页面

   #{list.id}      

总之,我希望有一天能帮助某人。 我希望有人花时间以最简单的方式解决问题,因为我仍然有很多未解答的问题,但是当我能做到正确的时候会继续阅读,我将以最简单的方式为像我这样的人分享。 对于上次提到的upload请您需要下载到战斧图书馆。 我认为人们喜欢balusc博客。 他只是让它看起来很复杂。 只需从博客中挑选您需要的东西并使用它。 他是个好人,没有争议。 干杯