gpt4 book ai didi

jsf - Primefaces 数据表选择对象

转载 作者:行者123 更新时间:2023-12-04 21:20:45 26 4
gpt4 key购买 nike

我对 Primefaces 数据表有疑问,尤其是对选择对象。

在我的以下代码中,对于绑定(bind)到带有选择的数据表的变量“选定问题”,我总是为空。

jsf如下:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">

<ui:composition template="mainTemplate.xhtml">
<ui:define name="contentTitle">Your Questions</ui:define>
<ui:define name="content">
<h:form id="formAllQuestion">
<p:growl id="allQuestionGrowl" showDetail="true"/>

<p:dataTable id="allQuestionsTable" var="question" value="#{allQuestionBean.allQuestionDataHelper}" paginator="true" rows="10"
selection="#{allQuestionBean.selectedQuestion}" selectionMode="single">

<p:ajax event="rowSelect" listener="#{allQuestionBean.onRowSelect}" update=":formAllQuestion:AnswerToQuestionDialogTable :formAllQuestion:allQuestionGrowl"
oncomplete="questDialog.show()"/>
<p:ajax event="rowUnselect" listener="#{allQuestionBean.onRowUnselect}" update=":formAllQuestion:allQuestionGrowl"/>


<f:facet name="header">Select a Row to display your Question Details</f:facet>

<p:column headerText="QuestionID">
#{question.questionId}
</p:column>
<p:column headerText="Question Name">
#{question.questionName}
</p:column>
<p:column headerText="Question Description">
#{question.questionText}
</p:column>
<p:column headerText="Question Short Description">
#{question.questionShortText}
</p:column>
<p:column headerText="Author">
#{question.professor.profSurename} #{question.professor.profName}
</p:column>
</p:dataTable>


<p:dialog header="Question Details" widgetVar="questionDialog" resizable="true" id="questDialog"
showEffect="fade" hideEffect="fade" modal="true">
<p:dataTable id="AnswerToQuestionDialogTable" var="answer" value="#{allQuestionBean.answers}">

<f:facet name="header">
Hier kommt der QR_Code rein!

#{allQuestionBean.selectedQuestion.questionId} - #{allQuestionBean.selectedQuestion.questionName}
</f:facet>

<p:column headerText="Answer">
<h:outputText value="#{answer.answerText}"/>
</p:column>
<p:column headerText="Counts For this Answer">
<h:outputText value="Bis jetz noch nix!"/>
</p:column>
</p:dataTable>
</p:dialog>


</h:form>
</ui:define>
</ui:composition>

</html>

以及相关的 Bean 类(AllQuestionBean.class):
 @ManagedBean(name = "allQuestionBean")
@ViewScoped
public class AllQuestionBean implements Serializable {


private static final long serialVersionUID = 7038894302985973905L;

@ManagedProperty(value = "#{questionDAO}")
private QuestionDAO questionDAO;

@ManagedProperty(value = "#{profSession.professor}")
private Professor professor;

@ManagedProperty(value = "#{answerDAO}")
private AnswerDAO answerDAO;

@ManagedProperty(value = "#{answeredDAO}")
private AnsweredDAO answeredDAO;


private List<Question> questions;
private Question selectedQuestion;
private List<Answer> answers;
private AllQuestionDataHelper allQuestionDataHelper;


public AllQuestionBean(){
System.out.println("Starting Bean: "+this.getClass().getName());
}

@PostConstruct
public void initVariables(){
questions = questionDAO.readByProfessor(professor);
}

public void onRowSelect(SelectEvent event) {



FacesMessage msg = new FacesMessage("Question Selected", selectedQuestion.getQuestionId()+" -- "+selectedQuestion.getQuestionName());

FacesContext.getCurrentInstance().addMessage(null, msg);
}

public void onRowUnselect(UnselectEvent event) {

FacesMessage msg = new FacesMessage("Question Selected", selectedQuestion.getQuestionId()+" -- "+selectedQuestion.getQuestionName());

FacesContext.getCurrentInstance().addMessage(null, msg);
}


//---GETTER and SETTER

public AllQuestionDataHelper getAllQuestionDataHelper() {
allQuestionDataHelper = new AllQuestionDataHelper(questions);
return allQuestionDataHelper;
}


public void setAllQuestionDataHelper(AllQuestionDataHelper allQuestionDataHelper) {
this.allQuestionDataHelper = allQuestionDataHelper;
}



public QuestionDAO getQuestionDAO() {
return questionDAO;
}

public void setQuestionDAO(QuestionDAO questionDAO) {
this.questionDAO = questionDAO;
}

public Professor getProfessor() {
return professor;
}

public void setProfessor(Professor professor) {
this.professor = professor;
}

public AnswerDAO getAnswerDAO() {
return answerDAO;
}

public void setAnswerDAO(AnswerDAO answerDAO) {
this.answerDAO = answerDAO;
}

public AnsweredDAO getAnsweredDAO() {
return answeredDAO;
}

public void setAnsweredDAO(AnsweredDAO answeredDAO) {
this.answeredDAO = answeredDAO;
}

public List<Question> getQuestions() {
return questions;
}

public void setQuestions(List<Question> questions) {
this.questions = questions;
}

public Question getSelectedQuestion() {
System.out.println("getSelectedQuestion");
return selectedQuestion;
}

public void setSelectedQuestion(Question selectedQuestion) {
System.out.println("Set selected Question: "+selectedQuestion);
this.selectedQuestion = selectedQuestion;
}

public List<Answer> getAnswers() {
answers = answerDAO.getAllAnswersForQuestion(selectedQuestion);
return answers;
}

public void setAnswers(List<Answer> answers) {
this.answers = answers;
}
}

数据模型:
public class AllQuestionDataHelper extends ListDataModel<Question> implements SelectableDataModel<Question> {


public AllQuestionDataHelper() {
}

public AllQuestionDataHelper(List<Question> list) {
super(list);
}

@Override
public Object getRowKey(Question question) {
if(!(question == null)){
System.out.println("Your Questions --> Getting RowKey");
System.out.println("RowKey: "+question);
System.out.println("RowKey: "+question.getQuestionId());
}else{
System.out.println("Warning Row Key is null");
}
return question.getQuestionId();
}

@Override
public Question getRowData(String rowKey) {
System.out.println("Your Questions --> Getting RowData");
System.out.println("RowData: "+rowKey);

List<Question> questionList = (List<Question>) getWrappedData();

for(Question q : questionList){
if(rowKey.equals(q.getQuestionId())){
System.out.println("Returning "+q.getQuestionId());
return q;
}
}
return null;
}
}

我调试了一些运行并提到 AllQuestionBean.class 中的变量“selectedQuestion”从未设置。会说,“onRowSelect”中的事件变量包含一个 NULL 对象。
如您所见,*.xhtml 中有两个数据表。第一个将正常加载,没有问题。 Bean 的 onClick-Method 应该使用第二个数据表启动一个对话框,但会以一个 Nullpointer 退出。

对于数据表,我遵循 Primefaces 的教程 (http://www.primefaces.org/showcase-labs/ui/datatableRowSelectionInstant.jsf)

最佳答案

使用rowKey p:dataTable 上的属性.
rowKey是一个唯一标识符,可帮助 Primefaces 引擎根据选择返回所选对象。

通常是您提供给 rowKey 的值属性是您要填充到 p:dataTable 的 POJO 的唯一属性.

如果您的 POJO 中没有任何此类唯一字段。然后制作一个总是有用的,例如:int rowId; ,您可以在将它们添加到列表时将其递增并放入 POJO。

关于jsf - Primefaces 数据表选择对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com