Java tutorial
package catalogo; /* * Copyright (C) 2014 Javier Garca Escobedo (javiergarbedo.es) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ import catalogo.CatalogoDBManagerMySQL; import catalogo.Catalogo; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import org.apache.commons.codec.digest.DigestUtils; /** * * @author Javier Garca Escobedo (javiergarbedo.es) * @version 0.2.0 * @date 2014-02-27 */ @WebServlet(name = "Main", urlPatterns = { "/Main" }) //Anotacin requerida para la subida de archivos usando enctype="multipart/form-data" @MultipartConfig public class Main extends HttpServlet { private static final Logger logger = Logger.getLogger(CatalogoDBManagerMySQL.class.getName()); public static final String ACTION_EDIT_REQUEST = "E"; public static final String ACTION_EDIT_RESPONSE = "S"; public static final String ACTION_INSERT_REQUEST = "I"; public static final String ACTION_INSERT_RESPONSE = "A"; public static final String ACTION_DELETE = "D"; public static final String ACTION_EXPORT_XML = "X"; //Nombre de la carpeta donde se guardarn las imgenes subidas public static final String SAVE_DIR = "uploadFiles"; /** * Este mtodo es ejecutado cada vez que se hace una llamada a esta pgina * * @param request Contiene los datos que se pasan a esta pgina mediante * parmetros GET o POST * @param response * @throws ServletException * @throws IOException */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Obtener los datos de conexin a la BD desde un archivo de propiedades Properties properties = new Properties(); properties.load(getServletContext().getResourceAsStream("/WEB-INF/config.properties")); String dbServer = properties.getProperty("db_server"); String dbName = properties.getProperty("db_name"); String dbUser = properties.getProperty("db_user"); String dbPassword = properties.getProperty("db_password"); //Conexin con la base de datos CatalogoDBManagerMySQL.connect(dbServer, dbName, dbUser, dbPassword); //Comprueba si se ha podido realizar la conexin if (CatalogoDBManagerMySQL.isConnected()) { String action = request.getParameter("action"); logger.fine("action = " + action); if (action != null && !action.isEmpty()) { //Se ha llamado a Main tras pulsar el enlace de Editar en la lista if (action.equals(ACTION_EDIT_REQUEST)) { //Obtener el id de la persona a partir del parmetro is que se // ha debido utilizar al realizar la llamada a esta pgina Main int id = Integer.valueOf(request.getParameter("id")); //Lee de la BD los datos de la persona con el id solicitado Catalogo catalogo = CatalogoDBManagerMySQL.getCatalogoByID(id); //Se prepara el objeto Person generado para pasarlo a otra pgina request.setAttribute("catalogo", catalogo); //Se redirige a otra pgina que muestra el detalle de la persona, // pasando en request la persona redirectTo("catalogo_detail.jsp", request, response); //Se ha llamado a Main tras pulsar el botn Guardar en la pgina de // detalle cuando se estaba editando una persona existente } else if (action.equals(ACTION_EDIT_RESPONSE)) { int id = Integer.valueOf(request.getParameter("id")); Catalogo catalogo = CatalogoDBManagerMySQL.getCatalogoByID(id); //Se modifican los datos que haba en la BD, asignado los datos // que se han introducido en la pgina de detalle. Esos datos // se reciben como parmetros de la llamada (request) a esta pgina Main updateCatalogoWithRequestData(catalogo, request); //Se actualiza en la BD la persona CatalogoDBManagerMySQL.updateCatalogo(catalogo); //Volvemos a recargar la pgina Main con lista (no se indica // ninguna accin si se quiere mostrar la lista) response.sendRedirect("Main?action="); //Se ha llamado a Main tras pulsar el botn Insertar } else if (action.equals(ACTION_INSERT_REQUEST)) { Catalogo catalogo = new Catalogo(); request.setAttribute("catalogo", catalogo); redirectTo("catalogo_detail.jsp", request, response); //Se ha llamado a Main tras pulsar el botn Guardar en la pgina de // detalle cuando se estaba insertando una nueva persona } else if (action.equals(ACTION_INSERT_RESPONSE)) { Catalogo catalogo = new Catalogo(); updateCatalogoWithRequestData(catalogo, request); CatalogoDBManagerMySQL.insertCatalogo(catalogo); response.sendRedirect("Main?action="); //Se ha llamado a Main tras pulsar el enlace de Eliminar en la lista } else if (action.equals(ACTION_DELETE)) { String id = request.getParameter("id"); //Se borra de la BD la persona con el ID indicado CatalogoDBManagerMySQL.deleteCatalogoById(id); response.sendRedirect("Main?action="); //Se ha llamado a Main tras pulsar el botn Exportar XML } else if (action.equals(ACTION_EXPORT_XML)) { //Se obtiene desde la BD una lista con todas las personas ArrayList<Catalogo> catalogoList = CatalogoDBManagerMySQL.getCatalogoList(); //Se prepara la lista obtenida para pasarla a otra pgina request.setAttribute("catalogoList", catalogoList); //Se redirige a otra pgina que genera el XML pasando en request // la lista de personas redirectTo("export_xml.jsp", request, response); } //Si no se indica ninguna accin se entiende que se quiere mostrar la lista } else { ArrayList<Catalogo> catalogoList = CatalogoDBManagerMySQL.getCatalogoList(); request.setAttribute("catalogoList", catalogoList); redirectTo("catalogo_list.jsp", request, response); } } else { //No se ha podido hacer la conexin con la BD response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("Error: No se ha podido conectar con la BD.<br>"); out.println("Compruebe la configuracin en el archivo 'config.properties'"); out.close(); } } /** * Redirige la navegacin web a la pgina indicada en newUrl, pasndole en * request los datos que necesite * * @param newUrl * @param request * @param response */ private static void redirectTo(String newUrl, HttpServletRequest request, HttpServletResponse response) { try { RequestDispatcher dispatcher = null; dispatcher = request.getRequestDispatcher(newUrl); dispatcher.forward(request, response); } catch (ServletException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } /** * Actualiza los datos de un objeto Person, usando los datos recibidos en * request cuyo contenido se ha formado en person_detail.jsp * * @param person * @param request */ private void updateCatalogoWithRequestData(Catalogo catalogo, HttpServletRequest request) { catalogo.setName(request.getParameter("name")); catalogo.setPrice(request.getParameter("price")); catalogo.setComments(request.getParameter("comments")); //Asignacin de foto //Consultar si se ha solicitado dejar el contacto sin foto activando el // checkbox "deletePhoto" del formulario logger.fine("DeletePhoto: " + request.getParameter("deletePhoto")); if (request.getParameter("deletePhoto") != null && request.getParameter("deletePhoto").equals("on")) { //Si el contacto tena alguna foto, borrar el archivo y dejar la propiedad foto en blanco if (!catalogo.getPhotoFileName().isEmpty() && catalogo.getPhotoFileName() != null) { deletePhotoFile(request, catalogo.getPhotoFileName()); catalogo.setPhotoFileName(""); } } else { //No se ha pedido dejar sin foto //Guardar la imagen en el servidor y asignar el nombre a la persona String photoFileName = savePhotoFile(request); if (photoFileName != null) { if (catalogo.getPhotoFileName().isEmpty() || catalogo.getPhotoFileName() == null) { //Si no tena foto, le asigna la nueva catalogo.setPhotoFileName(photoFileName); } else { //Si ya tena foto, borra el archivo antiguo y asigna la nueva deletePhotoFile(request, catalogo.getPhotoFileName()); catalogo.setPhotoFileName(photoFileName); } } } } /** * Almacena la imagen indicada en el input "photoFileName" del formulario * dentro de la carpeta indicada en la constante SAVE_DIR, generando un * nombre nuevo para el archivo en funcin de una codificacin MD5 * * @param request * @return Nombre generado para la imagen o null si no se ha enviado ningn * archivo */ private String savePhotoFile(HttpServletRequest request) { //Crear la ruta completa donde se guardarn las imgenes String appPath = request.getServletContext().getRealPath(""); String savePath = appPath + File.separator + SAVE_DIR; logger.fine("Save path = " + savePath); //Crear la carpeta si no existe File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdir(); } //Crear un nombre para la imagen utilizando un cdigo MD5 en funcin // del tiempo y una palabra secreta. // Se utiliza una codificacin de este tipo para que se dificulte la // localizacin no permitida de las imgenes String secret = "W8fQAP9X"; long time = Calendar.getInstance().getTimeInMillis(); //Para generar el cdigo MD5 se usa la clase DigestUtils de la librera // org.apache.commons.codec (se incluye en la carpeta 'libs' del proyecto) String fileName = DigestUtils.md5Hex(secret + time); try { //Obtener los datos enviados desde el input "photoFileName" del formulario Part filePart = request.getPart("photoFileName"); String fullPathFile = savePath + File.separator + fileName; //Guardar la imagen en la ruta y nombre indicados if (filePart.getSize() > 0) { filePart.write(fullPathFile); logger.fine("Saved file: " + fullPathFile); return fileName; } else { return null; } } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalStateException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } catch (ServletException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } return null; } private void deletePhotoFile(HttpServletRequest request, String photoFileName) { String appPath = request.getServletContext().getRealPath(""); String filePath = appPath + File.separator + SAVE_DIR + File.separator + photoFileName; File photoFile = new File(filePath); photoFile.delete(); } // <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> }