quarta-feira, 18 de março de 2009

HTML: select (drop down) em cascata com MentaAjax

Finalmente acredito ter chegado a uma boa solução para controle de 3 campos select (drop down ou mesmo combobox) em cascatas. Para melhor ilustração aí vai o cenário da estrutura de dados. Tenho um catálogo de materiais, cada item deste catálogo faz parte de um subgrupo, cada subgrupo faz parte de um grupo e cada grupo faz parte de uma classe. Preciso selecionar o subgrupo a que pertence um item do catálogo e para tanto faz-se necessário: primeiro a seleção da classe, feita esta seleção o select com as grupos é preenchido; segundo faz-se a seleção do grupo e com isto o select dos subgrupos é preenchido para seleção final.
Estou desenvolvendo este catálogo em Java com mentawai para MVC. Tentei utilizar um cenário igual em que o cascateamento é feito com País, Estado e Cidade, desenvolvimento e relatado no fórum do mentawai, mas não obtive o resultado que desejava. Na verdade eu queria que ao ser feita uma nova seleção de classe, automaticamente os select com grupos e subgrupos fosse preenchidos automaticamente, sendo que o select dos grupos conteria os grupos da classe selecionada e o select dos subgrupos conteria os subgrupos do primeiro grupo da classe selecionada.
Chega de enrolação e vamos ao código!
Primeiro as configurações das actions no ApplicationManager:


action("/manager/FormMateriais", FormMateriais.class).on(SUCCESS, fwd("/manager/formMaterial.page"));
action("/manager/FormMateriais", FormMateriais.class, "add").on(SUCCESS, fwd("/manager/FormMateriais.mtw"));
action("/manager/FormMateriais", FormMateriais.class, "preencheComboGrupo").ajaxOk(new JSONGenericRenderer());
action("/manager/FormMateriais", FormMateriais.class, "preencheComboSubGrupo").ajaxOk(new JSONGenericRenderer());




Ao ser chamada URL /manager/FormMateriais.mtw, esta preenche a output com as classe, os grupos da primeira classe e os subgrupos do primeiro grupo da primeira classe. Como estou utilizando a tag html do mentawai (mtw:select) esta preenche automaticamente os select classe, grupo e subgrupo com os Maps da output.



@Override
public String execute() throws Exception {
Connection conn = (Connection) input.getValue("conn");

ClasseDAO classeDAO = new ClasseDAO(conn);
GrupoDAO grupoDAO = new GrupoDAO(conn);
SubGrupoDAO subGrupoDAO = new SubGrupoDAO(conn);

output.setValue("classe", classeDAO.getMap(classeDAO.list()));
output.setValue("grupo", grupoDAO.getMap(grupoDAO.list(classeDAO.list().get(0).getId())));
output.setValue("subgrupo", subGrupoDAO.getMap(subGrupoDAO.list(grupoDAO.list(classeDAO.list().get(0).getId()).get(0).getSeq())));
return SUCCESS;
}



Por fim, meu JSP com alguns recursos de Ajax disponibilizados pelo mentawai, permitem o preenchimento dinâmico dos selects grupo e subgrupo a cada evento onclick das selects classe e grupo.








< script type="text/javascript">
function getList(transport) {
var response = new mtw.response(transport);
response.replaceOptions("grupo");
}

function getList1(transport) {
var response = new mtw.response(transport);
response.replaceOptions("subgrupo");
}

function doRequest() {
var req = new mtw.request();
req.setUrl("FormMateriais.preencheComboGrupo.mtw");
req.addParameter("idClasse", $('classe').value);
mtw.removeOptions("grupo");
req.onSuccess(getList);
req.send();

doRequest1();
}

function doRequest1() {
var req1 = new mtw.request();
req1.setUrl("FormMateriais.preencheComboSubGrupo.mtw");
req1.addParameter("idClasse", $('classe').value);
req1.addParameter("idGrupo", $('grupo').value);
mtw.removeOptions("subgrupo");
req1.onSuccess(getList1);
req1.send();
}
< /script>




Bom, ainda não consegui resolver o problema de fazer os preenchimentos automáticos dos selects grupo e subgrupo para outros eventos que não o onclick, na verdade isto é um problema comigo ou com o mentawai, pois não consigo definir dois eventos diferentes nas tags mtw:select, assim resolvi usar onclick em detrimento a onchange ou mesmo onblur.

Era isto por enquanto. Abraços amigos.

sexta-feira, 13 de março de 2009

FISL 10


Buenas gurizada, já foi dada a largada para realização do FISL 10, este maravilhodo evento que ocorre todo ano aqui em Porto Alegre, desde 2000, e que nos permite compartilhar o sentimento único que cada usuário e promotor de software livre sente. Venham todos, tenho certeza que vai ser um evento memorável!

quarta-feira, 4 de março de 2009

Como definir limite de upload quando se dispõe de 2 link no servidor?

