我正在尝试编写一个注册新用户的应用程序,并让他们在创建登录详细信息后填写用户配置文件。我需要另一个表单来显示用户输入的确认副本作为验证,之后用户可以在保留配置文件表单之前接受或编辑该条目。
使用以下操作成功创建了用户:
public String makeUser() {
if (nameAvailable = true) {
facade.create(newUser);
} else {
userMessage = "VALIDAION FAILED. Please try again and check that your uder name is not already taken";
}
selUser = newUser;
return "/Main/Users/UserProfile";
}
然后将用户定向到个人资料表格:
<h:form id="proform">
<p:outputPanel id="propan">
<p:panelGrid id="userpro" columns="2">
<p:outputLabel value="Salutation"/>
<p:inputText value="#{userBean.salutation}"/>
<p:outputLabel value="First Name:"/>
<p:inputText value="#{userBean.proFirstName}"/>
<p:outputLabel value="Surame:"/>
<p:inputText value="#{userBean.proSurname}"/>
<p:outputLabel value="Date of Birth:"/>
<p:calendar value="#{userBean.dateofbirth}"/>
</p:panelGrid>
<p:commandLink id="make" value="Create"
action="#{userBean.checkProfile}"
process=":proform:make :proform:userpro"
update="proform:usercheck"/>
// also tried
process="userpro"
update="usercheck"/>
以下checkProfile操作用于创建验证表单,供用户检查其输入(但似乎没有执行):
public void checkProfile() {
newPro = new Enprofile(salutation, proFirstName, proSurname, dateofbirth, selUser);
salutation = getSalutation();
newPro.setSaltuation(salutation);
proFirstName = getProFirstName();
newPro.setFirstname(proFirstName);
proSurname = getProSurname();
newPro.setSurname(proSurname);
dateofbirth = getDateofbirth();
newPro.setDateofbirth(dateofbirth);
selUser = getSelUser();
newPro.setUser(selUser);
System.out.println("New Profile First Name" + newPro.getFirstname());
setNewPro(newPro);
}
用户检查表格是:
<p:panelGrid id="usercheck" columns="2">
<p:outputLabel value="#{userBean.newPro.saltuation}"/>
<p:outputLabel value="#{userBean.newPro.firstname}"/>
<p:outputLabel value="#{userBean.newPro.surname}"/>
<p:outputLabel value="#{userBean.newPro.dateofbirth}"/>
<p:commandLink id="accept" value="Accept"
action="#{userBean.makeProfile}"
ajax="false"/>
</p:panelGrid>
</h:form>
从配置文件表单(id:proform)调用checkProfile操作时,usercheck表单保持空白,控制台不显示任何错误消息。
阅读PF文档和这里的问题,我知道Ajax API包含三个基本功能
PrimeFaces.ajax.Request.handle(cfg);
PrimeFaces.ajax.Response
由于控制台是完全空白的,它会表明ajax请求首先没有被触发,这导致我认为我在checkProfile操作的过程部分做错了什么? /强>
更新:
回应BalusC的评论,请注意我已经完成了以下问题中的所有要点(标记为重复):
commandButton/commandLink/ajax action/listener method not invoked or input value not updated
具体来说我已经调整了第8点
如果您使用的是Ajax,请确保使用UIInput和UICommand 感兴趣的组件由
<f:ajax execute>
或例如<p:commandXxx process>
涵盖。<p:commandLink id="make" value="Create" action="#{userBean.checkProfile}" process=":proform:make :proform:userpro" update=":proform:usercheck"/>
,否则将无法执行/处理。 另请参阅了解PrimeFaces的过程和更新属性。
System.out.println("New Profile First Name" + newPro.getFirstname());
如上所述我认为我已经在流程执行中包含了UIInput和UICommand,但仍然没有运气。控制台甚至不会在checkProfile方法中打印新创建的实例的确认值:
<p:messages id="msg" for="make"
showDetail="true"
autoUpdate="true"/>
关于问题中的其他要点:
3)似乎没有发生任何输入验证错误 以下消息标记显示为空白:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1607)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy$2.visit(FaceletPartialStateManagementStrategy.java:380)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:367)
4)组件不在任何迭代标记内
5)没有为任何明确指定渲染属性 组件**(我假设没有明确指定渲染属性默认值为true ??)**
11)我在commandLink
12)没有调用FacesContext#renderResponse()或
FacesContext #responseComplete()似乎是由任何发生的
事件监听器
在最后一点(13),请求 - 响应链可能已中断(未阻止)FacesServlet请求。如果我在checkProfile操作中将ajax值设置为false,则会生成以下堆栈:
{{1}}
这表明恢复视图状态存在问题,因为以前在创建用户时呈现了页面。我是否需要刷新View状态?
我建议这个问题不重复,错误可能比欺骗中提到的13分更多?感谢