ui repeat to show one more value and method is not invoking in managed Bean in JSF2.2

跟風遠走 提交于 2019-12-11 20:38:20

问题


<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>

I am getting a value example1,example2

Now after adding a new line:

<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>

I want my output something like this Hello- example1,example2......

But I am not able to get this output. In fact testNo(test) method is not invoked. What exactly is getting wrong over here. Thank you in advance

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

    }

回答1:


You need to make a basic MVC webapp. There are many tutorials about this, but example always helps: Your model is simple, two entities for a 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
}

and a TestResult:

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

Access your model through a 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;
    }

The create a controller to interface to your view:

@Model
public class TestResultController {
    @Inject
    private TestService testResultService;

    private CompletedTest testResult;

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

and finally your view is your JSF page:

<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>

As you can see, the JSF page accesses the Controller bean. In that bean is a PostConstruct annotation, which gets executed when the JSF page references the bean. The PostConstruct executes any code you need to initialize the bean, in this case a call to the service layer which loads a test result from the database. Of course, there is a bit of code I didn't include, such as creating a test or showing a list of CompletedTests so the user can choose which one he or she wants. You can do all that on a single page with a form and a drop-down list. Further, calling to the database every time the JSF page is loaded will result in poor performance, so there are more sophisticated mechanisms for caching Entities in memory, but that is beyond this simple answer.



来源:https://stackoverflow.com/questions/35392360/ui-repeat-to-show-one-more-value-and-method-is-not-invoking-in-managed-bean-in-j

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!