How to get a data from a JSON chain!

2

I would like to ask you for some help! It turns out that I have my html form of MenuItem, where I want to insert data into my DB of the menuitem table where your FK is menu_id of the table menu, the case is that in my DTO I am programmed like this:

   package Seguro.Dto;

public class MenuitemDTO {

    private Integer bandera;
    private Integer id;
    private String nombre;
    private String url;
    private MenuDTO menu;

    public void setBandera(Integer bandera) {
        this.bandera = bandera;
    }

    public Integer getBandera() {
        return bandera;
    }

    public void setId (int id){
        this.id=id;
    }

    public Integer getId (){
        return id;
    }

    public void setNombre (String nombre){
        this.nombre=nombre;
    }

    public String getNombre (){
        return nombre;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public MenuDTO getMenu() {
        return menu;
    }

    public void setMenu(MenuDTO menu) {
        this.menu = menu;
    }

}

therefore to the DAO where I have the logic I have it like this:

package Seguro.Dao;

import Genericos.ConexionBD;
import Genericos.TipoMotorBD;
import Genericos.genericoscombos;
import Seguro.Dto.MenuDTO;
import Seguro.Dto.MenuitemDTO;
import Seguro.Int.MenuitemINT;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MenuitemDAO implements MenuitemINT {

    private ResultSet rs;
    private PreparedStatement ps;
    private final ConexionBD conexion;
    private String sql, msg;

    public MenuitemDAO() {
        conexion = new ConexionBD(TipoMotorBD.POSTGRESQL);
    }

    @Override
    public Boolean agregar(MenuitemDTO dto) {
        try {
            sql = "INSERT INTO menuitem (nombre, url, menu_id)"
                    + "VALUES (?,?,?);";//1er paso: preparar el query SQL
            ps = conexion.getConnection().prepareStatement(sql);//2do paso: preparar el ps
            ps.setString(1, dto.getNombre());//3er paso: setear los parametros al ps
            ps.setString(2, dto.getUrl());//3er paso: setear los parametros al ps
            ps.setInt(3, dto.getMenu().getId());//3er paso: setear los parametros al ps
            return ps.executeUpdate() > 0;//4to paso: ejecutar el ps
        } catch (SQLException ex) {
            msg = ex.getMessage();
            return false;
        }
    }

    @Override
    public Boolean modificar(MenuitemDTO dto) {
        try {
            sql = "UPDATE menuitem SET nombre=?, url=?, menu_id=? "
                    + "WHERE id=?;";
            ps = conexion.getConnection().prepareStatement(sql);
            ps.setString(1, dto.getNombre());
            ps.setString(2, dto.getUrl());
            ps.setInt(3, dto.getMenu().getId());
            ps.setInt(4, dto.getId());
            return ps.executeUpdate() > 0;
        } catch (SQLException ex) {
            msg = ex.getMessage();
            return false;
        }
    }

    @Override
    public Boolean eliminar(MenuitemDTO dto) {
        try {
            sql = "DELETE FROM menuitem"
                    + "WHERE id=?;";
            ps = conexion.getConnection().prepareStatement(sql);
            ps.setInt(1, dto.getId());
            return ps.executeUpdate() > 0;
        } catch (SQLException ex) {
            msg = ex.getMessage();
            return false;
        }
    }

    @Override
    public List<MenuitemDTO> seleccionarTodos() {
        try {
            List<MenuitemDTO> lista;
            MenuitemDTO dto;
            MenuDTO menuDto;
            sql = "SELECT m.id as codigo, m.nombre as descri, m.url as url, m.menu_id as menucod, mm.nombre as menudescri "
                    + "FROM menuitem m, menu mm WHERE m.menu_id=mm.id;";
            ps = conexion.getConnection().prepareStatement(sql);
            rs = ps.executeQuery();
            lista = new ArrayList<>();
            while (rs.next()) {
                dto = new MenuitemDTO();
                dto.setId(rs.getInt("codigo"));
                dto.setNombre(rs.getString("descri"));
                dto.setUrl(rs.getString("url"));
                menuDto = new MenuDTO();
                menuDto.setId(rs.getInt("menucod"));
                menuDto.setNombre(rs.getString("menudescri"));
                lista.add(dto);
            }
            return lista;
        } catch (SQLException ex) {
            msg = ex.getMessage();
            return null;
        }
    }

    @Override
    public List<MenuitemDTO> seleccionarFiltros(MenuitemDTO dto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public MenuitemDTO seleccionarSegunId(MenuitemDTO dto) {
        try {
            MenuitemDTO dtoL = null;
            MenuDTO menuDto;
            sql = "SELECT m.id as codigo, m.nombre as descri, m.url as url, m.menu_id as menucod, mm.nombre as menudescri "
                    + "FROM menuitem m, menu mm WHERE m.menu_id=mm.id AND m.id=?;";
            ps = conexion.getConnection().prepareStatement(sql);
            ps.setInt(1, dto.getId());
            rs = ps.executeQuery();
            if (rs.next()) {
                dtoL = new MenuitemDTO();
                dtoL.setId(rs.getInt("codigo"));
                dtoL.setNombre(rs.getString("descri"));
                dtoL.setUrl(rs.getString("url"));
                menuDto = new MenuDTO();
                menuDto.setId(rs.getInt("menucod"));
                menuDto.setNombre(rs.getString("menudescri"));
                dtoL.setMenu(menuDto);
            }
            return dtoL;
        } catch (SQLException ex) {
            msg = ex.getMessage();
            return null;
        }
    }

    @Override
    public String mostrarComboMenu() {
        String html = "";
        genericoscombos combo = new genericoscombos("SELECT id, nombre FROM menu;");
        html += "<select id='listarMenu'>";
        html += "<option>---Seleccione menú---</option>";
        for (int i = 0; i < combo.getDatosTabla().size(); i++) {
            html += "<option value='" + combo.getDatosTabla().get(i).getCodCombo() + "'>" + combo.getDatosTabla().get(i).getDesCombo() + "</option>";
        }
        html += "</select>";
        return html;
    }

}

My problem is that when passing the JSON from my javascript to the Servlet I need to send the menu_id to my MenuDTO in the setID so that in MenuItemDTO I can bring the getMenu (). getID () to be able to perform the insert. My js and my servlet are like this:

function procesarJSON(bandera){
    valores = {
        //CLAVE : VALOR
        bandera: bandera,
        id: document.getElementById('menuitem_id').value,
        nombre: document.getElementById('menuitem_nombre').value,
        url: document.getElementById('menuitem_url').value,
        menu_id: document.getElementById("comboMenu").value
    };
    //alert(valores);
    enviar();
}

function enviar(){
    var xmlhttp = new XMLHttpRequest(); //objeto para peticion via ajax
    xmlhttp.open("POST", "/seguro_medico/MenuitemCTR");
    xmlhttp.setRequestHeader("Content-Type","application/json;charset=UTF-8");
    xmlhttp.send(JSON.stringify(valores));
}

function agregarMenuitem(){
    procesarJSON(1);
}

function modificarMenuitem(){
    procesarJSON(2);
}

function eliminarMenuitem(){
    procesarJSON(3);
}

Servlet:

import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author CAOE
 */
public class MenuitemCTR extends HttpServlet {

    private MenuitemDTO dto;
    private MenuitemDAO dao;
    private MenuDTO menuDto;
    private Gson gson;

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        System.out.println("Llegamos al controlador");
        String cadenaJSON = Metodos_genericos.deRequestToJson(request);
        System.out.println("JSON obtenido" + cadenaJSON);
        gson = new Gson();
        dto = gson.fromJson(cadenaJSON, MenuitemDTO.class);
        dao = new MenuitemDAO();
//        menuDto.setId(dto.getMenu());
        switch (dto.getBandera()) {
            case 1:
                if (dao.agregar(dto)) {
                    // Operación Existosa => al cliente
                } else {
                    // Operación Erronea => al cliente

                }
                break;
            case 2:
                if (dao.modificar(dto)) {
                    // Operación Existosa => al cliente
                } else {
                    // Operación Erronea => al cliente
                }
                break;
            case 3:
                if (dao.eliminar(dto)) {
                    // Operación Existosa => al cliente
                } else {
                    // Operación Erronea => al cliente
                }
                break;
            case 4:
                String json=gson.toJson(dao.seleccionarSegunId(dto));
                if (json != null) {
                    System.out.println("Json " + json);
                    response.setContentType("application/json, charset=UTF-8");
                    out.println(  "[" + json +"]" );
                    out.close();
                } else {
                    out.println("");
                    out.close();
                }
                break;
            case 5:
                response.setContentType("application/json, charset=UTF-8");
                MenuDAO daoMenu=new MenuDAO();
                String cadenaMenu = gson.toJson(daoMenu.seleccionarTodos());
                if (cadenaMenu != null) {
                    //enviar al js la cadena 
                    System.out.println("Cadena " + cadenaMenu);
                    out.println(cadenaMenu);
                } else {
                    //enviar alguna respuesta para indicar error
                }
                break;
            default:
                throw new AssertionError();
        }
    }

    // <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>

}

My idea is when in my servlet read from my stringJSON

valores = {
        //CLAVE : VALOR
        bandera: bandera,
        id: document.getElementById('menuitem_id').value,
        nombre: document.getElementById('menuitem_nombre').value,
        url: document.getElementById('menuitem_url').value,
        menu_id: document.getElementById("comboMenu").value
    };

the menu_id and send it to the DETOD menu that is the DTO of my table menu,

package Seguro.Dto;

public class MenuDTO {

    private Integer bandera;
    private Integer id;
    private String nombre;

    public Integer getBandera() {
        return bandera;
    }

    public void setBandera(Integer bandera) {
        this.bandera = bandera;
    }

    public void setId (int id){
        this.id=id;
    }

    public Integer getId (){
        return id;
    }

    public void setNombre (String nombre){
        this.nombre=nombre;
    }

    public String getNombre (){
        return nombre;
    }
}

in the setID so that in my MenuitemDTO I can set the menuitemDTO.setMenu (menuDTO) in the servlet so that when it enters flag 1 in the add it can already stretch the data of the MenuItemDTO and therefore the ID of menuDTO .

Thank you very much for your time!

    
asked by emsm02 30.10.2018 в 15:00
source

1 answer

1

A quick solution would be to add a setter to your MenuItemDTO for the menuId, in the style of the following:

public void setMenuId(int id) {
   this.setMenu(new MenuDTO());
   this.getMenu().setId(id);
   this.getMenu().setBandera(1);
}

In this way Gson would find the setter for menu_id and you could get what you need.

    
answered by 30.10.2018 / 15:31
source