Menu

Cómo hago para que desde una pág.JSP se llame al módulo de la organización correcta.

JOSE ELIAS
2024-05-07
2024-05-30
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-07

    Me explico.

    Dispongo de una página JSP que carga datos de la organización principal, pero cuando paso de organización (esquema), se siguen presentado los datos de la organización principal.

    ¿Cómo hago para que se tenga en cuenta la organización en la que se está?

     
  • Javier Paniza

    Javier Paniza - 2024-05-08

    Hola José:

    ¿Cómo cargas esos datos?
    ¿Donde defines tu página JSP?

    Si tu página JSP es una vista-web de tu módulo y usas JPA para obtener los datos debería funcionar de forma automática. Ahora bien, si es una JSP que se llama directamente escribiendo la URL en el navegador, u obtienes los datos de otra manera. No funcionará, claro.

    Dame más detalles, como la definición del módulo que usa la JSP y el contenido de la misma.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-08

    Hola JP...

    La página JSP presenta el calendario con el combo para seleccionar técnicos que te pego en adjuntos.

    El combo se rellena con el nombre de técnicos haciendo una llamada a un módulo llamado "EventoFichajeCalendario" a la función "findAllUsersForContrato".

    Esta es la llamada que hago en la JSP, en el body

    <select name="entidad_selector" id="entidad_selector" onchange="this.form.submit()"> <option value="-1"> Seleccione empleado... </option> <% //cargar el combo con los empleados y marcar el que viene seleccionado //04012024 - sacar tecnicos con usuario enlazado, en activo y con contrato Nomina Elenco (NE) List<Tecnico> empleados = EventoFichajeCalendario.findAllUsersForContrato("NE"); String sTagSelected = ""; String usuario = ""; String nombre = ""; String apellidos = ""; if (empleados != null) { for (Tecnico empl : empleados) { if (idSelected != null){ if (idSelected.equalsIgnoreCase(empl.getUsuario().getName())) { sTagSelected="selected"; } else { sTagSelected=""; } } if (empl.getNombre() != null) nombre = empl.getNombre(); //if (empl.getApellidos() != null) apellidos = empl.getApellidos(); %> <option <%=sTagSelected%> value="<%=empl.getUsuario().getName()%>"><%=nombre + " " + apellidos%></option> <% } } %> </select> y esta la función del módulo java al que llamo ublic static List<Tecnico> findAllUsersForContrato(String idContrato) { LOG.debug(Util.userLog() + "---idContrato:" + (idContrato==null?"null":idContrato)); if (idContrato==null) return null; String trama = null; try { Empleado empleadoActual = Empleado.findByUser(null, Users.getCurrent()); trama = "FROM Tecnico " + "WHERE usuario IS NOT NULL " + "AND nombre IS NOT NULL " + "AND activo = true " + "AND keyCode.idCompany = '" + empleadoActual.getKeyCode().getIdCompany() + "' " + "AND tipoContrato.codigo = '" + idContrato + "' " + "ORDER BY nombre ASC"; } catch (Exception e) { //admin no es empleado, para poder correr la sql trama = "FROM Tecnico " + "WHERE usuario IS NOT NULL " + "AND nombre IS NOT NULL " + "AND activo = true " + "AND tipoContrato.codigo = '" + idContrato + "' " + "ORDER BY nombre ASC"; } List<Tecnico> tecnicos = XPersistence.getManager().createQuery(trama).getResultList(); return tecnicos; } En ningún momento estoy seleccionando contra que esquema quiero ir y siempre se lanza contra el esquema principal. He adjuntado el módulo .java y la imagen del calendario que carga la página JSP.</select>

     

    Last edit: JOSE ELIAS 2024-05-08
  • Javier Paniza

    Javier Paniza - 2024-05-09

    Hola José:

    El código está bien, debería funcionar. Usas XPersistence.getManager() como el resto del JSP que se ejecuta antes y después. Además, estás dentro de un módulo.

    ¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?

    ¿Me puedes mostrar también la URL en el navegador?

    Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-16

    ¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?
    Eso es.

    ¿Me puedes mostrar también la URL en el navegador?
    https://xx.xx.xx.xx:xxx/ElencoERP/o/escaleno/m/HorasTecnico?init=true

    Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.
    Salen un millón de líneas, para o engorronar, a ver si te sirve esto.
    Mientras que me muevo por el resto de módulos, todas las sql apuntan a la segunda organización, pero cuando cambio a este JSP, y se lanzan las consultas, la organización de las consultas es la primera.
    En estas sql es donde se produce el cambio. A partir de que se produce el cambio, al pulsar sobre los módulos normales, te echa de la aplicación para loguearte otra vez, como cuando no tienes permisos.

        select modulerigh0_.roles_name as roles_na6_174_, modulerigh0_.modules_name as modules_7_174_, modulerigh0_.modules_application as modules_8_174_, modulerigh0_.excludedActions as excluded1_174_, modulerigh0_.excludedMembers as excluded2_174_, modulerigh0_.notInMenu as notinmen3_174_, modulerigh0_.readOnly as readonly4_174_, modulerigh0_.readOnlyMembers as readonly5_174_ from escaleno.OXROLES_OXMODULES modulerigh0_ where modulerigh0_.modules_application=? and modulerigh0_.modules_name=? and modulerigh0_.roles_name=?
    

    Hibernate:

        select tecnico0_.IDELC_RESOURCE as idelc_re1_69_, tecnico0_.ACTIVE as active2_69_, tecnico0_.ALIAS as alias3_69_, tecnico0_.ISDROP as isdrop4_69_, tecnico0_.BLQDG as blqdg5_69_, tecnico0_.BLQDG2 as blqdg6_69_, tecnico0_.BLQFD as blqfd7_69_, tecnico0_.BLQFD2 as blqfd8_69_, tecnico0_.IDELC_CTECH_ID as idelc_c58_69_, tecnico0_.CHKDG as chkdg9_69_, tecnico0_.CHKDG2 as chkdg10_69_, tecnico0_.ZIP as zip11_69_, tecnico0_.COLELE as colele12_69_, tecnico0_.CTRLGPS as ctrlgps13_69_, tecnico0_.AGREEMENT as agreeme14_69_, tecnico0_.DATEDISP as datedis15_69_, tecnico0_.ADDRESS as address16_69_, tecnico0_.DISPMIN as dispmin17_69_, tecnico0_.TIN as tin18_69_, tecnico0_.DOCALT as docalt19_69_, tecnico0_.DOCPLAT as docplat20_69_, tecnico0_.DOCSPROD as docspro21_69_, tecnico0_.EMAIL as email22_69_, tecnico0_.STATE as state23_69_, tecnico0_.STATEDOC as statedo24_69_, tecnico0_.STUDIES as studies25_69_, tecnico0_.DATEHIGHJOB as datehig26_69_, tecnico0_.DATEDROPJOB as datedro27_69_, tecnico0_.DATEBIRTH as datebir28_69_, tecnico0_.fotosTecnico as fotoste29_69_, tecnico0_.GUARD as guard30_69_, tecnico0_.WEEKHOUR as weekhou31_69_, tecnico0_.IBAN as iban32_69_, tecnico0_.IDELC_RESOURCE_ID as idelc_r33_69_, tecnico0_.IDMV_KEYGEN as idmv_ke34_69_, tecnico0_.AMOUNTMONTH as amountm35_69_, tecnico0_.KEYCODE as keycode59_69_, tecnico0_.IDELC_LTECH_ID as idelc_l60_69_, tecnico0_.META_XIMAGE0 as meta_xi36_69_, tecnico0_.MINAJUST as minajus37_69_, tecnico0_.NOGENNOTIF as nogenno38_69_, tecnico0_.NOTECH as notech39_69_, tecnico0_.RESOURCENAME as resourc40_69_, tecnico0_.NAFF as naff41_69_, tecnico0_.OBSBLQ as obsblq42_69_, tecnico0_.OBSPR as obspr43_69_, tecnico0_.OBSPR2 as obspr44_69_, tecnico0_.SEQTECH as seqtech45_69_, tecnico0_.IDGEN_COUNTRY as idgen_c61_69_, tecnico0_.LOCALITY as localit46_69_, tecnico0_.COST as cost47_69_, tecnico0_.IDELC_PRODUCT_ID as idelc_p62_69_, tecnico0_.OWN as own48_69_, tecnico0_.IDELC_PROVIDER_ID as idelc_p63_69_, tecnico0_.IDGEN_PROVINCE_ID as idgen_p64_69_, tecnico0_.puntActitud as puntact49_69_, tecnico0_.puntPuntualidad as puntpun50_69_, tecnico0_.puntVestuario as puntves51_69_, tecnico0_.IDGEN_PUNCT_ID as idgen_p52_69_, tecnico0_.TRELATION as trelati53_69_, tecnico0_.SOLDOCAUTO as soldoca54_69_, tecnico0_.PHONE as phone55_69_, tecnico0_.IDELC_TCONTRACT_ID as idelc_t65_69_, tecnico0_.TRAMODISPMIN as tramodi56_69_, tecnico0_.IDSYSUSER as idsysus66_69_, tecnico0_.COUNTCLT as countcl57_69_, tecnico0_.IDTCH_ZONE_ID as idtch_z67_69_ from cube_elc.elc_resource tecnico0_ where (tecnico0_.IDSYSUSER is not null) and (tecnico0_.RESOURCENAME is not null) and tecnico0_.ACTIVE=1 and tecnico0_.IDELC_TCONTRACT_ID='NE' order by tecnico0_.RESOURCENAME ASC
    
     

    Last edit: JOSE ELIAS 2024-05-16
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-18

    Justo antes de lanzar las select de la página JSP, se llama bien al esquema de la base de datos. Después de que se han lanzado las select, cuando pulsas cualquier módulo, te echa de la aplicación a la pantalla de login.

     

    Last edit: JOSE ELIAS 2024-05-18
  • Javier Paniza

    Javier Paniza - 2024-05-20

    Hola José:

    He hecho un ejemplo de código intentando reproducir tu problema, pero no lo consigo. Siempre me funciona bien, haga lo que haga.

    Este mi module en aplicacion.xml:

    <modulo nombre="MiListaPersonalizada">
        <modelo nombre="TuPrimeraEntidad"/>
        <vista-web url="jsp-propios/miLista.jsp"/>
        <controlador-modo nombre="DetailOnly"/>
    </modulo>
    

    Este es mi JSP:

    <%@ page import="com.tuempresa.jsppro.modelo.TuPrimeraEntidad" %>
    
    Estos son mis datos:
    <ol>
    <% for (TuPrimeraEntidad e: TuPrimeraEntidad.findAll()) { %>
    <li><%=e.getDescripcion()%></li>
    <% } %>
    </ol>
    

    Y este mi método finder:

    public static Collection<TuPrimeraEntidad> findAll() {
        return XPersistence.getManager().createQuery("from TuPrimeraEntidad").getResultList();
    }
    

    Creo que es, básicamente, lo que haces tú. Cada vez que entro a una organización el JSP me muestra los datos de esa organización. Lo he probado normal y con usuarios compartidos entre organizaciones. En ambos casos, haga lo que haga, funciona bien.

    Te adjunto el zip con el proyecto. Pruébalo en tu máquina e intenta hacerlo fallar, cuando lo hayas conseguido dime la lista exacta de pasos que he de dar para que falle. Si no consigues que falle, modifícalo hasta que falle, y adjunta aquí el proyecto modificado.


    Ayuda a otros en este foro como yo te ayudo a ti.

     

    Last edit: Javier Paniza 2024-05-20
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-21

    Hola JP, así es como falla:
    --No puedo usar vista-web directa a la jsp final porque no se carga, tengo que pasarla por un iframe. He pasado tu jsp por un iframe y falla también..

    Define así el módulo:

    <modulo nombre="MiListaPersonalizada">
    <modelo nombre="TuPrimeraEntidad">
    <vista-web url="jsp-propios/mostrarMiLista.jsp">
    <controlador-modo nombre="DetailOnly">
    </controlador-modo></vista-web></modelo></modulo>

    Define así mostrarMiLista.jsp

    <iframe width="100%" height="1080" frameborder="0" ;="" src="/pruebas/jsp-propios/miLista.jsp"></iframe>

    Y deja miLista.jsp como tú la has definido.

    Así cuando estas en la organización 2, saca los valores de la principal.

     
  • Javier Paniza

    Javier Paniza - 2024-05-22

    Hola José:

    Buen, pues ya hemos descubierto el misterio. Con iframe no te va a funcionar.

    Ten en cuenta que un iframe es como un navegador que está incrustado dentro de la página que abre otro sitio web, de forma totalmente independiente. Es decir, que el efecto es el de llamar desde la URL del navegador directamente a jsp-propios/mostrarMiLista.jsp. De esa forma, estás ejecutando directamente la página JSP sin pasar por nada de la lógica de OpenXava o XavaPro. No tienes definida la organización, pero tampoco el usuario actual, si haces XPersistence.getManager() se crea otro nuevo en otro hilo con otra transacción, sino cierras el manager con XPersistence.commit() va a tener una fuga de conexiones y saturarás el pool, etc.

    Un iframe es como llamar directamente al JSP, lo que significa que te tienes que encargar de todo.

    Si quieres seguir usando un iframe una opción sería que enviaras el esquema como argumento.

    Otro problema del iframe es que para que funcione tienes que tener una JSP accesible directamente que ofrece datos de la aplicación, lo que supone un brecha de seguridad.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-24

    Hasta que encuentre una solución mejor que me permita usar vista-web voy a optar por pasar el esquema a la JSP.
    Me ocurre que no soy capaz de recuperar el objeto de sesión en la página JSP.

    Esta es la acción que pasa el esquema

    public class MostrarHorasTecnico extends BaseAction implements INavigationAction {
    private static final Logger LOG = Logger.getLogger(MostrarHorasTecnico.class);

    @Inject @Named("elencoerp_keyCode")
    private String elencoerp_defaultSchema;
    
    @Override
    public String[] getNextControllers() throws Exception {
        return null;
    }
    
    @Override
    public void execute() throws Exception {
        LOG.info(Util.userLog() + "---defaultSchema:" + XPersistence.getDefaultSchema());
        //se tiene que pasar así no con @inject
        //getRequest().getSession().setAttribute("elencoerp_defaultSchema", "escaleno");
        //LOG.info(Util.userLog() + "---getAttribute(defaultSchema):"+(String)getRequest().getSession().getAttribute("elencoerp_defaultSchema"));
        elencoerp_defaultSchema = "escaleno";   //XPersistence.getDefaultSchema();
    }
    
    @Override
    public String getCustomView() throws Exception {
        return "jsps-propios/mostrarHorasTecnico.jsp";
    }
    

    }

    Este el objeto de sesión

    <objeto nombre="elencoerp_defaultSchema" clase="java.lang.String" valor="" ambito="global"></objeto>

    Y así intento recuperar en la página JSP

    <jsp:usebean id="context" class="org.openxava.controller.ModuleContext" scope="session">
    <%
    String defaultSchema=(String)context.get(request, "elencoerp_defaultSchema");
    %></jsp:usebean>

    pero devuelve un error
    org.openxava.util.XavaException: Es obligado que la petición contenga los parámetros ''application'' y ''module''

    meto la aplicación y un módulo en context.get() y vuelvo a recibir otro mensaje en el que sobra un String

     

    Last edit: JOSE ELIAS 2024-05-24
  • Javier Paniza

    Javier Paniza - 2024-05-28

    Hola José:

    Cambia:

    String defaultSchema=(String)context.get(request, "elencoerp_defaultSchema");
    

    Por:

    String defaultSchema=(String)context.get("tuaplicacion", "tumodulo", "elencoerp_defaultSchema");
    

    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-28

    Hola JP, haciéndo lo que me indicas, efectivamente se recupera el "elencoerp_defaultSchema" desde le primer JSP, pero haciendo exactamente lo mismo en el JSP que debe recuperar bien su valor, siempre llega el valor de inicialización en controladores.xml

    La sensación es como si después de pasar por mostrarHorasTecnico.jsp se perdiera el valor inyectado a "elencoerp_defaultSchema" .

    ---> Este es mostrarHorasTecnico.jsp

    <% String defaultSchema=(String)context.get("ElencoERP", "HorasTecnico", "elencoerp_defaultSchema"); System.out.println("---mostrarHorasTecnico.jsp - defaultSchema:" + defaultSchema); %> <iframe width="100%" height="1080" frameborder="0" ;="" src="/ElencoERP/jsps-propios/horasTecnico.jsp"></iframe>
     
  • Javier Paniza

    Javier Paniza - 2024-05-29

    Hola José:

    La sensación es como si después de pasar por mostrarHorasTecnico.jsp se perdiera el valor inyectado a "elencoerp_defaultSchema"

    Claro que se pierde. Lo de @Inject es para objetos de sesión de OpenXava que son locales del módulo. En tu propio JSP ejecutado directamente, no tienes nada de OpenXava, ni siquiera módulo, ni usuario actual, ni va a cerrarte el manager, ni nada. Para que el JSP pueda usar todo lo disponible en OpenXava tiene que estar definido en vista-web y ser llamado desde el módulo.

    Sí que puedes poner valores a la session de servlet con session.settAttribute() y después leerlos desde el JSP. Piensa también que un JSP así es un agujero de seguridad porque se puede llamar directamente desde la URL del navegador sin identificarte.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • JOSE ELIAS

    JOSE ELIAS - 2024-05-29

    Hola JP, estoy viendo como resolverlo y quitarlo.

    Mientras encuentro uan solución, tengo el problema de que cada vez que se visualiza este JSP se tiene que volver a loguearse para poder usar otro módulo en la segunda organización (en la principal no pasa).

    Puedo resolverlo de alguna manera?

     
  • Javier Paniza

    Javier Paniza - 2024-05-30

    Hola José:

    Puedo resolverlo de alguna manera?

    Supongo. Pero sin tener tu código no puedo saberlo. Además, tampoco sé muy bien la secuencia que haces para que falle.

    Si dejas el JSP totalmente vacío, y lo pruebas, ¿el problema de tener que volver a logearse sigue estando?


    Ayuda a otros en este foro como yo te ayudo a ti.

     

Log in to post a comment.