2010-10-13 5 views
10

Oto jak mój commandLink pracaJak uzyskać dostęp do zarządzanego fasoli i sesji fasoli z serwletu

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

następnie w myBean.java

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

Załóżmy nazwa użytkownika jest Peter. Następnie, jeśli kliknę na Peter, ustawię selectedUser na obiekt użytkownika Peter, a następnie przekierujemy na stronę profilu, która teraz wyświetla informacje z selectedUser. Chcę stworzyć ten sam efekt tylko przy użyciu <h:outputText>, więc przychodzi na myśl żądanie GET. Więc robię to

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

wówczas metoda text(String name, Long id) prostu wrócić

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

wszystko, lewa jest stworzenie apletu, złapać że id, zapytań do bazy danych, aby uzyskać obiekt user, ustawiony na selectedUser, z przeadresować. Więc tutaj jest mój aplet

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

Teraz mam id, jak mogę uzyskać dostępu do sesji fasoli do przeszukiwania bazy danych dla user, następnie uzyskać dostęp udało fasola ustawić user do selectedUser, a następnie przekierować do profile.jsf?

Odpowiedz

19

JSF przechowuje zogniskowane ziarna o rozmiarze sesji jako atrybuty sesji, używając nazwy fasoli zarządzanej jako klucza. Więc dodaje powinien działać (zakładając, że JSF stworzył już przed fasoli w sesji):

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

Powiedział, że mam wrażenie, że jesteś patrząc w złym kierunku do rozwiązania. Można też po prostu zrobić jak następuje:

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

z następujących czynności w żądaniu scoped fasola związane z 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

Dla 'SessionBean', nie musisz wstrzykiwać adnotacji @EJB? –

+0

Może również. Nie wynikało to z pytania :) To tylko przykład kickoffa, jak wykorzystać '@ ManagedProperty' i' @ PostConstruct', aby zastosować i przetworzyć parametry zapytania. – BalusC

+0

Przykro mi, ale to może być głupie pytanie. Sposób, w jaki kojarzę plik 'jsf' z zarządzanym komponentem bean, to po prostu wywoływanie metody komponentu bean przez' EL'. Komponent bean dla 'profile.jsf' ma zasięg sesji. Wiem, że potrzebuję bean widoku o żądaniu/widoku, ale teraz nie wiem jak powiązać tę fasolę z 'profil.jsf'. Metoda 'init()' nigdy nie uzyska połączenia. –

4

Możesz dodać Inject i EJB adnotacji w dziedzinach serwletu jeśli są przy użyciu serwera aplikacji Java EE 6, takiego jak Glassfish v3. Niektórzy tak:

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

Pamiętaj, adnotacje te są częścią kontekst i Dependecy wtrysk lub CDI, więc należy dodać beans.xml deskryptor wdrażania.

Ale, jeśli nie można użyć CDI adnotacje odnośnika do interfejsu BeanManager na java: comp/BeanManager i użyć go do dostępu (tylko) zarządzanych fasoli (wewnątrz zarządzanego fasoli możesz wprowadzić ziaren sesji z adnotacją @EJB).Należy również pamiętać o dodaniu deskryptora wdrażania deskryptora fasoli.xml.

Klasa narzędzi patrząc na 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); 
    } 
} 

Zastosowanie klasy użytkowego w serwletu processRequest Metoda lub równoważne:

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(); 
} 

Przykład udało fasoli z wstrzykiwaniem ziarno sesyjne:

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!"; 
    } 
} 

Nie wiem, czy kod w klasie użytkowej jest w 100% poprawny, ale działa. Również kod nie sprawdza NullPointerException i przyjaciół.