JQuery Plugin - Action com Parametros [resolvido]

3 respostas
kweles

Olá Pessoal!

Estou utilizando o JQuery Plugin, e ele é mto bom, recomendo!

Contudo estou tendo uma dificuldade, para passar os parâmetros da pesquisa antes de popular o mesmo. É possível
passar os parâmetros para a action antes de populá-lo. Existe um botão de pesquisa no JQuery Plugin, que permite
refinar a pesquisa, contudo só é possível pesquisar por um campo por vez e minha pesquisa precisa de dois parâmetros

Eu pensei em colocar dois input text e um botão para chamar a action, mas não sei como chamar a action e popular o JQuery ao mesmo tempo.

A Primeira coisa q fiz foi criar minha action, veja abaixo:

import gsa.dao.ConnectionFactory;
import gsa.dao.Ven_notaentrada;
import gsa.dao.Ven_notaentradaDAO;

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 = 1;

	private List<Ven_notaentrada> vnes;
 
	//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; 
	 
	// 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 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;
	}


	@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();
		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";
	}
	
}

A linha mostrada acima, e abaixo é onde eu preciso passar os parâmetros: id_regional e resumo.

vnes = new Ven_notaentradaDAO(conn).getListaFrom( from+1,to, sidx + " "+ sord , id_regional,resumo);

Veja q eu até criei eles como field da action para q eu possa passá-los por parãmetro.

Em seguida criei o jsp com o jquery plugin, veja abaixo:

<%@ 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" />
	
	<script type="text/javascript">
		function fnc_listaNota(){			
			var idregional = $('#text_idregional').value;
			var resumo     = $('#text_resumo').value;
			$('#nota').load('<c:url value="listaNotaEntrada"/>?id_regional='+ idregional ); 
		}
	</script>	

	<sj:head jqueryui="true" jquerytheme="start" />

</head>
<body>
	<h1>Notas</h1>

	<br></br>

	 &lt;form id="frmPesquisa" action="listaNotaEntrada" method="get" &gt;
	 	Id. Regional:  	&lt;input type="text" id="text_idregional" name="id_regional" /&gt;
	 	Resumo:        	&lt;input type="text" id="text_resumo" name="resumo" /&gt;<br/>
	 	
	 	&lt;input type="submit" onclick="fnc_listaNota()" value="Salvar"/&gt;	
	 &lt;/form&gt;

	&lt;div id="nota"&gt;
	 &lt;s:url id="remoteurl" 	action="listaNotaEntrada"/&gt;
	 &lt;sjg:grid  
	        id="Table"	        
	        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}"
	        gridModel="vnes" 
	        rowList="10,15,20" 
	        rowNum="15" 
	        rownumbers="true"
	        editurl="%{editurl}"
	    	editinline="false"
	    	multiselect="false"
	    	viewrecords="true" 
	    &gt; 
	        &lt;sjg:gridColumn 
	        	name="id_entrada" 
	        	index="id_entrada" 
	        	title="Id. Entrada" 
	        	formatter="integer" 
	        	sortable="false"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt; 
	        &lt;sjg:gridColumn 
	        	name="descricao" 
	        	index="descricao" 
	        	title="Descricao" 
	        	sortable="true"
	        	width="300"
	    		editable="true" 
	    		edittype="text" /&gt; 
	        &lt;sjg:gridColumn 
	        	name="id_regional" 
	        	index="id_regional" 
	        	title="Regional" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text" 
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="ano" 
	        	index="ano" 
	        	title="Ano" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="faturado" 
	        	index="faturado" 
	        	title="Faturado" 
	        	sortable="true"
				width="100"
	    		editable="true" 
	    		edittype="text"	        	
	        	/&gt;
	    &lt;/sjg:grid&gt;	
	&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;

Tentei criar um ajax para executar a action passando apenas um dos parâmetros para teste mas não da certo.
Pessoal será q tem alguma forma de fazer isto?

