2016-08-15 115 views
0

我正在嘗試構建一個Web應用程序,該應用程序涉及一個下拉菜單,該菜單在選擇某個選項時使用數據填充表格。我有問題,所以試圖通過嘗試重新創建following example from the Primefaces website.來解決問題,我有以下問題:selectOneMenu生成項目符號列表

1)selectOneMenu在結果頁面上方生成一個文本框。

2)seelctOneMenu還會生成選項菜單上已有選項的項目符號列表。

3)第一個選擇菜單上的ajax監聽器不會更新第二個菜單,並且似乎沒有在DropdownView類中運行任何方法。

簡而言之,輸出是意想不到的,特別是因爲我或多或少的複製/粘貼示例代碼。

我使用Weblogic,JSF 2.2和Primefaces 6.0在JDeveloper12c上運行這一切。

這裏是我運行的代碼,幾乎全部是複製/從Primefaces網站

粘貼在這裏是我的dropdown.xhtml:

<!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:ui="http://xmlns.jcp.org/jsf/facelets" 
xmlns:h="http://xmlns.jcp.org/jsf/html" 
xmlns:f="http://xmlns.jcp.org/jsf/core" 
xmlns:p="http://primefaces.org/ui"> 

<body> 
<h:form> 
<h:messages errorStyle="color:red" /> 
<p:growl id="msgs" showDetail="true" /> 
<p:panel header="Select a Location" style="margin-bottom:10px;"> 
    <h:panelGrid columns="2" cellpadding="5"> 
     <p:outputLabel for="country" value="Country: " /> 
     <p:selectOneMenu id="country" value="#{dropdownView.country}" style="width:150px"> 
      <p:ajax listener="#{dropdownView.onCountryChange()}" update="city" /> 
      <f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" /> 
      <f:selectItems value="#{dropdownView.countries}" /> 
     </p:selectOneMenu> 

     <p:outputLabel for="city" value="City: " /> 
     <p:selectOneMenu id="city" value="#{dropdownView.city}" style="width:150px"> 
      <f:selectItem itemLabel="Select City" itemValue="" noSelectionOption="true" /> 
      <f:selectItems value="#{dropdownView.cities}" /> 
     </p:selectOneMenu> 
    </h:panelGrid> 

    <p:separator /> 

    <p:commandButton value="Submit" update="msgs" actionListener="#{dropdownView.displayLocation()}" icon="ui-icon-check" /> 
</p:panel> 
</h:form> 
</body> 
</html> 

我DropdownView.java,這是相同的從示例站點代碼:

package test; 

import java.io.Serializable; 
import java.util.HashMap; 
import java.util.Map; 
import javax.annotation.PostConstruct; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@ViewScoped 
public class DropdownView implements Serializable { 

private Map<String,Map<String,String>> data = new HashMap<String, Map<String,String>>(); 
private String country; 
private String city; 
private Map<String,String> countries; 
private Map<String,String> cities; 

@PostConstruct 
public void init() { 
    countries = new HashMap<String, String>(); 
    countries.put("USA", "USA"); 
    countries.put("Germany", "Germany"); 
    countries.put("Brazil", "Brazil"); 

    Map<String,String> map = new HashMap<String, String>(); 
    map.put("New York", "New York"); 
    map.put("San Francisco", "San Francisco"); 
    map.put("Denver", "Denver"); 
    data.put("USA", map); 

    map = new HashMap<String, String>(); 
    map.put("Berlin", "Berlin"); 
    map.put("Munich", "Munich"); 
    map.put("Frankfurt", "Frankfurt"); 
    data.put("Germany", map); 

    map = new HashMap<String, String>(); 
    map.put("Sao Paolo", "Sao Paolo"); 
    map.put("Rio de Janerio", "Rio de Janerio"); 
    map.put("Salvador", "Salvador"); 
    data.put("Brazil", map); 
} 

public Map<String, Map<String, String>> getData() { 
    return data; 
} 

public void setData(Map<String, Map<String, String>> data) { 
    this.data = data; 
} 

public void setCountries(Map<String, String> countries) { 
    this.countries = countries; 
} 

public void setCities(Map<String, String> cities) { 
    this.cities = cities; 
} 

public String getCountry() { 
    return country; 
} 

public void setCountry(String country) { 
    this.country = country; 
} 

public String getCity() { 
    return city; 
} 

public void setCity(String city) { 
    this.city = city; 
} 

public Map<String, String> getCountries() { 
    return countries; 
} 

public Map<String, String> getCities() { 
    return cities; 
} 

public void onCountryChange() { 
    if(country !=null && !country.equals("")) 
     cities = data.get(country); 
    else 
     cities = new HashMap<String, String>(); 
} 

public void displayLocation() { 
    FacesMessage msg; 
    if(city != null && country != null) 
     msg = new FacesMessage("Selected", city + " of " + country); 
    else 
     msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid", "City is not selected."); 

    FacesContext.getCurrentInstance().addMessage(null, msg); 
} 

}

這裏是我的W酒店eb.xml:

<?xml version = '1.0' encoding = 'windows-1252'?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <servlet> 
<servlet-name>FacesServlet</servlet-name> 
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
<servlet-name>FacesServlet</servlet-name> 
<url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
<servlet-name>FacesServlet</servlet-name> 
<url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
<servlet-name>FacesServlet</servlet-name> 
<url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 

</web-app> 

這裏是我的faces-config.xml中:

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
version="2.2"> 

</faces-config> 

回答

0

由JSF <h:body>標籤替換HTML標籤<body>。可能更重要的是,添加一條<h:head />行。它可能是空的,但它很重要,因爲這是添加JavaScript和CSS文件的地方。

順便說一句,你描述的問題表明這些文件丟失。您將看到selectOneMenu是如何從HTML構建塊構建的,但沒有CSS和JavaScript粘合代碼。