JSF2 と Weld のスコープについて手に入れることができるものはすべて読んでいます。BalusC がこの件について書いたものはほとんどすべて読んだと思いますが、まだこれを理解することはできません。これを手に入れるために私が自分で一生懸命努力していなかったと思われたくありませんでした。
検索ページと結果ページを備えた非常にシンプルなアプリがあります。(実際のアプリは、この「テスト」アプリよりもはるかに大きく、20 個のパラメーターなどがあります) 2 つの RequestScoped Bean があり、1 つは検索をサポートし、もう 1 つは結果をサポートします。入力を受け取り、クエリを作成し、一致するエンティティのリストを結果に返す EJB が 1 つあります。
1 つの問題と 1 つの質問があります。問題は、検索から結果までのパラメーター値を取得しようとしてもうまくいかないことです。このパターンが頻繁に使用されているのを見てきましたが、それを機能させる試みは失敗しています。
問題は.... 検索ページからクエリの一部として使用される EJB にパラメータを取得する最良の方法は何かということです。EJB からリクエスト パラメータ マップにアクセスすることはできますか? 私はそれを試しましたが、成功しませんでした.それが私がやっていることなのか、それとも単に不可能なのかわかりません. この EJB はステートフルかステートレスか?
Search.xhtml
<html>
<h:head></h:head>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Hostname" />
<h:inputText value="#{deviceSearch.hostname}" />
</h:panelGrid>
<h:commandButton action="#{deviceSearch.navigate('devices')}"
value="Devices Page">
<f:param name="hostname" value="#{deviceSearch.hostname}" />
</h:commandButton>
<h:button value="Reset" immediate="true" type="reset" />
</h:form>
</html
結果.xhtml
<html>
<h:head></h:head>
<f:metadata>
<f:viewParam name="hostname" value="#{deviceResult.hostname}"></f:viewParam>
</f:metadata>
<h:form>
<h:button value="Return to Search" includeViewParams="false" outcome="index" />
</h:form>
<h:dataTable value="#{deviceResult.deviceList}" var="device">
<h:panelGrid columns="2">
<h:outputText value="Device is #{device.name}" />
<h:outputText value="dev id is #{device.devId}" />
<h:outputText value="os is #{device.os}" />
<h:outputText value="platform is #{device.platform}" />
</h:panelGrid>
</h:dataTable>
</html>
DeviceSearch.java
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named
@RequestScoped
public class DeviceSearch {
// Search terms
String hostname;
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
public String navigate(String className) {
if (className.equals("devices")) {
return "result.xhtml?faces-redirect=true";
}
return null;
}
}
DeviceResult.java
@Named
@RequestScoped
public class DeviceResult {
@Inject DeviceService deviceListService;
String hostname;
public void init(){
deviceList = deviceListService.fetchDevices(hostname);
}
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) {
this.hostname = hostname;
}
// Results
List<Devices> deviceList = new ArrayList<Devices>();
public List<Devices> getDeviceList() {
deviceList = deviceListService.fetchDevices(hostname);
return deviceList;
}
}
DeviceService.java
@Stateful
public class DeviceService {
@PersistenceContext
EntityManager em;
public DeviceService() {
}
String hostname;
List<Devices> devicesList = new ArrayList<Devices>();
@SuppressWarnings("unchecked")
public List<Devices> fetchDevices(String hostname) {
Query qry = em.createQuery("SELECT d FROM Devices d WHERE d.name=:name");
qry.setParameter("name", hostname);
devicesList = qry.getResultList();
return devicesList;
}
}