向JSF渲染器添加ajax行为

向JSF渲染器添加ajax行为,ajax,jsf,custom-component,custom-renderer,Ajax,Jsf,Custom Component,Custom Renderer,我有一个定制的JSF组件渲染器,用于呈现数据表的分页组件,但它没有ajax行为。我了解到可以通过插入ajax来编码方法,或者通过支持f ajax标记来实现。不幸的是,我不太熟悉ajax,所以您能告诉我应该如何修改此代码以使其成为ajax吗 @FacesRenderer(componentFamily="javax.faces.Command", rendererType="com.component.Pager") 公共类分页渲染器扩展渲染器{ private static final

我有一个定制的JSF组件渲染器,用于呈现数据表的分页组件,但它没有ajax行为。我了解到可以通过插入ajax来编码方法,或者通过支持f ajax标记来实现。不幸的是,我不太熟悉ajax,所以您能告诉我应该如何修改此代码以使其成为ajax吗

@FacesRenderer(componentFamily="javax.faces.Command",
    rendererType="com.component.Pager")
公共类分页渲染器扩展渲染器{

private static final int SHOW_PAGES = 3;
private static final String   HIDDEN_FIELD_ID ="tableFormPaginatorInput";
public void encodeBegin(FacesContext context, UIComponent component)
        throws IOException {
    ClientBehaviorContext behaviorContext =
                            ClientBehaviorContext.createClientBehaviorContext(context,
                           component, "click", component.getClientId(context), null);
    String id = component.getClientId(context);
    UIComponent parent = component;
    while (!(parent instanceof UIForm)) parent = parent.getParent();
    String formId = parent.getClientId(context);


    ResponseWriter writer = context.getResponseWriter();
    writer.startElement("div", component);
    writer.writeAttribute("class", "paginator-section", null);
    String styleClass = (String) component.getAttributes().get("styleClass");
    String selectedStyleClass
            = (String) component.getAttributes().get("selectedStyleClass");
    String dataTableId = (String) component.getAttributes().get("dataTableId");


    // find the component with the given ID

    UIData data = (UIData) component.findComponent(dataTableId);

    int first = data.getFirst();
    int itemcount = data.getRowCount();
    int pagesize = data.getRows();
    if (pagesize <= 0) pagesize = itemcount;

    int pages = itemcount / pagesize;
    if (itemcount % pagesize != 0) pages++;

    int currentPage = first / pagesize;
    if (first >= itemcount - pagesize) currentPage = pages - 1;
    int startPage = 0;
    int endPage = pages;
    if (SHOW_PAGES  > 0) {
        startPage = (currentPage / SHOW_PAGES ) * SHOW_PAGES ;
        endPage = Math.min(startPage + SHOW_PAGES , pages);
    }
    if (currentPage > 0)
        writeLink(writer, component, formId, id, "<", styleClass);

    if (startPage > 0)
        writeLink(writer, component, formId, id, "..", styleClass);

    for (int i = startPage; i < endPage; i++) {
        writeLink(writer, component, formId, id, "" + (i + 1),
                i == currentPage ? selectedStyleClass : styleClass);
    }

    if (endPage < pages)
        writeLink(writer, component, formId, id, "...", styleClass);

    if (first < itemcount - pagesize)
        writeLink(writer, component, formId, id, ">", styleClass);

  /*  CommandButton commandButton = new CommandButton();
    commandButton.setValue(currentPage);
    commandButton.setUpdate("");
    commandButton.setAjax(true);
    commandButton.addActionListener(new MyActionListener());
    commandButton.encodeAll(context);*/


    writer.endElement("div");
    // hidden field to hold result
    writeHiddenField(writer, component, id);
}

private void writeLink(ResponseWriter writer, UIComponent component,
                       String formId, String id, String value, String styleClass)
 throws IOException {
     writer.writeText(" ", null);
     writer.startElement("a", component);
     writer.writeAttribute("href", "#", null);
     writer.writeAttribute("onclick", onclickCode(formId, id, value) , null);
     if (styleClass != null)
         writer.writeAttribute("class", styleClass, "styleClass");
     writer.writeText(value, null);
     writer.endElement("a");


}

private void writeLink1(ResponseWriter writer, UIComponent component,
                       String formId, String id, String value, String styleClass)
        throws IOException {
    writer.writeText(" ", null);
    writer.startElement("a", component);
    writer.writeAttribute("href", "#", null);
    writer.writeAttribute("data-tableFormPaginator", value, null);
    if (styleClass != null)
        writer.writeAttribute("class", styleClass, "styleClass");
    writer.writeText(value, null);
    writer.endElement("a");



}




private String onclickCode(String formId, String id, String value) {
    return new StringBuilder().append("document.forms['")
            .append(formId).append("']['")
            .append(id).append("'].value='").append(value).append("'; document.forms['")
            .append(formId).append("'].submit(); return false;").toString();
}

private String onclickCodewithout(String formId, String id, String value,UIComponent component) {
    return "jsf.ajax.request('" + component.getClientId() +
            "', null, {'render': '" +
            component.getParent().getClientId() + "',"+id+":"+value+" })";

}
private void writeHiddenField(ResponseWriter writer, UIComponent component,
                              String id) throws IOException {
    writer.startElement("input", component);
    writer.writeAttribute("id", HIDDEN_FIELD_ID, null);
    writer.writeAttribute("class", "paginator-input-value", null);
    writer.writeAttribute("type", "hidden", null);
    writer.writeAttribute("name", id, null);
    writer.endElement("input");
}

public void decode(FacesContext context, UIComponent component) {
    String id = component.getClientId(context);
    Map<String, String> parameters
            = context.getExternalContext().getRequestParameterMap();

    String response = (String) parameters.get(id);
    if (response == null || response.equals("")) return;

    String dataTableId = (String) component.getAttributes().get("dataTableId");
    int showpages = SHOW_PAGES ;//toInt(component.getAttributes().get("showpages"));

    UIData data = (UIData) component.findComponent(dataTableId);

    int first = data.getFirst();
    int itemcount = data.getRowCount();
    int pagesize = data.getRows();
    if (pagesize <= 0) pagesize = itemcount;

    if (response.equals("<")) first -= pagesize;
    else if (response.equals(">")) first += pagesize;
    else if (response.equals("..")) first -= pagesize * showpages;
    else if (response.equals("...")) first += pagesize * showpages;
    else {
        int page = Integer.parseInt(response);
        first = (page - 1) * pagesize;
    }
    if (first + pagesize > itemcount) first = itemcount - pagesize;
    if (first < 0) first = 0;
    data.setFirst(first);
}

private static int toInt(Object value) {
    if (value == null) return 0;
    if (value instanceof Number) return ((Number) value).intValue();
    if (value instanceof String) return Integer.parseInt((String) value);
    throw new IllegalArgumentException("Cannot convert " + value);
}
private static final int SHOW_PAGES=3;
私有静态最终字符串隐藏\u字段\u ID=“tableFormPaginatorInput”;
public void encodeBegin(FacesContext上下文,UIComponent)
抛出IOException{
客户端行为上下文行为上下文=
ClientBehaviorContext.createClientBehaviorContext(上下文,
组件,“单击”,组件.getClientId(上下文),空;
字符串id=component.getClientId(上下文);
UIComponent父项=组件;
而(!(UIForm的父实例))parent=parent.getParent();
字符串formId=parent.getClientId(上下文);
ResponseWriter=context.getResponseWriter();
作者:startElement(“部门”,组成部分);
writeAttribute(“类”,“分页器部分”,null);
String styleClass=(String)component.getAttributes().get(“styleClass”);
字符串selectedStyleClass
=(字符串)component.getAttributes().get(“selectedStyleClass”);
字符串dataTableId=(字符串)组件.getAttributes().get(“dataTableId”);
//查找具有给定ID的组件
UIData data=(UIData)component.findComponent(dataTableId);
int first=data.getFirst();
int itemcount=data.getRowCount();
int pagesize=data.getRows();
如果(pagesize=itemcount-pagesize)currentPage=pages-1;
int起始页=0;
int endPage=页数;
如果(显示页面>0){
起始页面=(当前页面/显示页面)*显示页面;
endPage=Math.min(起始页面+显示页面,页面);
}
如果(当前页面>0)
writeLink(writer,component,formId,id,“,styleClass);
/*CommandButton CommandButton=新建CommandButton();
commandButton.setValue(当前页面);
commandButton.setUpdate(“”);
setAjax(true);
addActionListener(新的MyActionListener());
commandButton.encodeAll(上下文)*/
作者:恩德莱恩(“div”);
//隐藏字段以保存结果
writeHiddenField(编写器、组件、id);
}
私有void writeLink(响应编写器、UIComponent组件、,
字符串formId、字符串id、字符串值、字符串样式类)
抛出IOException{
writer.writeText(“,null);
startElement(“a”,组件);
writeAttribute(“href”,“#”,null);
writeAttribute(“onclick”,onclickCode(formId,id,value),null);
if(styleClass!=null)
writeAttribute(“class”,styleClass,styleClass”);
writeText(值,null);
作者:恩德莱恩(“a”);
}
专用无效写入器LK1(响应写入器、UIComponent组件、,
字符串formId、字符串id、字符串值、字符串样式类)
抛出IOException{
writer.writeText(“,null);
startElement(“a”,组件);
writeAttribute(“href”,“#”,null);
writeAttribute(“data tableFormPaginator”,值,null);
if(styleClass!=null)
writeAttribute(“class”,styleClass,styleClass”);
writeText(值,null);
作者:恩德莱恩(“a”);
}
私有字符串onclickCode(字符串formId、字符串id、字符串值){
返回新的StringBuilder()
.append(formId).append(“][”)
.append(id).append(“].value=”).append(value).append(“;document.forms[”))
.append(formId).append(“'].submit();return false;”).toString();
}
私有字符串onclickCodewithout(字符串formId、字符串id、字符串值、UIComponent){
返回“jsf.ajax.request('”+component.getClientId()+
“,null,{'render':”+
component.getParent().getClientId()+“,”+id+“:“+value+”})”;
}
私有void writeHiddenField(ResponseWriter writer、UIComponent、,
字符串id)引发IOException{
startElement(“输入”,组件);
writeAttribute(“id”,隐藏字段\ id,null);
writeAttribute(“类”,“分页器输入值”,null);
writer.writeAttribute(“type”、“hidden”、null);
writeAttribute(“名称”,id,null);
编写器。输入(“输入”);
}
公共无效解码(FacesContext上下文,UIComponent){
字符串id=component.getClientId(上下文);
映射参数
=context.getExternalContext().getRequestParameterMap();
字符串响应=(字符串)参数.get(id);
if(response==null | | response.equals(“”)返回;
字符串dataTableId=(字符串)组件.getAttributes().get(“dataTableId”);
int showpages=SHOW_PAGES;//toInt(component.getAttributes().get(“showpages”);
UIData data=(UIData)component.findComponent(dataTableId);
int first=data.getFirst();
int itemcount=data.getRowCount();
int pagesize=data.getRows();
if(pagesize itemcount)first=itemcount-pagesize;
如果(first<0)first=0;
data.setFirst(第一);
}
私有静态int-toInt(对象值){
if(value==null)返回0;
if(value instanceof Number)返回((Number)value).intValue();
if(value instanceof String)返回Integer.parseInt((String)value);
抛出新的IllegalArgumentException(“无法转换”+值);
}

f:ajax
标记只能直接嵌套在实现ClientBehaviorHolder接口的UIComponent中

我看到您尝试为表实现onclick,如果您使用的是Mojarra,那么它有一个utils方法,您可以帮助您呈现onclick行为,该行为也可以与f:ajax一起使用
renderSelectOnclick