welcome validar solo sirve showcases rendered que para numeros formulario etiquetas ejemplo jsf java-ee servlets jsf-2 managed-bean

jsf - validar - welcome primefaces



Obtenga beans administrados por JSF por nombre en cualquier clase relacionada con Servlet (6)

Estoy intentando escribir un servlet personalizado (para AJAX / JSON) en el que me gustaría hacer referencia a mis @ManagedBeans por nombre. Estoy esperando hacer un mapa:

http://host/app/myBean/myProperty

a:

@ManagedBean(name="myBean") public class MyBean { public String getMyProperty(); }

¿Es posible cargar un bean por nombre de un servlet normal? ¿Hay algún servlet o ayudante JSF que pueda usar?

Parece que soy mimado por Spring en el que todo esto es demasiado obvio.


¿Has probado un enfoque como en este enlace? No estoy seguro si createValueBinding() todavía está disponible, pero un código como este debería ser accesible desde un simple servlet antiguo. Esto requiere que bean ya exista.

http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from

FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication(); // May be deprecated ValueBinding binding = app.createValueBinding("#{" + expr + "}"); Object value = binding.getValue(context);


En un servlet, puede obtener beans con alcance de solicitud de la siguiente manera:

Bean bean = (Bean) request.getAttribute("beanName");

y la sesión cercó los frijoles por:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

y frijoles con alcance de aplicación por:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

Si se está ejecutando en un marco / contenedor compatible con inyección de dependencia y el bean es administrado por @Named de CDI en lugar de @ManagedBean de JSF, es aún más fácil:

@Inject private Bean bean;

Independientemente del alcance, cuando estás realmente dentro de FacesContext (es decir, la solicitud HTTP actual ha sido servida a través del FacesServlet ), entonces la forma normal de JSF2 es usar Application#evaluateExpressionGet() :

FacesContext context = FacesContext.getCurrentInstance(); Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

que puede ser convenien de la siguiente manera:

@SuppressWarnings("unchecked") public static <T> T findBean(String beanName) { FacesContext context = FacesContext.getCurrentInstance(); return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class); }

y puede usarse de la siguiente manera:

Bean bean = findBean("bean");

Sin embargo, cuando ya está dentro de @ManagedBean , usar @ManagedProperty es más limpio ya que es más declarativo.

@ManagedProperty("#{bean}") private Bean bean;


Puede obtener el bean gestionado pasando el nombre:

public static Object getBean(String beanName){ Object bean = null; FacesContext fc = FacesContext.getCurrentInstance(); if(fc!=null){ ELContext elContext = fc.getELContext(); bean = elContext.getELResolver().getValue(elContext, null, beanName); } return bean; }


Tenía el mismo requisito.

He usado la forma siguiente para obtenerlo.

Tuve una sesión de ámbito de frijol.

@ManagedBean(name="mb") @SessionScopedpublic class ManagedBean { -------- }

He utilizado el siguiente código en mi método servlet doPost ().

ManagedBean mb = (ManagedBean) request.getSession().getAttribute("mb");

resolvió mi problema


Yo uso el siguiente método:

public static <T> T getBean(final String beanName, final Class<T> clazz) { ELContext elContext = FacesContext.getCurrentInstance().getELContext(); return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName); }

Esto me permite obtener el objeto devuelto de forma tipada.


Yo uso esto:

public static <T> T getBean(Class<T> clazz) { try { String beanName = getBeanName(clazz); FacesContext facesContext = FacesContext.getCurrentInstance(); return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz); //return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean); } catch (Exception ex) { return null; } } public static <T> String getBeanName(Class<T> clazz) { ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class); String beanName = managedBean.name(); if (StringHelper.isNullOrEmpty(beanName)) { beanName = clazz.getSimpleName(); beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1); } return beanName; }

Y luego llama:

MyManageBean bean = getBean(MyManageBean.class);

De esta manera, puede refactorizar su código y rastrear usos sin problemas.