Я задаю этот вопрос, и я намерен ответить на вопрос, чтобы другие узнали. Его довольно простой и прямой. Надеюсь, что это поможет.
Это он
Создайте свою сущность, например, клиент с полем 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<Customer> 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<Customer> list;
private DataModel<Customer> 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<Customer>();
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
Создайте класс сервлета. Его наиболее важно отображать ваше изображение. Обратите внимание на следующее: они являются наиболее важными
@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();
Вышеприведенная строка кажется самоочевидной.
Не беспокойтесь о id
, это будет полезно для ссылки на изображение в xhtml позже.
поэтому полный сервлет больше похож на этот
@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();
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP
* <code>GET</code> 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
* <code>POST</code> 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";
}// </editor-fold>
}
Это создаёт xhtml, который загружает и сохраняет байты изображения в db
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:t="http://myfaces.apache.org/tomahawk">
<h:head>
<title> Title</title>
</h:head>
<h:body>
<h:form id="uploadForm" enctype="multipart/form-data">
<h:panelGrid columns="2">
username :<h:inputText value="#{customerManager.customer.username}"/>
Status :<h:inputText value="#{customerManager.customer.status}"/>
<h:outputLabel for="file" value="Select file" />
<t:inputFileUpload id="file" value="#{customerManager.uploadedFile}" required="true" />
<h:message for="file" style="color: red;" />
<h:commandButton value="Create" action="#{customerManager.createCustomer()}"/>
</h:panelGrid>
</h:form>
</h:body>
</html>
Это страница списка, в которой перечислены ваши данные в db. он прикрепляется с помощью командной строки, которая выводит вас на страницу просмотра
<h:dataTable value="#{customerManager.dataModel}" var="list">
<h:column>
#{list.id}
</h:column>
<h:column>
<h:commandLink value="#{list.username}" action="#{customerManager.view}" />
</h:column>
</h:dataTable>
В заключение я хочу, чтобы это помогло кому-нибудь когда-нибудь. И я хочу, чтобы кому-то потребовалось время для решения проблем самым простым способом, потому что у меня все еще есть много оставшихся без ответа вопросов, но буду продолжать читать, когда я получу это правильно. Я поделюсь им самым простым способом для таких людей, как я.
Для более раннего упоминания upload
вам нужно будет загрузить в библиотеку tomahawk. Я думаю, что люди любят балусский блог об этом. Он просто сделал это выглядеть сложным, чем должно быть. просто выберите вещи, которые вам нужны из блога, и используйте их. Он хороший парень, не спорит об этом. приветствия