2011-12-14 74 views
0

我是jsf和jpa技术的新手,并尝试使用他们的第一个Web应用程序。在jpa动作后清除jsf窗体

我在我的jsf页面中创建了一个包含所有表格字段的表单。 我希望能够清除表单内的所有输入。 (通过点击'干净'按钮,或在更新/插入/删除操作之后)。

为了清理表单我创建了一个新的对象,它的所有值将被重置,但现在我的问题是当我尝试离开这个页面时(通过点击回来)我不能因为我有一个null字段(它有@notNull),我也不确定这是清除表单的正确方法 - 是否意味着我还需要清除对象?

什么是清理表单的写入方式?它是否也应该清除对象,实体字段(因为表单和对象实际上是相同的)?

这是我的代码: CustomerDetails.htmlx:

<h:body> 
    <h2><h:outputText value="Customer Details"/></h2> 
    <h:form> 
     <h:panelGrid columns="2" bgcolor="#eff5fa"> 
      <h:outputLabel value="Customer ID:"/> 
      <h:inputText id="customerId" value="#{customer.details.customerId}"> 
       <f:ajax event="blur" listener="#{customer.showRecord()}" execute="customerId" render="@all" /> 
      </h:inputText> 
      <h:outputLabel value="Customer Name:"/> 
      <h:inputText id="customerName" value="#{customer.details.name}"/> 
      <h:outputLabel value="Credit Limit:"/> 
      <h:inputText id="creditLimit" value="#{customer.details.creditLimit}"/> 
      <h:outputLabel value="Discount Code"/> 
      <h:selectOneMenu id="discountCode" value="#{customer.details.discount}"> 
       <f:selectItems value="#{customer.discountCodes}"/> 
      </h:selectOneMenu> 
      <h:outputLabel value="Email:"/> 
      <h:inputText id="email" value="#{customer.details.email}"/> 
      <h:outputLabel value="Phone:"/> 
      <h:inputText id="phone" value="#{customer.details.phone}"/> 
      <h:outputLabel value="Fax:"/> 
      <h:inputText id="fax" value="#{customer.details.fax}"/> 
      <h:outputLabel value="Address (Line 1):"/> 
      <h:inputText id="address1" value="#{customer.details.addressline1}"/> 
      <h:outputLabel value="Address (Line 2):"/> 
      <h:inputText id="address2" value="#{customer.details.addressline2}"/> 
      <h:outputLabel value="State:"/> 
      <h:inputText id="state" value="#{customer.details.state}"/> 
      <h:outputLabel value="City:"/> 
      <h:inputText id="city" value="#{customer.details.city}"/> 
      <h:outputLabel value="Zip:"/> 
      <h:inputText id="zip" value="#{customer.details.zip}"/> 
     </h:panelGrid>          
     <h:commandButton value="Clean" id="clean" action="#{customer.clean}"/>    
     <h:commandButton id="back" value="Back" action="#{customer.list}"/> 
     <h:commandButton id="update" value="Update" action="#{customer.update}"/>    
     <h:commandButton id="delete" value="Delete" action="#{customer.delete}"/> 
    </h:form> 
    <p:messages showDetail="true" /> 
</h:body> 

CustomerMBean.java:

public class CustomerMBean { 
@EJB 
private CustomerSessionBean customerSessionBean; 
private Customer customer; 

public CustomerMBean() { 
} 
public List getCustomers() 
{ 
    return customerSessionBean.retrieve(); 
} 
public Customer getDetails() 
{ 
    //Can either do this for simplicity or fetch the details again from the 
    //database using the Customer ID   
    return customer; 
} 
public Customer showRecord() 
{ 
    Integer test = customer.getCustomerId(); 
    customer = customerSessionBean.retrieveByCustomer(customer); 

    if(customer == null) 
    { 
     customer = new Customer(test); 
     customer.setDiscount('H'); 
    } 
    return customer;   
}  
public Customer clean() 
{ 
    customer = new Customer();     
    customer.setDiscount('H'); 
    return customer;   
}  
public String showDetails(Customer customer) 
{ 
    this.customer = customer; 
    return "DETAILS"; 
} 
public String update() 
{  
    customer = customerSessionBean.update(customer); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
      "Sucessful", "Record successfully saved!")); 
    return "SAVED"; 
} 
public String delete() 
{  
    customerSessionBean.delete(customer); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
      "Sucessful", "Record successfully deleted!")); 
    return "DELETE"; 
} 
public String list() 
{ 
    System.out.println("###LIST###"); 
    return "LIST"; 
} 
public javax.faces.model.SelectItem[] getDiscountCodes() 
{ 
    SelectItem[] options = null; 
    List<DiscountCode> discountCodes = customerSessionBean.getDiscountCodes(); 
    if (discountCodes != null && discountCodes.size() > 0) 
    { 
     int i = 0; 
     options = new SelectItem[discountCodes.size()]; 
     for (DiscountCode dc : discountCodes) 
     { 
      options[i++] = new SelectItem(dc.getDiscountCode(), 
        dc.getDiscountCode() + " (" + dc.getRate() + "%)"); 
     } 
    } 
    return options; 
} 

}

任何帮助将appriciated ..

感谢的在提前。

回答

1

要么添加immediate="true"到后退按钮,使所有非直接输入将被忽略:

<h:commandButton id="back" value="Back" action="#{customer.list}" immediate="true" /> 

或者,更好的,只是让一个正常的GET按钮:

<h:button id="back" value="Back" outcome="list" /> 

无关到具体问题,阅读关于新的JSF2隐式导航功能。那些丑陋的大写结果值表明您仍然使用详细的JSF 1.x方法来定义faces-config.xml中的<navigation-case>元素。