получение значений из компонентов простых лиц

У меня есть страница Facelets и связанный с ней управляемый компонент. Я использовал компоненты Primefaces, и моя проблема в том, что я хочу получить значения, выбранные пользователем каждого компонента при нажатии кнопки команды. когда я пытаюсь написать JoptionPane или system.out.print, это не работает. Я установил для свойства действия commandbutton метод btnsearchFlight, который находится в управляемом компоненте. так что любой, в чем проблема, что мне не хватает. Или пример будет очень признателен.

Вот страница Facelets

<?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: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">

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link href="./resources/css/default.css" rel="stylesheet" type="text/css" />
        <link href="./resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
        <title>Airline Travel Planner</title>
    </h:head>

    <h:body>

        <h:form id="form"> 
            <div id="top">
                <ui:insert name="top">AirLine Travel Planner</ui:insert>
            </div>
            <div>
                <div id="left">
                    <ui:insert name="left"></ui:insert>
                </div>
                <div>
                    <div id="right">
                        <ui:insert name="right"></ui:insert>
                    </div>
                    <div id="content" class="right_content" style="height: 500px">
                        <ui:insert name="content">
                            <p:selectOneRadio binding="#{calendarBean1.rdbTripType}" id="rdbTripType" value="#{calendarBean1.rdbTripType}">  
                                <f:selectItem itemLabel="One Way" itemValue="1" />  
                                <f:selectItem itemLabel="Round Trip" itemValue="2" />  
                            </p:selectOneRadio>  
                            <br/>
                            <h:outputLabel>From:</h:outputLabel>  
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <p:selectOneMenu value="#{calendarBean1.cityInfo}" style="" effect="fold" editable="true">  
                                <f:selectItems value="#{calendarBean1.cityInfo}" />  
                            </p:selectOneMenu> 
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <h:outputLabel style="position: relative">To:</h:outputLabel>
                            <p:selectOneMenu value="#{calendarBean1.cityInfo}" effect="fold" editable="true">  
                                <f:selectItems value="#{calendarBean1.cityInfo}" />  
                            </p:selectOneMenu> 
                            <br/><br/>
                            <h:outputLabel>Depart On:</h:outputLabel>  
                            <p:calendar value="#{calendarBean1.date3}" id="popupButtonDepartOn" showOn="button" /> 
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <h:outputLabel>Arrive On:</h:outputLabel>  
                            <p:calendar value="#{calendarBean1.date2}" id="popupButtonArriveOn" showOn="button" /> 
                            <br/>  <br/> 

                            <h:outputText value="Passenger Type" />  
                            <p:selectOneMenu id="selectOneMenuPassengerType" binding="#{calendarBean1.selectOneMenuPassengerType}" value="#{calendarBean1.selectOneMenuPassengerType}" >  
                                <f:selectItem itemLabel="Select One" itemValue="" />  
                                <f:selectItem itemLabel="Adult" itemValue="1" />  
                                <f:selectItem itemLabel="Child" itemValue="2" />  
                                <f:selectItem itemLabel="Infant" itemValue="3" />  
                            </p:selectOneMenu>  
                            <br/> <br/> 
                            <p:selectBooleanCheckbox value="#{calendarBean1.lowestFareChecked}" />
                            <h:outputText value="Lowest Fare" />  
                            <br/> 
                            <p:commandButton  id="btnSearchFlight" value="Search"  action="#{calendarBean1.searchFlight}" > 

                            </p:commandButton>

Вот класс управляемого компонента

package test.sample;

import java.io.Serializable;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import javax.faces.bean.ManagedBean;

import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.component.selectoneradio.SelectOneRadio;
import storageMethods.FlightMethod;

/**
 *
 * @author Nati
 */
@ManagedBean(name = "calendarBean1")
public class CalendarBean1 implements Serializable{

    /**
     * Creates a new instance of CalendarBean1
     */
    public CalendarBean1() {
    }
    private Date date1;
    private Date date2;
    private Date date3;
    private boolean lowestFareChecked;

    public boolean isLowestFareChecked() {
        return lowestFareChecked;
    }

    public void setLowestFareChecked(boolean lowestFareChecked) {
        this.lowestFareChecked = lowestFareChecked;
    }

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public Date getDate3() {
        return date3;
    }

    public void setDate3(Date date3) {
        this.date3 = date3;
    }
    private SelectOneRadio rdbTripType = new SelectOneRadio();

