我一直在阅读有关 JSF2 和 Weld 示波器的所有信息。我想我已经阅读了 BalusC 关于这个主题的几乎所有内容,但我仍然无法弄清楚这一点。不想让你们认为我不是靠自己努力得到这个。
我有一个非常简单的应用程序,其中包含搜索页面和结果页面。(真正的应用程序比这个“测试”应用程序大得多,有 20 个参数)有 2 个 RequestScoped bean,一个支持搜索,一个支持结果。有一个 EJB 接受输入、创建查询并将匹配实体的列表返回到结果。
我有 1 个问题和 1 个问题。问题是我试图从搜索到结果中获取参数值的尝试不起作用。我已经看到这种模式经常使用,但我试图让它工作的尝试都失败了。
问题是.... 将参数从搜索页面获取到 EJB 的最佳方式是什么,它们将用作查询的一部分。我应该能够从 EJB 访问请求参数映射吗?我已经尝试过了,但没有成功——不确定这是我正在做的事情,还是根本不应该这样做。这个 EJB 应该是有状态的还是无状态的?
搜索.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;
}
}
设备结果.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;
}
}
设备服务.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;
}
}