2012-11-22 3 views
1

시나리오 : AJAX를 사용하여 commandLink를 사용하여 JSF에서 양식의 일부분을 부분적으로 실행하고 렌더링하려고합니다. 이 작업은 AJAX를 통해 수행되므로 내 생각에 ViewScoped는 AJAX 요청 사이의 페이지 구성 요소 값을 보유해야합니다.JSF : ajax 명령 링크로 sessionscoped보기 만 사용할 수 있습니다.

나는 내가 주문 이름 "주문"을 CommandLink는이 (라벨 "주문 입력") 누를 때 InputText]를에서 주문 이름이 명명 된 ArrayList에 추가됩니다 입력하는 입력 상자가 아래의 예를 작성

, "주문"이 CommandLink 아래의 DataTable에 표시됩니다.

CommandLink의 AJAX 요청은 "orderName"변수에 문자열 값을 추가하는 inputBox를 실행합니다. AJAX 요청은 "orderName"값을 "orders"목록에 추가하는 processDataTable() 메소드에 ActionEvent를 보냅니다. 그러면 "orderName"이 널됩니다. 그런 다음 AJAX 요청은 inputText 구성 요소에 null이 아닌 "orderName"및이 요청에서 새로 추가 된 "orderName"을 포함하여 이전에 입력 된 모든 주문을 표시하는 DataTable을 렌더링합니다.

문제점 : SessionScoped 빈을 사용하고 있으면 코드가 작동하지만 ViewScoped 빈을 사용하는 경우에는 작동하지 않습니다. System.out.println()을 코드에 추가하여 어떤 일이 발생했는지 확인합니다. SessionScoped 빈을 만들면 모든 것이 계획대로 작동합니다. inputText 값은 set 메서드를 통해 설정되며 processOrder() 메서드는 "orderName"String을 "orders"List에 추가하고이 추가 된 이름을 표시하기 위해 DataTable을 다시 렌더링합니다. ...

"orderName"값은 InputText 구성 요소의 값으로 설정되지만 ProcessOrder() 메서드에서는 "null"이고 "주문" 목록 및 DataTable null 외에 표시 할 수 없습니다.

"orderName"이 추가되기 전에 order.add ("Some Name")가있는 processOrder()에 orderName을 수동으로 추가하면 "orders"에 { "Some Order", "null"} 및 Orders 로의 변경은 여전히 ​​AJAX로 다시 렌더링되지 않습니다.

모두는 SessionScoped 빈과 함께 훌륭하게 작동하며 ViewScoped 빈으로는 잘 동작하지 않습니까? 또한 ActionLink 대신 CommandLink를 사용하여 Action 특성을 시도했으며 같은 이야기는 SessionScoped와 함께 작동하지만 ViewScoped에서는 작동하지 않습니다.

여기서는 두 가지를 생각할 수 있습니다. 1) AJAX와 CommandLink가 함께 작동하는 방법과 ViewScoped가 어떻게 작동해야하는지에 대한 중요한 포인트를 놓치고 있습니다. 또는 2) 어떤 이유에서 CommandLink에서 AJAX 호출을 제출하는 방법은 클릭 할 때마다 페이지를 새로 고침하여 "orders"목록의 이전 값을 지우는 것입니다. 그러나 이것은 여전히 ​​수동으로 List에 주문을 입력하면 ViewScoped Bean을 사용하는 AJAX 요청에서 렌더링되지 않고 SessionScoped Bean과 함께 렌더링됩니다.

도움말주세요. ?? 여기

내 코드입니다 :

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 
import javax.faces.bean.ViewScoped; 
import javax.faces.event.ActionEvent; 

@Named(value = "testBean") 
@ViewScoped 
public class DataTableTest implements Serializable { 

    private String orderName; 
    private List<String> orders = new ArrayList<String>(); 

    public DataTableTest() {} 

    public String getOrderName() { 
    return orderName; 
    } 

    public void setOrderName(String orderName) { 
    this.orderName = orderName; 
    System.out.println(orderName + " in setOrderName"); 
    } 

    public List<String> getOrders() { 
    return orders; 
    } 

    public String processDataTable(ActionEvent event) { 
    System.out.println(orderName + " before getting added to orders list in  processDataTable"); 
    orders.add(orderName);  // adds the orderName to the orders list, so it can be  viewed in the DataTable 
    orderName = null;   // nulling variable so it displays BLANK once again on  the form 

    // Loops through and displays order names in the orders list 
    for (String name : orders) { 
     System.out.println(name + " in orders List"); 
    } 
    return null; 
    } 
} 

여기 내 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" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <h:head> 
    <title>Test</title> 
    </h:head> 
    <h:body> 
    <h:form> 
     <h:panelGrid columns="3"> 
     <h:outputText value="Enter Order Name >>" /> 
     <h:inputText id="orderName" value="#{testBean.orderName}" label="# {testBean.orderName}" /> 
     <h:message for="orderName" /> 
     </h:panelGrid> 
     <h:commandLink value="Enter Order" actionListener="#{testBean.processDataTable}"> 
     <f:ajax execute="orderName dataTable" render="orderName dataTable" /> 
     </h:commandLink> 
     <h:dataTable id="dataTable" value="#{testBean.orders}" var="order"> 
     <f:facet name="header">Orders Entered Shown Below: </f:facet> 
     <h:column> 
      <h:outputText value="#{order}" /> 
     </h:column> 
     </h:dataTable> 
    </h:form> 
    </h:body> 
</html> 

답변

2

당신은 CDI-콩을 사용하고 있지만, @가 ViewScoped - 주석, 당신이 사용하고 있는지, JSF는 특이하고 CDI 빈에서 작동하지 않습니다.ManagedBean은로 변경하면 해당 옵션이 아닌 경우

당신은 당신이 @ViewScoped 주석이 CDI 별 @ConversationScope 또는 심, 살펴보고하는 JSF-ManagedBean은 대신

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean(name="testBean") 
@ViewScoped 
public class DataTableTest implements Serializable { .. } 

를 사용할 수 있습니다 CDI-Beans에서도 잘 작동합니다.