我在Liferay中使用JSF(Primefaces)并遇到一些问题。
我有一个人员列表(dataTable),带有编辑按钮,用于dataTable中的每一行。用户具有与其他行不同的属性,例如足球,篮球,网球,每个用户都有这些类别。根据这些属性,需要填写不同的页面/表单。所以,我有一个ManagedBean(PendingRequest.java),它像调度程序/切换器一样,连续接收有关该人的数据并将用户切换到适当的表单。表单有支持bean(例如,页面signFootballer.xhtml有bean Footballer.java,在页面signFootballer.xhtml中有字段的getter和setter)。 因此,用户单击表格中某行的“编辑”按钮,方法dispatchRequest开始运行并检查类别(足球,...)并根据类别初始化类足球运动员的新对象并将其属性设置为填充表单(例如setName) (“John”)等...因为它是应用程序的“编辑用户”功能。
public String dispatchRequest(Person p) {
if (p.getCategory.equals("Tennis")) {
return "NOT_OK";
} else if (p.getCategory().equals("Basketball")) {
return "NOT_OK";
} else if (p.getCategory().equals("Football")) {
Footballer f = new Footballer();
f.setName("John");
f.setLastName("Doe");
return "OK";
} else {
return "NOT_OK";
}
}
之后,我将通过faces-config.xml切换到signFootballer.xhtml。它正确,但问题是我的表格是空的。
我知道这不是正确的方法,但我需要建议,你能否告诉我如何从dataTable更新某些行的最佳方法,记住我需要按类别划分不同的行,然后打开相应的页面以及将填充表单的相应辅助bean。因为我不确定使用此Dispatcher类是否可行。
修改 @BalusC,这不是真实的情况,只是展示了帮助您理解我的问题的示例。我有3种不同的形式,具体取决于FootballPlayer,BasketballPlayer和TennisPlayer的情况。
signFootballer.xhtml
<h:form enctype="multipart/form-data" id="form">
<div id="container">
<div class="divs">
<p style="margin-left: 22%; width:60%; font-size: 20px; font-weight: bold">Sign contract</p>
<table>
<tr>
<td>
<p:outputLabel for="name" value="First name:*" styleClass="f_text" />
<p:inputText id="name" value="#{footballer.name}" required="true" />
</td>
<td>
<p:outputLabel for="surname" value="Last name:" styleClass="f_text" />
<p:inputText id="surname" value="#{footballer.surname}" required="true" />
</td>
</tr>
</table>
</div>
<div class="submit">
<p:commandButton value="Send" id="submit" update="err_msg1 err_msg2 err_msg3" action="#{Footballer.submitForm}" styleClass="button" />
</div>
</div>
</h:form>
Footballer.java(删除其他变量和方法)
@ManagedBean
@ViewScoped
public class Footballer {
private String name;
private String surname;
public void submitForm() {
// Validate data and save in database
}
// GETTERS AND SETTERS
pendingRequest.xhtml(它是尚未确认的请求列表 - 来自数据库)
<h:form id="form">
<h:panelGroup id="table-wrapper">
<p:dataTable id="dt" var="req" value="#{pendingRequest.requestList}">
<f:facet name="header">
Pregled prijava
</f:facet>
<p:column headerText="Id">
<h:outputText value="#{req.id}" />
</p:column>
<p:column headerText="Category">
<h:outputText value="#{req.category}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{req.name}" />
</p:column>
<p:column headerText="Prezime">
<h:outputText value="#{req.surname}" />
</p:column>
<p:column headerText="Delete/Edit" width="10%" style="text-align:center" >
<p:commandLink immediate="true" update=":form:table-wrapper" action="#{pendingRequest.deleteRecord(p)}"/>
<p:commandLink immediate="true" action="#{pendingRequest.dispatchRequest(p)}" style="margin-left:5px;"/>
</p:column>
</p:dataTable>
</h:panelGroup>
</h:form>
PendingRequests.java(在用户选择编辑待处理请求列表中的某些请求后运行该方法的类)
@ManagedBean
@ViewScoped
public class PendingRequest {
public List<Requests> requestList = new ArrayList<Requests>(); // "Requests" is entity class generated from database
public List<Requests> getRequestList() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
//save example - without transaction
Session session = sessionFactory.openSession();
session.beginTransaction();
List<Requests> tempList = session.createCriteria(Requests.class).list();
session.getTransaction().commit();
return tempList;
}
public void setRequestList(List<Requests> requestList) {
this.requestList = requestList;
}
public void deleteRecord(Requests p) {
Session session = HibernateUtil.getSessionFactory().openSession();
try {
session.beginTransaction();
session.delete(p);
session.getTransaction().commit();
} catch (HibernateException ex) {
ex.printStackTrace();
session.getTransaction().rollback();
}
}
public void dispatchRequest(Requests p) {
if (p.getCategory().equals("Football")) {
//TRANSFER ID OF THAT REQUEST TO Footballer class to populate fields in signFootball.xhtml
} else if (p.getCategory.equals("Basketball")) {
//TRANSFER ID OF THAT REQUEST TO BasketballPlayer class to populate fields in signBasketballPlayer.xhtml
} else if (p.getCategory().equals("Tennis")) {
//TRANSFER ID OF THAT REQUEST TO TennisPlayer class to populate fields in signTennisPlayer.xhtml
} else {
System.out.println("OTHER...");
}
}
方法dispatchRequests正在检查请求的类别(足球,篮球,网球),并根据它,需要打开适当的表格并填写值。这与新请求创建的形式相同,现在它将填充数据库中的数据。
因此,如果用户点击足球运动员的请求,它可能需要在足球运动员类构造函数中传递请求ID?因为需要在呈现页面之前设置字段?
这个故事的那部分对我来说不是很清楚。我是JSF的新手,如果你能给我一些如何编辑功能的建议我会非常感激吗?
答案 0 :(得分:0)
注意:这只是一个想法。
创建内联dataTable编辑器就足够了。在编辑按钮上调用bean actionListener以基于dataTable索引提取用户对象。检查其类别并填充相关的类对象。然后获取对象属性以填充字段。基于属性的渲染按钮以识别操作。在更新/保存按钮上调用另一个bean actionListener并将数据转发到服务层。成功操作后显示相关信息。