Zkoss - tem me parecido bastante produtivo, pelo menos todas as críticas feitas com relação a ele, são boas.
Estou iniciando um projeto Web/Tomcat, no qual inicialmente, preciso de um form de login, Um menu treeview dinâmico que será montado de acordo com as perms do user, e um cadastro de usuários para este sistema.
Minhas dúvidas são:
[list]Existe algum incompatibilidade do ZKoss com algum framework MVC?
[/list]
[list]Posso usar tags JSTL, junto com as tags do ZKoss no mesmo arquivo JSP?
[/list]
[list]Qual a melhor forma de usar o ZKoss, fazendo request/response por meio de servlets, usando um framework MVC? [/list]
Há alguma alternativa mais viável, para ajax, além do ZK?
sobre o ZK:
[list]no site vc encontra exemplo de integração com os mais populares frameworks como: spring, struts, ejb veja
[/list][list]existe uma extensão que permite vc usar ZUL (zk tags) e JSP (com suas taglibs) na mesma página incluisive veja[/list][list]a melhor forma é não usar servlet, e sim um XML para view e uma classe para controller[/list]
veja um exemplo com um MVC approach:
<window border="normal" apply="com.me.MyController">
<grid width="80%">
<rows>
<row>textbox: <textbox id="source1"/></row>
<row>dateBox: <datebox id="source2"/></row>
<row>output: <textbox id="copy" readonly="true"/></row>
</rows>
</grid>
</window>
a janela na página tem apply=“com.me.MyController” que se refere a classe Java:
[code]package com.me;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Textbox;
public class MyController extends GenericForwardComposer {
protected Textbox copy;
protected Textbox source1;
protected Datebox source2;
public void onChange$source1(Event event) throws Exception {
copy.setValue(source1.getValue());
}
public void onChange$source2(Event event) throws Exception {
copy.setValue(source2.getValue().toString());
}
}[/code]
isso é o que eu chamo de “mamão com açucar”
vejo como único contra do ZK: dual license
Na minha servlet eu instâncio o objeto, e seto os valores que são passados por parâmetro pelo jsp, assim gravo os dados via DAO.
No Zk, modelo acima, não entendi como é que é feita a relação/instanciação com as classes bean/dao?
public class TipoEntidadeServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//cria objeto
TipoEntidade tipoEntidade = new TipoEntidade();
//define as variáveis que virão do formulário jsp
String idEntidade = req.getParameter("idTipoEntidade");
String descr = req.getParameter("descr");
//atribui aos sets os valores das variáveis
tipoEntidade.setIdTipoEntidade(idEntidade);
tipoEntidade.setDescr(descr);
try{
TipoEntidadeDAO tipoEntidadeDAO = new TipoEntidadeDAO();
tipoEntidadeDAO.deleta(tipoEntidade);
}catch (SQLException e) {
throw new ServletException(e);
}
PrintWriter pw = res.getWriter();
pw.println("<html>");
pw.println("Tipo de entidade foi adicionada!");
pw.println("</html>");
}
}
simples!
se eu por um botão para ação assim:<button id="gravarButton" label="Gravar" />
o código do controller seria algo como://...
public void onClick$gravarButton(Event event) {
ContactManager contactManager = (ContactManager)SpringUtil.getBean("contactManager");
Contact contact = new Contact();
// ... devidos sets
contactManager.save(contact);
}
e não há necessidade de criar o listener, ele o faz por reflection. mas vc pode optar e fazê-lo para melhorar performance
neste caso o DAO está sendo tratado pelo manager com controle de transações. springframework.
tem mais utilitarios para ingreação com outros frameworks, com hibernate direto ou JDBC.
Cara estou com problemas para inserir os dois campos label e link.
Ele grava no banco como null, ou seja, não esta recebendo os valores passados pelo textbox.
Só falta esse detalhe.
<window id=“taskWnd” title=“Task Editor” border=“normal” width=“500px” apply=“mvc.TaskEditorComposer”>
<grid>
<rows>
<row>Label: <textbox id=“label” /></row>
<row>Link: <textbox id=“link” /></row>
<row><button id=“saveBtn” label=“Save” forward=“onClick=onSaveTask”/></row>
</rows>
</grid>
</window>
public class TaskEditorComposer extends GenericAutowireComposer{
private Textbox label; //auto wired
private Textbox link; //auto wired
private Button saveBtn; //auto wired
public void onSaveTask(Event event) throws SQLException {
AcessoHp acessoHP = new AcessoHp();
AcessoHPDAO acessoHPDAO = new AcessoHPDAO();
AcessoHp acessoPai = new AcessoHp();
TipoAcesso tipoAcesso = new TipoAcesso();
acessoHP.setIdAcesso(10);
tipoAcesso.setIdTipoAcesso(2);
acessoHP.setTipoAcesso(tipoAcesso);
acessoPai.setIdAcessoHp(1);
acessoHP.setAcessoPai(acessoPai);
[b]label.setValue(acessoHP.getLabel());
link.setValue(acessoHP.getLink());[/b]
acessoHPDAO.insere(acessoHP);
}
vc está “trocando as bolas” aí
para salvar no DB, vc deve pegar os dados dos campos e por na instância.
acessoHP.setLabel( label.getText() );
acessoHP.setLink( link.getText() );
vc está fazendo o inverso
Realmente, vacilei no detalhe aí. Obrigado vc ajudou demais.