JSF Bean не будет установлен

Это очень сбивает с толку. Я работаю над простым приложением для класса и следовал примерам, но проклятое свойство Bean просто не устанавливается. Код следует:

Код бина:

import java.io.Serializable;
import javax.faces.bean.*;
import javax.faces.event.*;

@ManagedBean(name="dist") // or @Named("dist")
@SessionScoped
public class DistanceConvertBean implements Serializable{

private static final double MILESTOKM = 1.609344;
private static final double KMTOMILES = 0.62137;

private double input;
private String convertTo;
private String outputString;

Eclipse generated getters and setters

Код index.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:h="http://java.sun.com/jsf/html">

<h:body>
<h:panelGrid columns="3">

<h:outputText value="Distance:"/>
<h:inputText id="inDist" value="#{dist.input}" required="true">
    <f:convertNumber maxFractionDigits="2"/>
    <f:validateDoubleRange maximum="10000"/>
</h:inputText>
<h:message for="inDist"/>

<h:outputText value="Convert To:"/>
<h:form>
<h:selectOneRadio value="#{dist.convertTo}" required="true">
    <f:selectItem itemValue="km" itemLabel="Kilometer"/>
    <f:selectItem itemValue="miles" itemLabel="Miles"/>
</h:selectOneRadio>
</h:form>
<h:form>
<h:commandButton value="Convert" action="blah"/>
</h:form>
</h:panelGrid>
</h:body>
</html>

Код Blah.xhtml:

<h:body>
<h:outputText value="#{dist.input}"/>
</h:body>

Поэтому я ввожу 10 в поле InputText в Index.xhtml и нажимаю командную кнопку, чтобы перейти к blah.xhtml. Значение в blah по-прежнему равно 0,0.

Я использую Tomcat 7 и Eclipse Heilos и создал динамический веб-проект. У меня есть все банки JSF в WEB-INF/libs. Я не понимаю, почему свойства bean-компонента не устанавливаются. Это выглядит точно так же, как те коды для новичков, которые вы найдете в примерах COREJSF. Web.xml использует 2.5 для сервлета, поэтому мне не нужен face-config.xml.


person MooCow    schedule 20.03.2011    source источник


Ответы (1)


Ваш <h:inputText> не находится внутри элемента <h:form>.

Поместите <h:inputText> внутрь того же <h:form>, что и командная кнопка:

<h:form>
  <h:inputText id="inDist" value="#{dist.input}" required="true">
    <f:convertNumber maxFractionDigits="2"/>
    <f:validateDoubleRange maximum="10000"/>
  </h:inputText>
  <h:message for="inDist"/>
  <h:commandButton value="Convert" action="blah"/>
</h:form>

То же самое относится и к вашему <h:selectOneRadio>. Поместите его внутрь <h:form>, где commandButton.

person Matt Handy    schedule 20.03.2011
comment
Спасибо, мистер Хэнди. Я думал, что ‹h:form› на самом деле не нужен, а только для решения необычного поведения. - person MooCow; 20.03.2011
comment
@MooCow: я настоятельно рекомендую вам на время отложить JSF и тщательно изучить основы HTML. Тогда вы лучше поймете часть пользовательского интерфейса JSF :) - person BalusC; 20.03.2011