2011-12-14 2 views
0

Я новичок в jsf и jpa-технологиях и пытаюсь с ними подключиться.clear jsf form after jpa action

Я создал форму внутри моей страницы jsf, которая включает в себя все поля таблицы. Я хочу, чтобы убрать все входы внутри формы. (нажатием кнопки «clean» или после действия update/insert/delete).

Inorder для очистки формы Я создал новый объект, который все его значения будут сброшены, но теперь моя проблема заключается в том, когда я пытаюсь уйти с этой страницы (щелкнув назад), я не могу, потому что у меня есть нуль поле (которое имеет @notNull), а также я действительно не уверен, что это правильный способ очистить форму - значит ли это, что мне нужно очистить объект?

Что такое способ записи формы для очистки? должен ли он также очистить объекты, сущности полей (beacause форма и объект на самом деле то же самое)?

Это мой код: 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 ..

Thank в В Advance.

ответ

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 для определения <navigation-case> элементов в faces-config.xml.