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