<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;
}
答案 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
,但这超出了这个简单的答案。