0

我一直在阅读有关 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;
    }
}
4

0 回答 0