Agradeço o apoio de todos, espero ter sido claro. Obrigado pessoal!

3 Respostas

kweles

olá Pessoal, vi este exemplo.

Parece q é para habilitar a pesquisa avançada por mais do q um campo, contudo não funcionou!

Alguém tem alguma idéia?

&lt;script&gt; $(document).ready(function () { $("#yourGridId").jqGrid('searchGrid', {multipleSearch:true} ); }); &lt;/script&gt;

valeu pessoal!

kweles

Olá Pessoal descobri que o que deve ser feito é acrescentar esta propriedade no JQuery Plugin ao montá-lo no html:

navigatorSearchOptions="{multipleSearch:true}"

Desta forma torna-se possível realizar a pesquisa por mais do que um campo simultaneamente.

Contudo a action não consegue receber os parãmetros selecionados na pesquisa.

De forma normal estes são recebidos pelos parãmetros:

// Search Field   
private String              searchField;   
  
// The Search String   
private String              searchString;

Mas quando implemento o navigatorSearchOptions="{multipleSearch:true}"

Eles não conseguem receber os parâmetros.

Olha só precisava saber se deve ser implementado na action um outro field tipo searchMultiple
não sei algo deste tipo

Bem, pelo visto ninguém nunca precisou disto.

Mas de qualquer forma obrigado!

kweles

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:
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%&gt;
&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt; 
&lt;%@ taglib prefix="sj" uri="/struts-jquery-tags"%&gt;
&lt;%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;

	&lt;sj:head jqueryui="true" jquerytheme="start" /&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Notas&lt;/h1&gt;

	<br>

	&lt;div id="nota"&gt;
	 &lt;s:url id="remoteurl" 	action="listaNotaEntrada"/&gt;
	 &lt;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" 
	    &gt; 
	        &lt;sjg:gridColumn 
	        	name="id_entrada" 
	        	index="id_entrada" 
	        	title="Id. Entrada" 
	        	formatter="integer" 
	        	sortable="false"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"
	        	/&gt; 
	        &lt;sjg:gridColumn 
	        	name="descricao" 
	        	index="descricao" 
	        	title="Descricao" 
	        	sortable="true"
	        	width="300"
	    		editable="true" 
	    		edittype="text"
	    		search="false" 
	    		/&gt;
 
	        &lt;sjg:gridColumn 
	        	name="id_regional" 
	        	index="id_regional" 
	        	title="Regional" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="true"
	    		searchoptions="{sopt:['eq']}" 
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="resumo" 
	        	index="resumo" 
	        	title="Resumo" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="true"
	    		searchoptions="{sopt:['eq']}" 
	        	/&gt;	        	
	        &lt;sjg:gridColumn 
	        	name="ano" 
	        	index="ano" 
	        	title="Ano" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="faturado" 
	        	index="faturado" 
	        	title="Faturado" 
	        	sortable="true"
				width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"	    		       	
	        	/&gt;
	    &lt;/sjg:grid&gt;	
	&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;

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:

  • searchField
  • searchString

Contudo quando se habilita a opção multiplesearch, ficaria ruim enviar tudo numa string, então o desenvolvedor da ferramente
decidiu enviar pela propertie:

  • filters

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&lt;Ven_notaentrada&gt; 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&lt;Ven_notaentrada&gt; getVnes() {
		return vnes;
	}


	public void setVnes(List&lt;Ven_notaentrada&gt; 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&lt;FieldMember&gt; 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&lt;FieldMember&gt; GetJsonValues( String json ) {	
		JSONObject obj 			= new JSONObject().fromObject(json);
		JSONArray objarray		= new JSONArray().fromObject(obj.getJSONArray("rules"));
				
		List&lt;FieldMember&gt; fms	= new ArrayList&lt;FieldMember&gt;();

		//{"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&lt;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 &gt;&lt; 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 &lt; 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!

Criado 4 de maio de 2010
Ultima resposta 6 de mai. de 2010
Respostas 3
Participantes 1