繁体   English   中英

了解JSF转换器接口

[英]Understanding JSF converter interface

业务需求

我们必须让用户输入其雇主的雇主名称和雇主标题(放入div中可以说class =“ empInfo”)。 现在用户甚至可能有多个雇主,因此我们提供了一个按钮,单击该按钮将创建另一个div(我基本上是克隆div)。

工作流程

有一个表单开始页面(用jsf编写的.xhtml文件),用户可以在其中输入表单的详细信息,包括雇主信息。 然后,用户单击继续,然后他们进入复查页面(也是另一个JSF页面),用户可以在其中复查添加/删除更多的雇主信息。

我如何解决这个问题。

  1. 我们必须让用户输入其雇主的雇主名称和雇主名称。

    • 将两个文本字段放在class为“ empInfo”的div中。
    • 使用Jquery使用类克隆/删除div的添加/删除的添加按钮
  2. 将值放回托管bean中。
    这是棘手的地方(对我而言,鉴于我相对较少的J2ee经验,尤其是JSF经验)。

    • bean属性必须映射到两个ArrayList
      • 一位雇主名称
      • 一份给雇主
    • 我无法编写forEach JSF / JSP标记,因为克隆div后无法将值直接映射到后端。
    • 因此,我添加了两个隐藏字段(每个bean属性一个)。
    • 当用户单击导航按钮转到另一个页面时,我使用JS收集了class为“ empInfo”的div中的所有值,并设置了两个隐藏的值字段,该字段映射到bean的数组列表。
    • 我知道,视图中的值始终是String。
    • 因此,我决定实现一个转换器以将字符串转换为AL。

问题

我无法从视图中获取值,无法成功将其传递到验证器类中的重写转换器方法。

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将值正确添加到隐藏字段中。
  • 从chrome控制台附加屏幕截图。

    谷歌控制台截图

调试步骤

  • 在过去的48个小时里一直在工作,无法理解为什么它不工作。我的研究没有找到任何东西。
  • 在服务器上查看系统输出日志,我看到日志

    我正在和Hmmmm合作

  • 因此,我从隐藏字段返回的值是一个奇怪的空字符串“”。(除非我不完全了解JSF生命周期)

  • 可以肯定的是,我看到ret值是在用户单击表单中的下一个按钮之后。 我在window.unload添加了一个检查点,并从控制台获取了屏幕截图,因此JS很好。
  • 非常感谢任何帮助。谢谢。我已经阅读了BALUS的教程(不是全部,但是很多),这非常有帮助。此外,任何其他指向JSF的链接或教程都将更有帮助。

如果提交的值为null或为空,则仅表示Web浏览器未发送预期的输入值。 JSF转换器中没有任何类型的代码逻辑可以帮助解决此问题。

退后一步,并相应地修复客户端代码,以使Web浏览器实际发送预期的输入值。 根据问题的注释,事实证明您是在窗口的unload事件期间设置值。 已经太晚了。 当请求已发送很长时间时,将触发该事件。 您需要在表单的submit事件或提交按钮的click事件期间设置值。 与其摆弄浏览器的JS控制台,不如将其从“控制台”选项卡切换到“网络”选项卡,然后在那儿检查HTTP请求有效负载。 请求参数是否存在?

关于具体问题,在此答案中详细说明了如何正确实现Converter“空转换器”的转换错误设置值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM