私はprimefaces 3.3を使用しており、ページに3つのコンポーネントがあります:データテーブル、編集エリア、コマンドボタンです。奇妙な問題が 1 つあります。ページを開くと、データがデータ テーブルに表示されますが、いずれかのボタンをクリックすると、対応するボタン コードが呼び出されていないことがデバッガーによって示されます。ただし、テーブル内の任意のレコードをクリックすると、編集領域が表示され、ボタンをクリックすると機能し始めます。以下はページコードです。すべてのコンテンツを1つのフォームに入れるなど、さまざまなオプションを試しましたが、どれも機能しません。助けてください
<ui:define name="content">
<h:form id="form" prependId="false">
<p:growl id="growl" showDetail="true"/>
<p:dataTable id="table" var="var"
value="#{regions.list}"
selection="#{regions.selected}"
rowKey="#{var.idRegion}"
selectionMode="single"
paginator="true" rows="10"
paginatorPosition="bottom"
>
<p:ajax event="rowSelect" listener="#{regions.onRowSelect}" update=":frmEdit :form:growl" />
<p:ajax event="rowUnselect" listener="#{regions.onRowUnSelect}" update=":frmEdit :form:growl"/>
<f:facet name="header">
List of Regions
</f:facet>
<p:column sortBy ="#{var.shortName}">
<f:facet name="header">Short Name</f:facet>
<h:outputText value="#{var.shortName}" />
</p:column>
<p:column sortBy ="#{var.fullName}">
<f:facet name="header">Full Name</f:facet>
<h:outputText value="#{var.fullName}" />
</p:column>
<p:column sortBy ="#{var.created}">
<f:facet name="header">Created On</f:facet>
<h:outputText value="#{var.created}" />
</p:column>
</p:dataTable>
</h:form>
<p:panel header="Add/Edit Properties">
<h:form id="frmEdit">
<h:panelGrid id="display" columns="6" cellpadding="4" >
<h:outputText value="Short Name:" />
<h:inputText value="#{regions.selected.shortName}" />
<h:outputText value="Full Name:" />
<h:inputText value="#{regions.selected.fullName}" />
</h:panelGrid>
</h:form>
<h:form id="frmBtn">
<h:panelGrid id="command" columns="6" cellpadding="4" >
<p:commandButton id="new" value="New" actionListener="#{regions.add()}" process="@this :frmEdit" update="result :frmEdit :form" >
</p:commandButton>
<p:commandButton id="save" value="Save" actionListener="#{regions.save()}" process="@this :frmEdit" update="result :frmEdit :form" >
</p:commandButton>
<p:commandButton id="delete" value="Delete" actionListener="#{regions.delete()}" process="@this :frmEdit" update="result :frmEdit :form" >
</p:commandButton>
<p:commandButton id="refresh" value="Refresh" actionListener="#{regions.refresh()}" process="@this :frmEdit" update="result :frmEdit :form" >
</p:commandButton>
</h:panelGrid>
<p:messages id="result" showDetail="true" autoUpdate="true"/>
</h:form>
</p:panel>
</ui:define>
以下は JSF MB コードです。
@ManagedBean
@ViewScoped
public class Regions implements Serializable {
private List<Region> list;
private Region selected;
private @EJB RegionFacade esvc; //entity services
private FacesContext context;
private FacesMessage msg;
private boolean newRec =false;
@SuppressWarnings("OverridableMethodCallInConstructor")
public Regions() {
// context = FacesContext.getCurrentInstance();
// HttpSession session = (HttpSession)context.getExternalContext().getSession(false);
// Users user = (Users)session.getAttribute("user");
// if (user != null)
// init();
// else {
// msg = new FacesMessage("Session Expired, Return to Login Page");
// context.addMessage(null, msg);
// }
}
@PostConstruct
public void init(){
try{
list = esvc.findAll();
}catch (Exception ex){
System.out.println(ex);
}
}
public String add(){
selected = new Region();
newRec = true;
return "region";
}
public String save(){
int result;
if (newRec){
result=esvc.insert(selected);
newRec=false;
}
else{
result=esvc.update(selected);
}
refresh();
context = FacesContext.getCurrentInstance();
if (result>0){
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Saved");
refresh();
}else{
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Saved");
}
context.addMessage(null, msg);
return "region";
}
public String delete(){
int result;
result= esvc.delete(selected);
context = FacesContext.getCurrentInstance();
refresh();
if (result>0){
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Success", "Record Deleted");
refresh();
}else {
msg = new FacesMessage(FacesMessage.SEVERITY_INFO,"Failure", "Record not Deleted");
}
context.addMessage(null, msg);
return "region";
}
public void refresh(){
selected=null;
list=getList();
}
public List<Region> getList() {
return list;
}
public Region getSelected() {
return selected;
}
public void setSelected(Region selected) {
this.selected = selected;
}
public void onRowSelect(SelectEvent event) {
context = FacesContext.getCurrentInstance();
msg = new FacesMessage("Selected", ((Region) event.getObject()).getFullName());
context.addMessage(null, msg);
}
public void onRowUnSelect(UnselectEvent event) {
context = FacesContext.getCurrentInstance();
selected=null;
}
}