使用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博客。 他只是让它看起来很复杂。 只需从博客中挑选您需要的东西并使用它。 他是个好人,没有争议。 干杯