2010-07-28 52 views
16

Tengo un componente <odc:tabbedPanel/>. Dentro de esto tengo una página en el componente <odc:bfPanel/>. Quiero acceder a un valor (de un texto de entrada o botón de radio) desde la página en el <odc:bfPanel/> en mi clase de bean administrada <odc:tabbedPanel/>. Por favor, guíame sobre cómo hago esto. Tenga en cuenta aquí que no quiero usar la sesión aquí. Lo quiero solo bajo pedido. He intentado las siguientes opciones pero no funcionaron para mí.Obtener valores de parámetros de solicitud en JSF

la opción uno

String value = (String) ctx.getExternalContext() 
         .getRequestParameterValuesMap() 
         .get("managedbean.property"); 

la opción dos

String value = (String) ctx.getExternalContext() 
         .getRequestParameterValuesMap() 
         .get("property"); 

opción tres

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance() 
         .getExternalContext().getRequest(); 
System.out.println(req.getParameter("property")); 

opción de cuatro

Map requestMap = FacesContext.getCurrentInstance() 
         .getExternalContext().getRequestHeaderValuesMap(); 
String msgId = (String) requestMap.get("property"); 
System.out.println(msgId); 

opción de cinco

HttpServletRequestWrapper r = new HttpServletRequestWrapper(req); 
String value1 = r.getParameter("managedbean.property"); 

Quiero que el valor no en bean gestionado de la JSP ... Pero lo quiero de alguna otra bean gestionado. aquí tengo páginas dentro de una página (como lo mencioné es un panel con pestañas). ahora quiero el valor en el bean administrado de la pestaña externa -

Respuesta

25

primero vamos a explicar por qué las opciones que ha intentado no funcionaron:

Opción 1 y 2 son válidos, ya que devuelve valores (!!) como un String[], no es un valor único como String.

La opción 3 debería funcionar si el parámetro estaba allí. Pero esta no es una buena manera JSF-ish.

La opción 4 no es válida porque los parámetros no se establecen en el encabezado de solicitud.

La opción 5 no es válida porque simplemente no tiene sentido. Solo está agregando una capa abstracta adicional entre las cuales, de hecho, no cambia nada aquí.


La forma JSF-ish sería el uso de ExternalContext#getRequestParameterMap():

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap(); 
String param = parameterMap.get("paramName"); 

cuanto a por qué es probable que la opción 3 no funciona debido a que el nombre del parámetro no es lo que piensa/espera es. JSF es, por lo tanto, antes de las identificaciones de cliente (en madera) basadas en los componentes padre UINamingContainer en el árbol de vista. Haga clic con el botón derecho en la salida HTML generada de la página JSF en su navegador web y elija Ver fuente. Examine el nombre del elemento <input> generado de interés. Use como nombre como nombre del parámetro.


Dicho esto, esto es, después de todo, una solución no una solución. Pero no podemos sugerir razonablemente la solución real ya que el requisito funcional y el código que tiene no están completamente claros. Normalmente vincula los elementos de entrada a un bean de respaldo. Si está realmente dentro de un bean de respaldo diferente, entonces también puede simplemente acceder al ese bean de respaldo desde dentro del bean de respaldo y luego, a su vez, acceder al valor de entrada vinculado con él. Ver Injecting Managed Beans in each other para un cómo.

0

No entiendo exactamente su pregunta. Si el inputtext o radiobutton está correctamente vinculado a un valor en un bean de respaldo, entonces puede acceder al valor directamente en Java. Si lo que interesa es la búsqueda programática de un bean gestionado, entonces eso es cómo lo hago:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean"); 
2

El hecho de que los controles están en el interior paneles de IBM ODC no es relevante.

Normalmente, vincularía el control de entrada a un valor de bean administrado. definición

Bean:

<managed-bean> 
    <managed-bean-name>demo</managed-bean-name> 
    <managed-bean-class>foo.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

Ver etiquetas:

<!-- needs to be inside a form control --> 
<h:inputText value="#{demo.foo}" /> 
<h:commandButton value="Click Me" action="#{demo.invokeMe}" /> 

Bean:

package foo; 
public class MyManagedBean { 
    private String foo; 
    public String getFoo() { return foo; } 
    public void setFoo(String foo) { this.foo = foo; } 

    public String invokeMe() { 
    System.out.println(foo); 
    return null; //no navigation 
    } 
} 

Si quería vincular a su control de entrada a un grano diferente a la que tiene el lógica de aplicación, puede usar la inyección de propiedad para referirse al otro bean.

<managed-bean> 
    <managed-bean-name>demo</managed-bean-name> 
    <managed-bean-class>foo.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
    <property-name>propName</property-name> 
    <value>#{someExpression}</value> 
    </managed-property> 
</managed-bean> 

Usted puede mirar directamente a través de la materia para arriba el contexto, o utilizar las clases de expresión para resolver las cosas a través de código, pero esto es un enfoque más limpio.

+0

quiero el valor no en el bean administrado de jsp ... pero lo quiero en algún otro bean administrado. aquí tengo páginas dentro de una página (como lo mencioné es un panel con pestañas). ahora quiero el valor en el bean administrado de la pestaña externa – user265950

+0

@ tejas-a - use una 'propiedad-gestionada' para inyectar la propiedad de un bean en el otro - vea la última sección. – McDowell

Cuestiones relacionadas