2010-10-13 11 views
10

Aquí es cómo mi trabajo commandLinkCómo acceder a la sesión de bean y gestionado desde servlet

<p:dataTable value="#{myBean.users}" var="item"> 
    <p:column> 
     <h:commandLink value="#{item.name}" action="#{myBean.setSelectedUser(item)}" />  
    </p:column> 
</p:dataTable> 

después en myBean.java

public String setSelectedUser(User user){ 
    this.selectedUser = user; 
    return "Profile"; 
} 

Deje que asume el nombre de usuario es Peter. Luego, si hago clic en Peter, estableceré que el selectedUser sea el Objeto del Usuario de Peter, luego lo redirigiré a la página de perfil, que ahora procesa información del selectedUser. Quiero crear el mismo efecto solo usando <h:outputText>, así que la solicitud GET viene a la mente. Así que hago esto

<h:outputText value="{myBean.text(item.name,item.id)}" /> 

entonces el método text(String name, Long id) acaba de regresar

"<a href=\"someURL?userId=\"" + id + ">" + name + "</a>" 

todo lo que la izquierda es la creación de un servlet, coger ese id, consultar la base de datos para obtener el objeto user, ajustado a selectedUser, la redirigir Así que aquí está mi servlet

public class myServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Long userId = Long.parseLong(request.getParameter("userId")); 
    } 
} 

ahora tengo la id, ¿cómo puedo acceder a mi bean de sesión para consultar la base de datos para el user, entonces el acceso bean administrado para establecer el user a selectedUser, a continuación, redirigir a profile.jsf?

Respuesta

19

JSF almacena beans administrados de ámbito de sesión como atributo de sesión utilizando el nombre de bean administrado como clave. Por lo que el siguiente debería funcionar (suponiendo que JSF ya ha creado el grano antes de la sesión):

MyBean myBean = (MyBean) request.getSession().getAttribute("myBean"); 

Dicho esto, tengo la sensación de que usted está buscando en la dirección equivocada para la solución. También puede simplemente hacer como sigue:

<a href="profile.jsf?userId=123"> 

con lo siguiente en una petición en ámbito de frijol asociado con profile.jsf

@ManagedProperty(value="#{param.userId}") 
private Long userId; 

@ManagedProperty(value="#{sessionBean}") 
private SessionBean sessionBean; 

@PostConstruct 
public void init() { 
    sessionBean.setUser(em.find(User.class, userId)); 
    // ... 
} 
+0

Para 'SessionBean', ¿no tienes que insertar la anotación @EJB? –

+0

También puede. Eso no estaba claro en la pregunta :) Es solo un ejemplo de cómo hacer uso de '@ ManagedProperty' y' @ PostConstruct' para aplicar y procesar los parámetros de solicitud. – BalusC

+0

Lo siento, pero esta podría ser una pregunta estúpida. La forma en que asocio el archivo 'jsf' con el bean administrado es básicamente llamar al método del bean vía' EL'. El bean de 'profile.jsf' tiene una sesión con ámbito. Sé que necesito una solicitud/vista de bean con ámbito, pero ahora no sé cómo asociar ese bean a 'profile.jsf'. El método 'init()' nunca recibe llamadas. –

4

Puede añadir Inyectar y EJB anotaciones en los campos de servlet si su es utilizando un servidor de aplicaciones Java EE 6 como Glassfish v3. A algunos les gusta esto:

@Inject 
private AppManagedBean appmanaged; 
@EJB 
private SessionBean sessbean; 

Recuerde, estas anotaciones son parte de Contexto y Dependecy inyección o CDI, así, se debe agregar el beans.xml descriptor de despliegue.

Pero, si no se puede utilizar el CDI anotaciones, búsqueda para el interfaz BeanManager en java: comp/BeanManager y utilizarlo para acceder (sólo) beans gestionados (dentro de un bean gestionado puede inyectar beans de sesión con @EJB anotación).Recuerde también agregar el descriptor de despliegue beans.xml.

clase de utilidad mirando hacia arriba para java: comp/BeanManager:

package mavenproject4; 

import java.util.Set; 
import javax.enterprise.context.spi.CreationalContext; 
import javax.enterprise.inject.spi.Bean; 
import javax.enterprise.inject.spi.BeanManager; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class ManagedBeans { 

    private static final BeanManager beanManager; 

    static { 
     try { 
      InitialContext ic = new InitialContext(); 
      beanManager = (BeanManager) ic.lookup("java:comp/BeanManager"); 
     } catch (NamingException ex) { 
      throw new IllegalStateException(ex); 
     } 
    } 

    private ManagedBeans() { 
    } 

    public static <T> T getBean(Class<T> clazz, String name) { 
     Set<Bean<?>> beans = beanManager.getBeans(name); 
     Bean<? extends Object> resolve = beanManager.resolve(beans); 
     CreationalContext<? extends Object> createCreationalContext = beanManager.createCreationalContext(resolve); 
     return (T) beanManager.getReference(resolve, clazz, createCreationalContext); 
    } 
} 

Uso de clase de utilidad en processRequest método o equivalente de servlet:

response.setContentType("text/html;charset=UTF-8"); 

AppManagedBean appmanaged = ManagedBeans.getBean(AppManagedBean.class, "app"); 

PrintWriter out = response.getWriter(); 
try { 
    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>Servlet BeanManager</title>"); 
    out.println("</head>"); 
    out.println("<body>"); 
    out.println("<h1>" + appmanaged.getHelloWorld() + "</h1>"); 
    out.println("</body>"); 
    out.println("</html>"); 
} finally { 
    out.close(); 
} 

Ejemplo de bean gestionado con inyectado bean de sesión:

package mavenproject4; 

import java.io.Serializable; 
import javax.annotation.ManagedBean; 
import javax.enterprise.context.ApplicationScoped; 
import javax.inject.Named; 

@ManagedBean 
@ApplicationScoped 
@Named("app") 
public class AppManagedBean implements Serializable { 

    private int counter = 0; 
    @EJB 
    private SessionBean sessbean; 

    public AppManagedBean() { 
    } 

    public String getHelloWorld() { 
     counter++; 
     return "Hello World " + counter + " times from Pachuca, Hidalgo, Mexico!"; 
    } 
} 

No sé si el código en la clase de utilidad es 100% correcto, pero funciona. Además, el código no marca NullPointerException y amigos.

Cuestiones relacionadas