Primefaces 3.0 문제.M2 OneMenu 선택Ajax 동작
두 개의 SelectOne Menu 컨트롤을 구현하는 데 문제가 있습니다. 두 번째 컨트롤의 데이터는 첫 번째 컨트롤에서 선택한 것에 따라 달라집니다.primeFaces 쇼케이스의 예는 제가 구현하고자 하는 것과 거의 같습니다. http://www.primefaces.org/showcase-labs/ui/pprSelect.jsf
데이터베이스에서 데이터를 가져와야 한다는 것만 빼면요
위의 예는 동일한 프로젝트에서 올바르게 작동하고 있습니다.GlassFish 3.1과 PrimeFaces 3.0으로 NetBeans 7.0을 사용하고 있습니다.M2, 최근 하락 (2011년 6월 20일).
JSF 페이지의 소스코드와 관리되는 bean이 첨부되어 있습니다.
<?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:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head><title>Facelet Title</title></h:head>
<h:body>
<p:log />
<center>
<h:form>
<h:outputText value="State: "/>
<p:selectOneMenu id="selectState" value="#{stateCityBean.selectedStateArray}">
<f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
<p:ajax update="selectCity" listener="#{stateCityBean.updateCityMap}"/>
<f:selectItems value="#{stateCityBean.stateMap}" />
</p:selectOneMenu>
<p></p>
<h:outputText value="City: "/>
<p:selectOneMenu id="selectCity" value="#{stateCityBean.selectedCityArray}">
<f:selectItem itemLabel="Select Any" itemValue="Empty String"/>
<f:selectItems value="#{stateCityBean.cityMap}"/>
</p:selectOneMenu>
</h:form>
</center>
</h:body>
도시빈.자바
package com.xyz.mbeans;
import com.iwizability.priceinfo.dao.*;
import com.iwizability.priceinfo.pojo.*;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.ValueChangeEvent;
@ManagedBean
@SessionScoped
public class StateCityBean {
private String selectedStateArray;
private Map<String, State> StateMap;
private Map<String, City> CityMap;
private String selectedCityArray;
public StateCityBean() {
System.out.println("Inside.............. ");
StateMap = new LinkedHashMap<String, State>();
CityMap = new LinkedHashMap<String, City>();
}
public String getSelectedStateArray() {return selectedStateArray;}
public void setSelectedStateArray(String selectedStateArray) {this.selectedStateArray = selectedStateArray;}
public Map<String, State> getStateMap() {
StateDaoImpl stateObj = new StateDaoImpl();
StateMap = stateObj.getState();
return StateMap;
}
public void setStateMap(Map<String, State> stateArray) {this.StateMap = stateArray;}
public String getSelectedCityArray() {return selectedCityArray;}
public void setSelectedCityArray(String selectedCityArray) {this.selectedCityArray = selectedCityArray;}
public Map<String, City> getCityMap() {
CityDaoImpl cityObj = new CityDaoImpl();
int stateId = 0;
if (selectedStateArray != null && !selectedStateArray.equals("")) {
stateId = StateMap.get(selectedStateArray).getId();
}
CityMap = cityObj.getCity(stateId);
return CityMap;
}
public void setCityMap(Map<String, City> CityArray) {
this.CityMap = CityArray;
}
public void updateCityMap() {
CityDaoImpl cityObj = new CityDaoImpl();
int stateId = 0;
if (selectedStateArray != null && !selectedStateArray.equals("")) {
stateId = StateMap.get(selectedStateArray).getId();
this.CityMap = cityObj.getCity(stateId);
}
}
}
디버깅 시 updateCityMap 메서드가 호출되지만 SelectedStateArray 변수가 null임을 알 수 있습니다.바인딩된 CityMap 변수의 값을 강제로 변경해도 SelectCity 드롭다운이 업데이트되지 않습니다.
짐작하셨겠지만, 저는 JSF가 처음이지만, 태그 라이브러리의 개발 버전에서 스틸을 사용하고 있기 때문에 문제가 더 심각합니다.
당신이 프로젝트에서 설명한 것과 똑같은 상황을 위해 데모를 만들었습니다.나는 주와 도시가 있습니다.<p:selectOneMenu/>
내 페이지의 요소들.주를 선택하면 도시가 업데이트됩니다.다른 상태를 선택하면 해당 상태에 존재하지 않을 수 있으므로 도시가 지워집니다.
다른 점은 제가 사용한다는 것입니다.<p:ajax event="change" update="cities, cs"/>
요소를 업데이트하고, 상태가 다른 경우 도시를 업데이트하는 actionListener를 실행합니다.
<p:selectOneMenu id="states" value="#{dataBean.selectedState}"
valueChangeListener="#{dataBean.stateChangeListener(event)}"
style="width: 150px;">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItems value="#{dataBean.states}"/>
<p:ajax event="change" update="cities, cs"/>
</p:selectOneMenu>
<h:outputLabel value="City:" for="cities"/>
<p:selectOneMenu id="cities"
value="#{dataBean.selectedCity}"
style="width: 150px;">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItems value="#{dataBean.cities}"/>
<p:ajax event="change" update="cs" />
</p:selectOneMenu>
전체 프로젝트와 데모 코드는 제 블로그에서 확인할 수 있습니다.저는 이 게시물을 보고 제 프로젝트를 올리기로 결정했습니다.[blog]:http://javaevangelist.blogspot.com/2012/07/primefaces-ajax-enabled.html
프라임페이스들은 뭔가 다른 시도를 하고 있습니다.왜 그런지 모르겠습니다.우선 이 릴리스들이 안정적이지 않다는 것을 알아야 합니다.파이어버그로 코드를 분석하면 이것을 밀어넣을 것입니다.첫 번째 콤보 도시를 변경할 때 ID 국가 및 도시가 있는 두 콤보를 수정했지만 도시 콤보의 ID가 city_input으로 변경되면 _input 접두사가 추가된다고 가정합니다.내가 prime faces source code를 분석할 때._input 또는 _panel을 추가하여 id를 변경할 경우 traverse tree와 같은 코드가 있습니다.그래서 두 번째로 콤보를 바꾸면.업데이트 도시라고 말씀하신 것을 제외하고는 모든 것이 완벽하게 작동하지만, 새로운 idities_input이 있기 때문에 idities를 가진 구성요소가 없습니다.그래서 당신의 아약스가 제대로 작동하지 않습니다.그러나 그들은 이 버그를 3.0m4 또는 릴리스 이후에 수정합니다.
이것이 문제입니다.이 문제의 또 다른 예는 누군가 이것을 위해 지라를 여는 버그입니다.spring security j_username, j_password를 사용하는 경우 j_username_input j_password_input으로 로그인을 변경합니다.따라서 이것은 표준을 깨고 코드는 두 번째 ajax 요청에서 작동하지 않습니다.이게 도움이 되길..
사자의 말에 귀를 기울입니다.3.m4 페이지에서 변경된 프라임페이스 네임스페이스가 이를 사용합니다.xmlns:p="http://primefaces.org/ui "
저는 당신이 했던 것과 같은 방식으로 jsf 프로젝트에서 state -> city select를 했습니다.제가 찾은 유일한 차이점은 다음과 같습니다.
- 나의
p:ajax
가 있습니다.change
트:<p:ajax event="change" update="city" listener="#{contatoMB.filterCities}" />
. - 나의
p:ajax
다 .f:selectItems
하지만 이게 문제가 되어서는 안됩니다. - 나의
f:selectItems
은 다음과 같습니다.List<javax.faces.model.SelectItem>
그리고 a가 아닌Map<String, City>
를 요?SelectItem
지도 대신에 s? - 와 prependId 를 가지고 .
<h:form id="contact-form" prependId="false">
, 다시 말하지만, 이것이 문제가 되어서는 안됩니다. - 나의
h:selectOneMenu
안에 안에 .p:panel
요소는 요소의 PrimeFaces 합니다.
이 중 어떤 것도 작동하지 않는다면 사용 중인 PrimeFaces 버전이 문제가 될 수 있습니다.저의 프라임페이스 버전은 2.2.1입니다.
저는 프라임페이스 3.0을 사용합니다.네임스페이스가 있는 M4:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
잘 되는 것 같습니다.
아마도 프라임페이스 버전일 수도 있지만 당신의 콩에 있는 업데이트 방법은 꽤 복잡해 보입니다.
ajax 이벤트에서 선택의 개체를 검색하는 것이 어떻습니까? 이렇게 하면 해당 변수를 정의할 필요가 없습니다.
public void update(AjaxBehaviorEvent event)
{
Object selectOneMenuObject = ((UIOutput)event.getSource()).getValue();
//String selectedStateArray = (String)((UIOutput)event...
//update temporary collection of second SelectOneMenu
}
그게 당신에게 도움이 될지는 모르겠지만, 제가 하는 방식입니다.
당신은 그냥 추가해야 합니다.
event="change"
상위:
언급URL : https://stackoverflow.com/questions/6435467/trouble-with-primefaces-3-0-m2-selectonemenu-ajax-behavior
'programing' 카테고리의 다른 글
PHP와 C의 가변 스코프 차이: 블록 스코프가 완전히 같지는 않습니까? (0) | 2023.09.27 |
---|---|
XElement의 아이들 (0) | 2023.09.27 |
JQuery/Javascript : var가 존재하는지 확인 (0) | 2023.09.27 |
Angular Cli Webpack, 외부 js 파일 추가 또는 번들 방법? (0) | 2023.09.27 |
자바스크립트에서 객체를 만드는 데 가장 좋은 방법은 무엇입니까?객체 속성 앞에 var가 필요합니까? (0) | 2023.09.27 |