-
FEATURED COMPONENTS
First time here? Check out the FAQ!
<?page title="Cadastrar Agenda" contentType="text/html;charset=UTF-8"?> <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main"?> <?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver" ?> <zk> <window id="configurar" border="none" apply="${configuracao}" height="100%" width="100%"> ..... ..... </window> </zk>
package br.com.romulo.agenda.controllers; import java.util.List; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.ForwardEvent; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zkplus.spring.SpringUtil; import org.zkoss.zul.Div; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listitem; import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.Tab; import org.zkoss.zul.West; import br.com.romulo.agenda.bean.DadosSistemaBean; import br.com.romulo.agenda.model.UsuarioAgenda; import br.com.romulo.agenda.service.UsuarioAgendaManager; @Controller("configuracao") @Scope("session") public class Configuracao extends GenericForwardComposer{ /** * */ private static final long serialVersionUID = 897352560076336323L; public static final int GERAL = 0; public static final int AGENDAS = 1; ListModelList menuModel1 = new ListModelList(); List<UsuarioAgenda> lua; Listbox box; MenuNodeSelectListener listener1 = new MenuNodeSelectListener(); MenuNodeItemRenderer renderer1 = new MenuNodeItemRenderer(); Div contentDiv; West bWest; UsuarioAgendaManager usuarioAgendaManager; DadosSistemaBean DadosSistemaBean; Tab geral; Tab agendas; private int aba; public Configuracao(){ } public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); popularUsuarioAgenda(); box.setItemRenderer(renderer1); box.addEventListener(Events.ON_SELECT,listener1); agendas.setLabel("asd"); switch (aba) { case AGENDAS: agendas.setSelected(true); break; default: geral.setSelected(true); break; } } public void popularUsuarioAgenda() { menuModel1.clear(); List<UsuarioAgenda> lUsuarioAgenda = usuarioAgendaManager.consultar(); lua = lUsuarioAgenda; for (UsuarioAgenda usuarioAgenda : lUsuarioAgenda) { menuModel1.add(new MenuNode(usuarioAgenda,"cadastrarAgenda.zul")); } box.setModel(menuModel1); } class MenuNode { UsuarioAgenda usuarioAgenda; String link; public MenuNode(UsuarioAgenda usuarioAgenda,String link){ this.usuarioAgenda = usuarioAgenda; this.link = link; } public UsuarioAgenda getUsuarioAgenda() { return usuarioAgenda; } public void setLabel(UsuarioAgenda usuarioAgenda) { this.usuarioAgenda = usuarioAgenda; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } } class MenuNodeItemRenderer implements ListitemRenderer{ public void render(Listitem item, Object data) throws Exception { MenuNode node = (MenuNode)data; item.setImage("icon-24x24.png"); item.setLabel(node.getUsuarioAgenda().getNome()); item.setValue(node); } } class MenuNodeSelectListener implements EventListener{ public void onEvent(Event event) throws Exception { Listitem item = box.getSelectedItem(); contentDiv.getChildren().clear(); if(item!=null){ CadastrarAgenda ca = (CadastrarAgenda) SpringUtil.getBean("cadastrarAgenda"); MenuNode node = (MenuNode)item.getValue(); ca.setUsuarioAgenda(usuarioAgendaManager.getById(node.getUsuarioAgenda().getId())); Executions.createComponents(node.getLink(),contentDiv,null); } } } public void onClick$voltarAgendaTopo(ForwardEvent event) { voltarAgenda(); } public void onClick$voltarAgendaRodape(ForwardEvent event) { voltarAgenda(); } public void voltarAgenda() { contentDiv.getChildren().clear(); Executions.createComponents("calendar.zul",contentDiv,null); bWest.setVisible(true); } public void onClick$adicionarAgenda(ForwardEvent event) { contentDiv.getChildren().clear(); CadastrarAgenda ca = (CadastrarAgenda) SpringUtil.getBean("cadastrarAgenda"); DadosSistemaBean db = (DadosSistemaBean) SpringUtil.getBean("DadosSistemaBean"); UsuarioAgenda usuarioAgenda = new UsuarioAgenda(); usuarioAgenda.setIdUsuario(db.getUsuarioLogado().getId()); ca.setUsuarioAgenda(usuarioAgenda); ca.setOrigem("configuracao"); Executions.createComponents("cadastrarAgenda.zul",contentDiv,null); } public int getAba() { return aba; } public void setAba(int aba) { this.aba = aba; } public List<UsuarioAgenda> getLua() { return lua; } public void setLua(List<UsuarioAgenda> lua) { this.lua = lua; } }
public void onClick$configuracoes(ForwardEvent event) { bWest.setVisible(false); contentDiv.getChildren().clear(); Configuracao co = (Configuracao) SpringUtil.getBean("configuracao"); co.setAba(Configuracao.AGENDAS); Executions.createComponents("configuracao.zul",contentDiv,null); }
Make a test with scope="prototype"
Hello Terry. With prototype Works fine, but i can't pass parameters with
Configuracao co = (Configuracao) SpringUtil.getBean("configuracao"); co.setAba(Configuracao.AGENDAS);
How can I pass parameters to a prototype bean? When I work with jsf i use session and pass parameters before load the page with getBean.
Thanks.
Try
1.
public void onClick$configuracoes(ForwardEvent event) { . . . HashMap<String, Object> map = new HashMap<String, Object>(); map.put("aba", "AGENDAS"); Executions.createComponents("configuracao.zul",contentDiv, map);
2. You must correct the aba type
@Override public void doAfterCompose(Component window) throws Exception { super.doAfterCompose(window); . . . if (this.arg.containsKey("aba")) { setAba(String) this.arg.get("aba")); . . . popularUsuarioAgenda(); box.setItemRenderer(renderer1); box.addEventListener(Events.ON_SELECT,listener1); agendas.setLabel("asd"); switch (aba) { case AGENDAS: agendas.setSelected(true); break; default: geral.setSelected(true); break; }
Now with scope("prototype") all logged user are using de same bean.
i had BorderLayoutComposer as the main layout, with a border layout
package br.com.romulo.agenda.controllers; @Controller("borderLayoutComposer") @Scope("prototype") public class BorderLayoutComposer extends GenericForwardComposer{ /** * */ DadosSistemaBean DadosSistemaBean; }
And DadosSistemaBean:
package br.com.romulo.agenda.bean; import br.com.romulo.agenda.model.Usuario; @Bean(name = "DadosSistemaBean") @Scope("session") public class DadosSistemaBean { private Usuario usuarioLogado; public DadosSistemaBean() { } public Usuario getUsuarioLogado() { return usuarioLogado; } public void setUsuarioLogado(Usuario usuarioLogado) { this.usuarioLogado = usuarioLogado; } }
This bean work as a storege to user keeping the logged user or the calendar he seeing. I need it because if I have two users logged, probably they are seeing diferent things.
So, after I change the "BorderLayoutComposer" to @Session("prototype") all the logged user are using the same "DadosSistemaBean". How can i resolve it?
Hmmmmmmmmm, scope=prototype
from the spring doc:
3.4.2. The prototype scope
The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made ...
Spring-documentation, Chapüter 3.4 Bean scopes.
If you would have that users have different 'views' or components that they belong to, than it's a kind of the view/security logic and not the scope of a bean.
Stephan
ashishd, Yes, they have tehe same hashcode.
Terry, can be a problem with spring security. Because if I log in in Firefox, when I acess by I.E. the system don't ask me log in.
My spring security.xml
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <http auto-config="false" entry-point-ref="authenticationProcessingFilterEntryPoint" access-denied-page="/negado.jsp"> <logout logout-success-url="/login.zul" /> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <!-- All other resources to require users to have user role USER_ROLE to view --> <intercept-url pattern="/*.zul" access="ROLE_ADMIN,ROLE_USER" /> <!-- Don't apply any filters to the login form either, we want unauthenticated users to be able to see this --> <intercept-url pattern="/login.zul" filters="none" /> <!-- CUSTOM FILTERS --> <custom-filter ref="languageProcessingFilter" after="FORM_LOGIN_FILTER"/> </http> <authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="userDetailServiceImpl"/> </authentication-manager> <beans:bean id="authenticationFailureHandler" class="br.com.romulo.agenda.springSecurityCustomFilters.AuthenticationFailHandler"/> <beans:bean id="languageProcessingFilter" class="br.com.romulo.agenda.springSecurityCustomFilters.MyAuthenticationProcessingFilter"> <beans:property name="authenticationManager" ref="authenticationManager"/> <beans:property name="authenticationFailureHandler" ref="authenticationFailureHandler"/> </beans:bean> <beans:bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.AuthenticationProcessingFilterEntryPoint"> <beans:property name="loginFormUrl" value="/login.zul"/> </beans:bean> </beans:beans>
MyAuthenticationProcessingFilter.java
package br.com.romulo.agenda.springSecurityCustomFilters; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import br.com.romulo.agenda.bean.DadosSistemaBean; import br.com.romulo.agenda.service.UsuarioManager; import br.com.romulo.agenda.spring.SpringBeanFactoryUtil; public class MyAuthenticationProcessingFilter extends UsernamePasswordAuthenticationFilter { DadosSistemaBean dSB; UsuarioManager usuarioManager; @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper((HttpServletRequest) request) { @Override public String getParameter(String parameter) { if (parameter.equals("spring-security-redirect")) { return "/agenda/principal.zul"; } return null; } }; super.successfulAuthentication(wrapper, response, authResult); dSB = (DadosSistemaBean) SpringBeanFactoryUtil .getBean("DadosSistemaBean"); usuarioManager = (UsuarioManager) SpringBeanFactoryUtil .getBean("usuarioManager"); dSB.setUsuarioLogado(usuarioManager.consultarPorLogin(authResult.getName())); System.out.println("==successful login=="); } /**@Override protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) { super.setDetails(request, authRequest); // String selectedLanguage = request.getParameter("request_locale"); }*/ }
UserDetailServiceImpl.java
package br.com.romulo.agenda.springSecurityCustomFilters; import java.util.ArrayList; import java.util.Collection; import net.sourceforge.sannotations.annotation.Bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import br.com.romulo.agenda.model.Usuario; import br.com.romulo.agenda.service.UsuarioManager; import br.com.romulo.agenda.utils.StringUtils; @Bean(name = "userDetailServiceImpl") public class UserDetailServiceImpl implements UserDetailsService { @Autowired private UsuarioManager usuarioManager; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { if (!StringUtils.isEmptyOrNull(username)) { final Usuario usuario = usuarioManager.consultarPorLogin(username); if (usuario != null) { final User user; Collection<GrantedAuthority> nivel = new ArrayList<GrantedAuthority>(); GrantedAuthorityImpl teste = new GrantedAuthorityImpl( usuario.getNivelAcesso()); nivel.add(teste); user = new User(usuario.getLogin(), usuario.getSenha(), true, true, true, true, nivel); if (user != null) { return user; } } } return null; } }
DEBUG (AbstractBeanFactory.java:242) - Returning cached instance of singleton bean 'dadosSistemaBean'
DEBUG (AbstractBeanFactory.java:242) - Returning cached instance of singleton bean 'dadosSistemaBean'
But the the scope is session
@Bean(name = "dadosSistemaBean")
@Scope("session")
public class DadosSistemaBean {
}
Hmmmm, maybe it have to do with the bean dependencies.
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
Asked: 2010-10-07 19:25:16 +0800
Seen: 2,639 times
Last updated: Oct 14 '10