これが私の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にアクセスしてuser
をselectedUser
に設定してから、_profile.jsf
_にリダイレクトするにはどうすればよいですか?
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));
// ...
}
=を使用している場合は、サーブレットのフィールドに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をチェックしません。