ui 重复显示一个值并且方法未在 JSF2.2 中的托管 Bean 中调用
ui repeat to show one more value and method is not invoking in managed Bean in JSF2.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;
}
您需要制作一个基本的 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
}
通过 service layer
访问您的 model
@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
,但这超出了这个简单的答案。
<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;
}
您需要制作一个基本的 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
}
通过 service layer
model
@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
,但这超出了这个简单的答案。