web-dev-qa-db-ja.com

サーブレットからマネージドBeanとセッションBeanにアクセスする方法

これが私のcommandLinkのしくみです

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

次に_myBean.Java_で

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

ユーザー名がPeterであると仮定します。次に、Peterをクリックすると、selectedUserがPeterのユーザーオブジェクトに設定され、プロファイルページにリダイレクトされます。プロファイルページは、selectedUserからの情報をレンダリングします。 _<h:outputText>_だけを使って同じ効果を作りたいので、GETリクエストが思い浮かびます。だから私はこれをします

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

次に、text(String name, Long id)メソッドは単に戻ります

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

残っているのは、サーブレットを作成し、そのidをキャッチし、データベースにクエリを実行して、リダイレクトであるuserに設定されたselectedUserオブジェクトを取得することだけです。これが私のサーブレットです

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

これでidができました。セッションBeanにアクセスしてデータベースにuserを照会し、マネージドBeanにアクセスしてuserselectedUserに設定してから、_profile.jsf_にリダイレクトするにはどうすればよいですか?

10
Thang Pham

JSFは、管理対象Bean名をキーとして使用して、セッションスコープの管理対象Beanをセッション属性として格納します。したがって、以下が機能するはずです(JSFがセッションの前にすでにBeanを作成していると仮定します)。

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

そうは言っても、私はあなたが解決策に対して間違った方向を向いていると感じています。次のようにすることもできます。

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

profile.jsfに関連付けられたリクエストスコープのBeanで次のようになります

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

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

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

=を使用している場合は、サーブレットのフィールドにInjectおよび[〜#〜] ejb [〜#〜]アノテーションを追加できます。 Java Glassfishv3のようなEE6アプリケーションサーバー。次のようなものもあります。

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

覚えておいてください、これらのアノテーションはContext and Dependecy Injectionまたは[〜#〜] cdi [〜#〜]したがって、beans.xmlデプロイメント記述子を追加する必要があります。

ただし、[〜#〜] cdi [〜#〜]アノテーションを使用できない場合は、BeanManagerを検索してください。 Java:comp/BeanManagerのインターフェースで、アクセスに使用します(のみ)マネージドBean(インジェクトでき​​るマネージドBean内セッションBean@ EJBアノテーション)。また、beans.xmlデプロイメント記述子を追加することを忘れないでください。

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

サーブレットのprocessRequestメソッドまたは同等のユーティリティクラスの使用法:

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

注入されたセッションBeanを使用したマネージドBeanの例:

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

ユーティリティクラスのコードが100%正しいかどうかはわかりませんが、機能します。また、コードはNullPointerExceptionとfriendsをチェックしません。