到目前为止,我一直在使用JSP来显示页面。当用户请求诸如“添加项目”之类的页面时,我将在数组列表中加载所有项目类别,并将其显示为选择框中的选项,如下所示:
<select name="category>
<%
ArrayList<Category> categories = (ArrayList<Category>) request.getAttribute("categories");
for (Category c : data) {
%>
<option value="<%= c.getId() %>"><%= c.getName() %></option>
<%
}
%>
</select>
从“JavaServer Faces 2.0,完整参考”一书中,我了解到:“JSF通过禁止在标记页面中包含Java代码来实施清晰的模型 - 视图 - 控制器分离”。因此,如果有人能告诉我如何使用JSF处理上述任务,我将非常感激,因为我不能像以前那样使用Java代码。
致以最诚挚的问候,
James Tran
答案 0 :(得分:2)
JSF 2.0使用Facelets作为模板方法,简而言之就是带有一些额外元素的XHTML。
虽然从技术上讲,您可以从Facelets执行方法调用,但通常的想法是使用正确的geter / setter方法访问JavaBean以执行数据移动。您可以通过下面的代码段显示:
<h:selectOneMenu value="#{backingBean.selectedCategory}">
<f:selectItems value="#{backingBean.categoryList}"/>
</h:selectOneMenu>
在bean方面,您希望使用faces-config(基本上不鼓励)或CDI或Managed Bean基础结构等机制将bean暴露给JSF。我强烈建议你研究使用SEAM,如果你采用CDI路线,因为它将统一(当前真正奇怪的不同)Managed Bean和CDI框架,因此你可以在CDI中使用JSF范围,并在JSF范围内提供CDI bean。
@ManagedBean(name="backingBean")
@ViewScoped
public class MyJavaBackingBean {
@ManagedProperty("#{param.categories}")
protected List<String> categoryList
public void setSelectedCategory(String value) {
this.selectedCategory = value;
}
public String getSelectedCategory() {
return this.property;
}
...
}
您还可以让getter对值进行惰性初始化(例如,从数据库中提取categoryList),并使用其他一些JSF注释来执行各种初始化任务。
您还可以编写操作方法,这些方法返回表示JSF操作的String(这将被编码到faces-context.xml文件中),以便在返回后执行。还可以在页面呈现,验证和提交的各个阶段调用辅助bean上的阶段侦听器,从而为您提供非常精细的控制。
上述示例中的categoryList不限于课程的基本类型,&lt; f:selectItems&gt;还有一些语法可以写出所选项目的文本版本,因此您可以制作一些非常复杂的表达式,以友好的方式显示每个项目。
答案 1 :(得分:1)
创建一个bean,并通过例如@Named
所以你可以从你的JSF脚本中引用它。然后给该bean一个返回要显示的数据的方法,并从期望该数据的位置的JSF脚本中调用该方法,例如循环结构。
答案 2 :(得分:0)
将要显示的数据存储在Java列表中,并将该列表公开为辅助bean的属性。使用适当的JSF标记来显示该属性。
答案 3 :(得分:0)
在JSF 2.0中,您可以包含标记h:selectOneMenu,您可以在其中获取存储所选项目值的值。 f:selectItems中的值可以是任何对象的集合,大多数时候SelectItem在此对象中声明值对象和要显示的标签。
<h:selectOneMenu value="#{backingBean.selectedvalue}">
<f:selectItems value="#{backingBean.List}"/> </h:selectOneMenu>
如果您需要另一个对象的值和标签,则必须声明
<h:selectOneMenu value="#{backingBean.selectedvalue}">
<f:selectItems value="#{backingBean.ListCar}" var="car" itemLabel="#{car.model}" itemValue="#{car.modelId}"/>
</h:selectOneMenu>