Olá Pessoal, ou olá para mim mesmo rsrs, afinal só tem comentário meu! Acredito que tenha sido o primeiro a precisar disto, de qualquer forma espero q possa ajudar alguém!
Pessoal, o que eu gostaria de fazer era fazer uma pesquisa com meus componentes e mostrá-la no jquery plugin, contudo não consegui. Mas a forma alternativa
foi pesquisar com o próprio, mas este não possuía uma forma de pesquisar vários campos simultaneamente. Depois de contato com muitos e principalmente com o Yoshi, consegui algo. Vamos lá
Este tópico deveria ser pesquisa avançada com jqGrid;
primeiro passo depois de baixar e instalar o jquery plugin e criar a action que receberá os parâmetros e realizará a pesquisa:
- Na jsp realizar os imports e criar a tela de visualização:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<sj:head jqueryui="true" jquerytheme="start" />
</head>
<body>
<h1>Notas</h1>
<br>
<div id="nota">
<s:url id="remoteurl" action="listaNotaEntrada"/>
<sjg:grid
id="gridnota"
name="gridnota"
caption="Entrada de Notas"
dataType="json"
href="%{remoteurl}"
pager="true"
navigator="true"
navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
navigatorEditOptions="{height:280,reloadAfterSubmit:false}"
navigatorEdit="true"
navigatorView="true"
navigatorDelete="true"
navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
navigatorSearchOptions="{multipleSearch:true}"
gridModel="vnes"
rowList="10,15,20"
rowNum="15"
rownumbers="true"
editurl="%{editurl}"
editinline="false"
multiselect="false"
viewrecords="true"
>
<sjg:gridColumn
name="id_entrada"
index="id_entrada"
title="Id. Entrada"
formatter="integer"
sortable="false"
width="100"
editable="true"
edittype="text"
search="false"
/>
<sjg:gridColumn
name="descricao"
index="descricao"
title="Descricao"
sortable="true"
width="300"
editable="true"
edittype="text"
search="false"
/>
<sjg:gridColumn
name="id_regional"
index="id_regional"
title="Regional"
sortable="true"
width="100"
editable="true"
edittype="text"
search="true"
searchoptions="{sopt:['eq']}"
/>
<sjg:gridColumn
name="resumo"
index="resumo"
title="Resumo"
sortable="true"
width="100"
editable="true"
edittype="text"
search="true"
searchoptions="{sopt:['eq']}"
/>
<sjg:gridColumn
name="ano"
index="ano"
title="Ano"
sortable="true"
width="100"
editable="true"
edittype="text"
search="false"
/>
<sjg:gridColumn
name="faturado"
index="faturado"
title="Faturado"
sortable="true"
width="100"
editable="true"
edittype="text"
search="false"
/>
</sjg:grid>
</div>
</body>
</html>
O principal ponto na jsp é acrescentar a opção:
navigatorSearchOptions="{multipleSearch:true}"
Esta fará com que seja possível pesquisar por mais do que um campo simultaneamente;
O próximo passo é configurar a action para receber as informações.
Veja que por padrão os parâmetros da pesquisa são recebidos pelos fields ou properties:
Contudo quando se habilita a opção multiplesearch, ficaria ruim enviar tudo numa string, então o desenvolvedor da ferramente
decidiu enviar pela propertie:
em formato JSON;
Desta forma ao implementar a action, além de acrescentar as properties: rows, page deve ser acrescetanda a propertie filters, bem como seus métodos getter´s e setter´s
O único detalhe nesta questão é que os dados virão com o formato JSON, daí é só baixar as lib´s do mesmo e deserializá-lo.
No meu caso eu não consegui pois sempre dava algum erro de alguma coisa, daí fiz uma “adaptação técnica de caráter permanente” (gambiarra) lendo a string e recuperando as informações q eu precisava.
veja a action abaixo:
package gsa.action;
import gsa.dao.ConnectionFactory;
import gsa.dao.Ven_notaentrada;
import gsa.dao.Ven_notaentradaDAO;
import gsa.util.CclUtil;
import gsa.util.FieldMember;
import java.sql.Connection;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
@ParentPackage( value="json-default" )
public class ListaNotaEntradaJqAction {
private int resumo = 0;
private int id_regional = 0;
private List<Ven_notaentrada> vnes;
private String field;
private String data;
private String filters;
//get how many rows we want to have into the grid - rowNum attribute in the grid
private Integer rows = 0;
//Get the requested page. By default grid sets this to 1.
private Integer page = 0;
// sorting order - asc or desc
private String sord = "asc";
// get index row - i.e. user click to sort.
private String sidx="";
// Search Field
private String searchField;
// The Search String
private String searchString = "0";
private String searchGrid;
// he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']
private String searchOper;
// Your Total Pages
private Integer total = 0;
// All Record
private Integer records = 0;
public String getSearchGrid() {
return searchGrid;
}
public void setSearchGrid(String searchGrid) {
this.searchGrid = searchGrid;
}
public int getResumo() {
return resumo;
}
public void setResumo(int resumo) {
this.resumo = resumo;
}
public int getId_regional() {
return id_regional;
}
public void setId_regional(int idRegional) {
id_regional = idRegional;
}
public List<Ven_notaentrada> getVnes() {
return vnes;
}
public void setVnes(List<Ven_notaentrada> vnes) {
this.vnes = vnes;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public String getSord() {
return sord;
}
public void setSord(String sord) {
this.sord = sord;
}
public String getSidx() {
return sidx;
}
public void setSidx(String sidx) {
this.sidx = sidx;
}
public String getSearchField() {
return searchField;
}
public void setSearchField(String searchField) {
this.searchField = searchField;
}
public String getSearchString() {
return searchString;
}
public void setSearchString(String searchString) {
this.searchString = searchString;
}
public String getSearchOper() {
return searchOper;
}
public void setSearchOper(String searchOper) {
this.searchOper = searchOper;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getRecords() {
return records;
}
public void setRecords(Integer records) {
this.records = records;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
/* JSONObject json = new JSONObject().fromObject( filters );
System.out.println( json.get("groupOP") );
JSONArray jsona = new JSONArray().fromObject(json.getJSONArray("rules"));
System.out.println( jsona.getString(0));
System.out.println( jsona.getString(1) );
//{"groupOp":"AND","rules":[{"field":"id_regional","op":"eq","data":"1"},{"field":"resumo","op":"eq","data":"0"}]}
System.out.println("Converteu o bean"); */
/*
JSONObject json = new JSONObject().fromObject(filters);
JSONArray jsona = new JSONArray().fromObject(json.getJSONArray("rules"));
System.out.println( jsona.size() );
System.out.println( jsona.getString(0));
System.out.println( jsona.getString(1) );
System.out.println("ok");
*/
// aqui foi a classe q criei para receber o json e deserializá-lo. ele devolve uma list da classe FieldMember que tem os 3 campos retornados pelo filters: "field", "op" e "data"
// vou postar a classe abaixo, mas veja sou inciante em java deve ter uma forma muito mais elegante de fazer isto
// perceba q se o pluglin do json tivesse dado certo nada do que está abaixo seria necessário. quem sabe alguém consiga implementar e poste para gente
CclUtil util = new CclUtil();
List<FieldMember> fields = util.GetJsonValues(filters);
int i = 0;
for( FieldMember field : fields ) {
if (i == 0 )
id_regional = Integer.parseInt( field.getData());
else
resumo = Integer.parseInt( field.getData());
i++;
}
this.filters = filters;
}
@Action(value = "/listaNotaEntrada", results = {
@Result(name = "ok", type = "json" )
})
public String execute(){
int to = (rows * page);
int from = to - rows;
System.out.println("listajson");
Connection conn = new ConnectionFactory().getConnection();
// aqui vem o método da sua DAO com a pesquisa parametrizada por page e seus orders. Veja aqui os campos que eu precisava id_regional e resumo
vnes = new Ven_notaentradaDAO(conn).getListaFrom( from+1,to, sidx + " "+ sord , id_regional,resumo);
records = 40;
//calculate the total pages for the query
total =(int) Math.ceil((double)records / (double)rows);
records = vnes.size()*page;
return "ok";
}
}
classe auxiliares:
FieldMember
package gsa.util;
public class FieldMember {
private String field;
private String op;
private String data;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
public String getOp() {
return op;
}
public void setOp(String op) {
this.op = op;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
CclUtil
package gsa.util;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class CclUtil {
public List<FieldMember> GetJsonValues( String json ) {
JSONObject obj = new JSONObject().fromObject(json);
JSONArray objarray = new JSONArray().fromObject(obj.getJSONArray("rules"));
List<FieldMember> fms = new ArrayList<FieldMember>();
//{"groupOp":"AND","rules":[{"field":"id_regional","op":"eq","data":"1"},{"field":"resumo","op":"eq","data":"0"}]}
//{"field":"id_regional","op":"eq","data":"1"}
for ( int i=0;i<objarray.size();i++ ){
String str = objarray.getString(i);
str = str.replace("\"","");
str = str.replace("{","");
str = str.replace("}","");
String[] fields = new String[3];
for (int j = 0; j >< 3; j++) {
int index = str.indexOf(":");
int index2 = str.indexOf(",");
boolean copiar = true;
// copiar o conteúdo ainda não lido e ignorar o já lido. qdo não houver mais vírgulas copiar tudo o que restou (length)
if ( index2 < 0 ) {
index2 = str.length();
copiar = false;
}
fields[j] = str.substring( index+1,index2 );
if ( copiar ) {
str = str.substring( index2+1);
}
}
FieldMember fm = new FieldMember();
fm.setField( fields[0]);
fm.setOp(fields[1]);
fm.setData(fields[2]);
fms.add(fm);
}
return fms;
}
}
Bem pessoal foi isso aí, espero q seja útil para pelo menos 1 pessoa, pq deu um trabalhao chegar até aqui, ufa, rsrs!
Valeu!