ui重复以显示另一个值,并且方法不在JSF2.2中的托管Bean中调用

时间:2016-02-14 13:29:05

标签: jsf-2.2

<ui:repeat value="#{cc.attrs.bean.foo.foo1}" var="test" varStatus="test1">
    <h:outputText value="#{test.prime}" title="#{test.primeNumber}" />
    <h:outputText value="," rendered="#{!test1.last}" />
</ui:repeat>

我得到一个值example1,example2

现在添加新行后:

<ui:repeat value="#{cc.attrs.bean.foo.foo1}" var="test" varStatus="test1">
    <h:outputText value="#{cc.attrs.bean.testNo(test)}" rendered="#{test1.first}" />
    <h:outputText value="#{test.prime}" title="#{test.primeNumber}" />
    <h:outputText value="," rendered="#{!test1.last}" />
</ui:repeat>

我希望我的输出类似于Hello- example1,example2......

但我无法获得此输出。实际上,不会调用testNo(test)方法。这到底出了什么问题。提前谢谢

Manage bean method
 private String testNo(Test test) {
        List<Test11> type = Lists.newArrayList();
        String some = someService.findTestNumber(test.getSomeNumber());
        return some;

    }

1 个答案:

答案 0 :(得分:0)

您需要制作一个基本的MVC webapp。有很多关于此的教程,但示例总是有帮助:您的模型很简单,CompletedTest的两个实体:

@Entity
public class CompletedTest {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    @OneToMany(fetch=FetchType.EAGER)
    private List<TestResult> results;
    // getters and setters
}

TestResult

@Entity
public class TestResult {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String result;
    // constructors, getters, setters
}

通过model

访问您的service layer
@Stateless
public class TestService {
    @Inject
    private EntityManager em;

    public CompletedTest findTestResultByName(String name) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<CompletedTest> q = cb.createQuery(CompletedTest.class);
        Root<CompletedTest> tr = q.from(CompletedTest.class);
        q.select(tr).where(cb.equal(tr.get("name"), name));
        List<CompletedTest> testResults = em.createQuery(q).getResultList();
        if ( testResults.size() > 0 ) return testResults.get(0);
        else return null;
    }

创建controller以与view

进行交互
@Model
public class TestResultController {
    @Inject
    private TestService testResultService;

    private CompletedTest testResult;

    @PostConstruct
    public void init() {
        testResult = testResultService.findTestResultByName("Test #1");
    }    

最后您的观点是您的JSF页面:

<ui:repeat var="r" value="#{testResultController.testResult.results}" varStatus="tSt">
    <h:outputText value="#{testResultController.testResult.name}: " rendered="#{tSt.first}" />
    <h:outputText value="#{r.result}"/>
    <h:outputText value=", " rendered="#{!tSt.last}" />
</ui:repeat>

如您所见,JSF页面访问Controller bean。在那个bean中是一个PostConstruct注释,它在JSF页面引用bean时执行。 PostConstruct执行初始化bean所需的任何代码,在本例中是对service layer的调用,该调用从数据库加载测试结果。当然,我没有包含一些代码,例如创建测试或显示CompletedTests列表,以便用户可以选择他或她想要的那个。您可以使用表单和下拉列表在单个页面上执行所有操作。此外,每次加载JSF页面时调用数据库都会导致性能不佳,因此有更复杂的机制可以在内存中缓存Entities,但这超出了这个简单的答案。