Richfaces 4 rich: inputNumberSpinner: не получен «набор» в компоненте поддержки - PullRequest
2 голосов
/ 03 октября 2011

Я раньше работал с JSF, но я новичок в RichFaces.Чтобы проверить мои настройки, среду и т. Д. Я попытался создать простое небольшое приложение, в котором пользователь вводит два числа, нажимает кнопку, а приложение возвращает сумму и произведение чисел.

ВотСводка кода:

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">

 <display-name>eSPAR</display-name>

 <welcome-file-list>
   <welcome-file>index.html</welcome-file>
 </welcome-file-list>

 <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<!-- Plugging the skin into the project -->
<context-param>
    <param-name>org.richfaces.SKIN</param-name>
    <param-value>deepMarine</param-value>
</context-param>
<!-- Making the RichFaces skin spread to standard HTML controls -->
<context-param>
    <param-name>org.richfaces.CONTROL_SKINNING</param-name>
    <param-value>enable</param-value>
</context-param>

</web-app>

Далее:

faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>

<faces-config 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-facesconfig_2_0.xsd"
    version="2.0">

<application></application>

</faces-config>

Другими словами, в основном пусто, кроме объявлений версий.Далее следует страница просмотра:

 addmult.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"  
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">

<h:head>
</h:head>

<h:body>

<rich:panel header="Sample Add and Multiply App">
<h:form id="addmultForm">

    <p>Enter one number here: 
        <rich:inputNumberSpinner id="num1" minValue="0"
                            value="# {calcBean.number1}" /></p>
    <p>Enter another number here: 
        <rich:inputNumberSpinner id="num2" minValue="0"
                           value="#{calcBean.number2}" /></p>

    <a4j:commandButton value="Go" action="#{calcBean.go}" immediate="true">
        <f:ajax event="click" render="results" />
    </a4j:commandButton>

    <br /><br />

    <h:panelGroup id="results">
    <h:panelGroup rendered="#{calcBean.calcDone}">
        <p>The sum of your two numbers is: #{calcBean.sum}</p>
        <p>The product of your two numbers is: #{calcBean.product}</p>
    </h:panelGroup>
    </h:panelGroup>


</h:form>
</rich:panel>   

</h:body>   
</f:view>

Теперь, наконец, bean-компонент:

 CalcBean.java
import javax.faces.bean.ManagedBean;

@ManagedBean
public class CalcBean {

private Integer number1 = 3;
private Integer number2 = 7;
private int sum;
private int product;
private boolean calcDone = false;

public Integer getNumber1() {
    System.out.println("I am number1: " + number1);
    return number1;
}
public void setNumber1(Integer number1) {
    System.out.println("Change in number1");
    this.number1 = number1;
}
public Integer getNumber2() {
    return number2;
}
public void setNumber2(Integer number2) {
    this.number2 = number2;
}

public int getSum() {
    return sum;
}
public int getProduct() {
    return product;
}
public boolean isCalcDone() {
    System.out.println("Returning calcDone: " + calcDone);
    return calcDone;
}


public String go() {
    System.out.println("Going!");
    sum = number1 + number2;
    product = number1 * number2;
    calcDone = true;
    return null;
}

}

Моя библиотека WEB_INF содержит: commons-beanutils-1.8.3, commons-collection-3.2.1,commons-digester-2.1, commons-logging-1.1.1, cssparser-0.9.5, guava-r08, jhighlight-1.0, jsf-api (версия mojarra 2.0), jsf-facelets-1.1.15, jsf-impl (сноваmojarra 2.0), richfaces-components-api-4.0.0-FINAL, richfaces-components-ui-4.0.0-FINAL, richfaces-core-api-4.0.0-FINAL, richfaces-core-impl-4.0.0-FINAL, sac-1.3, стандарт.

Какими бы ни были значения, которые я инициализирую Целыми числами номер 1 и номер 2, это те значения, которые изначально были во входах при загрузке страницы.Нижний текст изначально скрыт.При нажатии кнопки «Перейти» появляется нижняя панель, но независимо от того, какие значения введены пользователем, сумма всегда равна 10, а произведение всегда равно 21 (как показано).

Sysout в сеттереникогда не отображается.Один в геттере отображается один раз при загрузке страницы.Когда нажимается «Go», сисут «Going!»показывает один раз, затем «Returning calcDone: true» показывает шесть раз.

Что я пробовал: Изменение области действия компонента.Оборачивание выражений на панели результатов в <h:outputText>.Добавление FaceletViewHandler в web.xml (на самом деле вызывает больше проблем).Извлечение файла JAR с лицевой стороной из библиотеки.

Нужен ли слушатель изменения значения на входах?Что еще мне попробовать?

1 Ответ

1 голос
/ 03 октября 2011
<a4j:commandButton value="Go" action="#{calcBean.go}" immediate="true">
    <f:ajax event="click" render="results" />
</a4j:commandButton>

Удалить immediate="true".Это приведет к тому, что входы, которые не имеют immediate="true", будут полностью пропущены при обработке.Также удалите <f:ajax>, поскольку <a4j:commandButton> уже использует ajax.Чтобы лучше понять, что делает immediate и для чего он вам нужен, я предлагаю вам ознакомиться с этой статьей: Отладка жизненного цикла JSF (да, это нацелено на JSF 1.2, но общая концепция применима к JSF2.x)

Вот краткое изложение релевантности:

Хорошо, когда я должен использовать атрибут немедленного использования?

Еслипока не совсем ясно, вот краткое изложение с примерами использования в реальных условиях, когда они могут быть полезны:

  • Если задано только в UIInput (s), проверки процессафаза будет выполняться в фазе применения значений запроса.Используйте это, чтобы определить приоритетность проверки для UIInput компонента (ов).Если проверка / преобразование завершается неудачно для любого из них, не немедленные компоненты не будут проверяться / преобразовываться.

  • Если задано только в UICommand, этап применения значений запроса доЭтапы обновления значений модели будут пропущены для любого из компонентов UIInput.Используйте это, чтобы пропустить всю обработку формы.Например, кнопка «Отмена» или «Назад».

  • Если установлено в обоих компонентах UIInput и UICommand, фаза применения значений запроса до тех пор, пока фазы обновления значений модели не будут пропущены длялюбой из компонентов UIInput, для которых этот атрибут не установлен.Используйте это, чтобы пропустить обработку всей формы, ожидаемой для определенных полей (с немедленным).Например, кнопка «Забыли пароль» в форме входа в систему с обязательным, но не немедленным паролем.

Итак, вы в конечном итоге хотите это:

<a4j:commandButton value="Go" action="#{calcBean.go}" render="results" />

Не связан с конкретной проблемой: в вашей конфигурации есть более серьезные проблемы.У меня сложилось впечатление, что вы читаете учебники / документацию, ориентированные на JSF 1.x и RichFaces 3.x, а не на JSX 2.x и RichFaces 4.x.Первый <context-param> обязателен только для Facelet JSF 1.x, а остаток относится только к RichFaces 3.x.Убери их всех.У вас также есть поврежденный файл JSF 1.x jsf-facelets.jar, который должен быть удален, так как JSF 2.x уже включает в себя реализацию JSF 2.x Facelets.

...