Понимание интерфейса конвертера JSF

Деловое требование

Мы должны были позволить пользователю ввести имя работодателя и название работодателя для своего работодателя (поместив в div, скажем, class="empInfo"). Теперь у пользователя может быть даже несколько работодателей, и поэтому мы предоставляем кнопку, которая при нажатии создаст еще один div (я в основном клонирую div).

Рабочий процесс

Существует стартовая страница формы (файл.xhtml, написанный на jsf), где пользователь может ввести данные формы, включая информацию (данные) работодателя. Затем пользователь нажимает кнопку "Продолжить" и затем переходит на страницу обзора (также другую страницу JSF), где пользователь может просмотреть добавить / удалить дополнительную информацию о работодателе.

Как я подхожу к этой проблеме.

  1. Мы должны были позволить пользователю ввести имя работодателя и название работодателя для своего работодателя.

    • Поместите два текстовых поля в div с class = "empInfo".
    • Кнопка Добавить для добавления / удаления с помощью Jquery для клонирования / удаления div с классом
  2. Помещение значения обратно в управляемый компонент.
    Это где это становится сложно (для меня, учитывая мой относительно менее опыт в J2ee и особенно JSF).

    • Свойство bean-компонента должно быть сопоставлено двум ArrayList
      • один для работодателя Имя
      • один для работодателя
    • Я не могу написать тег forSach JSF/JSP, потому что значения не могут быть напрямую сопоставлены с бэкэндом после того, как я клонирую div.
    • Поэтому я добавил два скрытых поля (по одному для каждого свойства бина).
    • Когда пользователь нажимает кнопку навигации, чтобы перейти на другую страницу, я использую JS для сбора всех значений в div с помощью class = "empInfo", и я устанавливаю поле с двумя скрытыми значениями, которое сопоставляется со списками массивов компонента.
    • Я знаю, что значение в представлении всегда String.
    • Поэтому я решил реализовать конвертер для преобразования строки в AL.

проблема

Я не могу получить значение из представления, которое будет успешно передано переопределенному методу конвертера в классе validater.

Скрытые поля в JSF (с помощью тегов томагавк)

<div class="XYZ">   
    <t:inputHidden value="#{Ctrlr.employerName}" id="eName" forceId="true" converter="jsArrayConverter"></t:inputHidden>        
</div>

Реализация конвертера

import javax.faces.convert.Converter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class FMLAConverter implements Converter{

@Override
public ArrayList<String> getAsObject(FacesContext context, UIComponent   component,String ret) {
    System.out.println("Inside Converter function, getting value from the view    and putting it in the model");    
    System.out.println("I am working with "+ret +"Hmmm");
    ArrayList<String> list = new ArrayList<String>();
    int j=0;
    int i=ret.indexOf(',');
    int len = ret.length();
    if (i == -1){
        if(len==0){
            System.out.println(list);
            return list;
        }
        else
        {
            list.add(ret);
        }
    }
    while(i>0)
    {
        list.add(ret.substring(j,i));
        j=i+1;
        if(i+1<len)
            i = ret.indexOf(',', i+1);
        else
            i=-1;   
    }
    System.out.println(list);
    return list;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    ArrayList <String> list = (ArrayList <String>) value;
    int i=0;
    StringBuilder str= new StringBuilder();
    if(list==null)
        { 
            System.out.println("It is null");
            return str.append("").toString();
        }
    if(list.size()==0){
        System.out.println("Really");
        str.append("");
        return str.toString();
    }

    for(String string:list)
    {   
        if(i++==0)  
            str.append(string); 
        else
            str.append(",").append(string);         
    }
    System.out.println("Not bad");
    return str.toString();
    }
    }

Устранение глупых ошибок

  • JS правильно добавляет значение в скрытое поле.
  • Прикрепление скриншота из хромированной консоли.

    скриншот консоли Google

Шаги отладки

  • Работая на нем в течение последних 48 часов, я не могу понять, почему он не работает. Мои исследования не могут ничего найти.
  • Глядя в системный журнал на сервере, я вижу журнал

    Я работаю с хммм

  • Поэтому я сделал вывод, что значение, возвращаемое из скрытого поля, представляет собой "" пустую строку, что странно (если только я не до конца понимаю жизненный цикл JSF).

  • Чтобы быть уверенным, я вижу, что значение ret находится после того, как пользователь нажимает на следующую кнопку в форме. Я добавил контрольную точку в window.unload и сделал снимок экрана с консоли, так что с JS все в порядке.
  • Спасибо за любую помощь, спасибо. Я уже просмотрел учебные пособия BALUS (не все, но много), что было очень полезно. Также любые другие ссылки или учебники по JSF были бы более полезными.

1 ответ

Если отправленное значение является нулевым или пустым, то это просто означает, что веб-браузер не отправил ожидаемое входное значение. Не любая логика кода в конвертере JSF может помочь в решении этой проблемы.

Сделайте шаг назад и исправьте код на стороне клиента, чтобы веб-браузер действительно отправлял ожидаемое входное значение. В соответствии с комментариями вопроса выясняется, что вы устанавливаете значение во время окна unload событие. Уже слишком поздно. Это событие вызывается, когда запрос уже отправлен на длительный срок. Вам нужно установить значение во время формы submit событие или кнопку отправки click событие. Вместо того, чтобы возиться с JS-консолью браузера, лучше перейти с вкладки "Консоль" на вкладку "Сеть" и проверить полезную нагрузку HTTP-запроса. Параметр запроса присутствует или нет?

Что касается конкретного вопроса, как правильно реализовать Converter подробно поясняется в этом ответе: значение параметра "Ошибка преобразования" для "нулевого преобразователя"

Другие вопросы по тегам