Ainda nem pude fazer experimentações com o tc+htb aplicando as regras propostas anteriormente aqui e já estou com a cabeça fervendo com as dificuldades que enfrentarei para fazer QoS de upload quando eu tiver 2 links a disposição.Não enfrentarei este mesmo problema para download, pois o tráfego para o cliente vai ser entregue pelo meu roteador QoS.
O "problema" que destaco é porque o upload do cliente ser daria por duas interfaces distintas, uma de cada link, por exemplo, uma com 2mb/s e outra com 1mb/s, enquanto que, voltando ao download, este se dá através de uma única interface de saída.
Digamos que eu queira oferecer ao cliente 256kb/s de download e 128bk/s de upload, estes 256kb/s pode ser uma somatória do que estiver vindo por um ou outro link, mas será sempre entregue por uma única interface de rede do QoS ligada aos clientes. Eu poderia fazer controle de upload em cada uma das interfaces de saída, ou seja, definir 44kb/s de upload pelo link de 1mb/s e 84kb/s de upload pelo link de 2mb, acho que seria um bom cenário, mas recaio no problema de não poder controlar upload desta forma fazendo NAT, pois não poderia identificar o cliente no momento do upload, devido ao tc que trabalharia sobre o IP do roteador NAT que já haveria feito o mascaramento, por exemplo:


+-----+ +-----+
|Link1| |Link2|
+--+--+ +--+--+
| |
+--+--------+--+
| NAT |
+------+-------+
|
| clientes


Então pensei em um cenário, que ainda não saberia dizer se operaria a contento, ainda vai demandar testes que seria:


+-----+ +-----+
|Link1| |Link2|
+--+--+ +--+--+
| |
+--+--------+--+
| NAT |
| Squid |
+------+-------+
|
+------+-------+
| QoS |
+------+-------+
|
| clientes


No roteador NAT/Squid faria o balanceamento de carga ou mesmo somente o direcionamento de tráfegos, ou seja, http e voip para o link 1 e o resto para o link 2, ou qualquer outra definição mais apropriada.
Tenho um sentimento que esta solução para upload não ofereceria a mesma qualidade no oferecimento de link aos clientes do que o upload, ambos feitos pelo QoS, mas é apenas uma impressão e ainda teria que raciocinar mais.

Um grande abraço a todos.

terça-feira, 3 de março de 2009

Autocomplete com mentawai

Como podem ver pelos posts, estou tocando dois pequeninos projetos, um em asp.net e outro em j2ee e sem dúvida que prefiro muito mais j2ee, parece que o desenvolvimento flui melhor e acredito que seja pela vasta documentação sobre tudo que se possa pensar, além de parecer gerar uma aplicação bem mais responsiva que asp.net, exatamente no sentido tempo de acesso ao banco de dados oracle como geração da saída para o browser do cliente.

Pois bem, voltemos ao assunto, eu já havia tentado implementar autocomplete com ajaxtoolkit no asp.net através da implementação de um webservice (necessário, mas de implementação simples no visual studio), só que não gerou um bom resultado, sendo apresentados alguns bugs, principalmente quando precisava dar foco no textbox e selecionar o conteúdo através de código.

Já estava preparado para amargurar alguns percalços com mentawai e parti pro abraço, mas fui decepcionado pela simplicidade do processo, sendo o mais complicado incluir os jar do json-lib, ezmorph, json, commons-logging e ajaxtags, pois tentei com os mais atualizados e não consegui rodar a aplicação, então baixei o mentawai completo e copiei dele os jar destas bibliotecas e transcorreu tudo perfeitamente.

Em meu jsp, por exemplo, BuscaMaterial.jsp tenho:

<mtw:inputtext name="descricao" id="descricao" size="50"/>
<div id="completeHere" class="auto_complete"/>
<mtw:ajaxcompleter onsuccess="completeText" source="descricao" target="completeHere" url="Filtro.autoCompleter.mtw">


e no head do meu Template.jsp:

<script type="text/javascript">
function completeText(key, value) {
}
</script>
<mtw:ajaxconfig loadprototype="true"/>


Já o método autoCompleter da action Filtro retorna um Map com a lista que eu desejar:

Map map = new LinkedHashMap();

while (rset.next()) {
BigDecimal numero = rset.getBigDecimal("id");
map.put(numero.longValue(), rset.getString("nome"));
}

output.setValue(AjaxConsequence.KEY, map);


Era isto galera!

Preencher TextBox como resultado de uma seleção no DropDownList em asp.net

Isto sem dúvida é algo bem simples e só fui descobrir isto porque após uma rápida procura frustrada no google parei e pensei em uma solução. Realmente, antes de simplesmente pensar em algo parti pro google para ele "pensar" por mim. Ok, mas vamos à situação: tenho um DropDownList com uma lista de materiais e queria preencher o conteúdo de um TextBox com o valor unitário daquele material após a seleção de algum item. As primeiras tentativas foram sobre CascadingDropDown ou algo similar, mas foram infrutíferas, então pus-me a pensar
- Mas se estas joça de asp.net é orientada a eventos, porque simplesmente não codifico a busca do valor unitário e o preenchimento deste TextBox no evento disparado pela seleção de um item do DropDownList? E foi o que fiz, cuidando para alterar a propriedade AutoPostBack do DropDownList para true, depois codifiquei o evento SelectedIndexChanged com:

String id = cMaterial.SelectedValue;

if (!string.IsNullOrEmpty(id)) {
Material material = MaterialDAO.Get(int.Parse(id));
cValorUnitario.Text = material.valorUnitario.ToString();
}

Pronto!