    public SelectOneRadio getRdbTripType() {
        return rdbTripType;
    }

    public void setRdbTripType(SelectOneRadio rdbTripType) {
        this.rdbTripType = rdbTripType;
    }
    public CommandButton btnSearchFlight = new CommandButton();

    public CommandButton getBtnSearchFlight() {
        return btnSearchFlight;
    }

    public void setBtnSearchFlight(CommandButton btnSearchFlight) {
        this.btnSearchFlight = btnSearchFlight;
    }
    private SelectOneMenu selectOneMenuPassengerType = new SelectOneMenu();

    public SelectOneMenu getSelectOneMenuPassengerType() {
        return selectOneMenuPassengerType;
    }

    public void setSelectOneMenuPassengerType(SelectOneMenu selectOneMenuPassengerType) {
        this.selectOneMenuPassengerType = selectOneMenuPassengerType;
    }
    public ArrayList<SelectItem> CityInfo;

    public ArrayList<SelectItem> getCityInfo() {
        CityInfo = CityInfo();
        return CityInfo;
    }

    public void setCityInfo(ArrayList<SelectItem> CityInfo) {
        this.CityInfo = CityInfo;
    }

    public String SearchFlight() {
//        JOptionPane.showMessageDialog(null, rdbTripType.getValue().toString());
//        JOptionPane.showMessageDialog(null,   selectOneMenuPassengerType.getValue().toString());
         JOptionPane.showMessageDialog(null,date3);
//        System.out.print("hi");
//        System.out.print(isLowestFareChecked());

        return null;
    }


}

person user1046350    schedule 20.02.2012    source источник
comment
Вы убедились, что нажатие командной кнопки достигает вашего метода действия? JOPtionPane в веб-приложении звучит странно...   -  person Matt Handy    schedule 20.02.2012
comment
Действительно, он будет выполняться только на веб-сервере. Он не будет выполняться в веб-браузере. Таким образом, это полностью потерпит неудачу в производственных установках, где веб-сервер работает на другой машине, чем веб-браузер.   -  person BalusC    schedule 20.02.2012
comment
когда я запускаю страницу, я получаю следующее исключение. Вызвано: java.lang.IllegalStateException: PWC3999: невозможно создать сеанс после того, как ответ был зафиксирован.   -  person user1046350    schedule 20.02.2012
comment
Это другая проблема. Твоя форма просто слишком велика. См. также stackoverflow.com/questions/8072311/   -  person BalusC    schedule 20.02.2012


Ответы (2)


Возможно, это просто опечатка при публикации в stackoverflow, но ваш метод написан с заглавной буквы: SearchFlight. И ваше действие в кнопке .xhtml написано строчными буквами. action="#{calendarBean1.searchFlight}

Разве это не должно быть

public String searchFlight() {

Я никогда не использовал компоненты Swing в структуре JSf. Но system.out должен работать, когда он закомментирован. Если вы вызываете метод. В логах ошибок нет?

person roel    schedule 20.02.2012
comment
когда я запускаю страницу, возникает следующее исключение - person user1046350; 20.02.2012
comment
я получаю следующее исключение Невозможно создать сеанс после того, как ответ был зафиксирован - person user1046350; 20.02.2012
comment
Это совершенно другая проблема, которая уже задавалась и на которую уже несколько раз давался ответ. Например. stackoverflow.com/questions/8072311/ - person BalusC; 20.02.2012

Я думаю, вы смешали разработку веб-приложений (JSF) с разработкой для настольных компьютеров (Swing). С JSF вам не нужно создавать компонент поддержки bean-компонента для каждого отдельного компонента Facelet. Вам не нужно

  • org.primefaces.component.commandbutton.CommandButton
  • org.primefaces.component.selectonemenu.SelectOneMenu
  • org.primefaces.component.selectoneradio.SelectOneRadio

в вашем компоненте, если вы хотите связать только входные значения этих компонентов.

Конечно, в некоторых ситуациях вы получите преимущества от привязки компонентов, но в вашем примере это не обязательно.

В фаслете вы используете атрибут value и атрибут binding, но они имеют одинаковое содержимое.

Если вас интересуют только входные значения, атрибут value — это все, что вам нужно. Пусть этот атрибут указывает на поле поддерживающего компонента, которое будет содержать только значение, например. int или String.

person Matt Handy    schedule 20.02.2012