tr:commandLink操作方法不会导航到下一个页面。反而会再次加载相同的页面

问题描述:

在我的JSF应用程序中,成功登录后,我正在导航到我的应用程序主页,其中有一个Logout链接。tr:commandLink操作方法不会导航到下一个页面。反而会再次加载相同的页面

这里是注销链接的相关html。

<div id="top_white"> 
     <div style="float: right"><tr:form><tr:commandLink id="logout" action="#{Controller.Logout}"><img alt="logout" src="../../images/logout.gif"/></tr:commandLink></tr:form></div> 
    </div> 

这里是我Controller这是sessionscoped

public class Controller { 

    private static Logger LOGGER = Logger.getLogger(Controller.class); 

    public Controller() { 
     req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     session = req.getSession(false); 
     String userid = session.getAttribute("userid").toString(); 
     if(List == null){ 
      List = new ArrayList<List>(); 
      List = new DAO().loadListByid(Long.valueOf(userid)); 
      LOGGER.debug("successfully loaded the list for the user"); 
     } 
    } 

    private long Username; 
    private String Password=null; 
    HttpServletRequest req; 
    HttpSession session; 


    private List<List> List=null; 
    // getter and setters 


    public String Logout(){ 
     session.invalidate(); 
     LOGGER.debug("In LogOut"); 
     return "loggedout"; 
    } 
} 

在构造函数中我检查会话用户名和加载特定的列表提供给用户。

我也有一个ServletFilter这在每个session.If它检查一些ID没有发现它重定向到InvalidUser page.My过滤器在被检查的ID映射到/faces/jsp/*让所有JSP的JSP中的文件夹会话。

这里是我的过滤器

public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

      LOGGER.debug("In doFilter"); 
      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 
      HttpSession session = request.getSession(false); 
      LOGGER.debug("request:" + request.getRequestURL().toString()); 
      try{ 
       if (session.getAttribute("id") != null) { 
        LOGGER.debug("id found:" + session.getAttribute("id")); 
        chain.doFilter(req, res); // id found, so just continue request. 
       } 
      }catch(NullPointerException e){ 
       LOGGER.debug("No id found Exception: ", e); 
       response.sendRedirect(properties.getProperty(INVALID_USER_REDIRECTURL, true)); // No id found, so redirect to Invalid user page. 

      } 

    } 

doFilter方法我还添加了PhaseListener调试是从here采取JSF生命周期。

当页面第一次加载我看到下面的服务器日志与

["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepageurl 
["http-bio-8090"-exec-114] DEBUG SessionFilter - id found 
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in RESTORE_VIEW(1) because getRenderResponse is true from one of the after listeners 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-114] INFO org.apache.myfaces.config.annotation.DefaultLifecycleProviderFactory - Using LifecycleProvider org.apache.myfaces.config.annotation.AllAnnotationLifecycleProvider 
["http-bio-8090"-exec-114] DEBUG Controller - id found in controller 
["http-bio-8090"-exec-114] DEBUG DAOProperties - dao.properties loaded successfully 
["http-bio-8090"-exec-114] DEBUG SvrConnection - In JNDI 
["http-bio-8090"-exec-114] DEBUG DAO - Successfully connected to database 
["http-bio-8090"-exec-114] DEBUG DAO - connection closed 
["http-bio-8090"-exec-114] DEBUG Controller - successfully loaded the list for the user 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6) 

不出所料以上日志JSF生命周期的只有第一个和最后阶段因为stuff.So没有表单提交类型只列出第一个和最后一个阶段。

但真正的问题出现在我点击Logout commandLink时,我在这篇文章的顶部提到过。

当我点击Logout链接后,这里是服务器日志。

["http-bio-8090"-exec-114] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-114] DEBUG SessionFilter - request:http://my homepage url 
["http-bio-8090"-exec-114] DEBUG SessionFilter - appid found 
["http-bio-8090"-exec-114] ERROR org.apache.myfaces.config.FacesConfigurator - Configuration objects do not support clean-up. Update aborted 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RESTORE_VIEW(1) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE APPLY_REQUEST_VALUES(2) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE APPLY_REQUEST_VALUES(2) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE PROCESS_VALIDATIONS(3) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE PROCESS_VALIDATIONS(3) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE UPDATE_MODEL_VALUES(4) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE UPDATE_MODEL_VALUES(4) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE INVOKE_APPLICATION(5) 
["http-bio-8090"-exec-114] DEBUG Controller - In LogOut 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE INVOKE_APPLICATION(5) 
["http-bio-8090"-exec-114] DEBUG org.apache.myfaces.lifecycle.LifecycleImpl - exiting from lifecycle.execute in INVOKE_APPLICATION(5) because getRenderResponse is true from one of the after listeners 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - START PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-114] DEBUG LifeCycleListener - END PHASE RENDER_RESPONSE(6) 
["http-bio-8090"-exec-116] DEBUG SessionFilter - In doFilter 
["http-bio-8090"-exec-116] DEBUG SessionFilter - request:http://my homepage url 
["http-bio-8090"-exec-116] DEBUG SessionFilter - No id found Exception: 
java.lang.NullPointerException 

从上面的日志,果然我的行动方法被调用在INVOKE_APPLICATION和我的控制器的Logout()方法被调用和会话无效并返回字符串loggedout

我在faces-config.xml

<navigation-rule> 
    <from-view-id>/jsp/Services.jsp</from-view-id> 
    <navigation-case> 
     <from-outcome>loggedout</from-outcome> 
     <to-view-id>/others/Logout.jsp</to-view-id> 
    </navigation-case> 
    </navigation-rule> 

以下导航规则但这navigation-rule不执行。相反,在RENDER_RESPONSE阶段,它会尝试重新加载我的同一首页网址。显然它没有在会话中导致抛出NullPointerExceptionid

我在上面给出的各个文件夹中有jsp's。我使用的是JSF 1.2和myFaces 1.2.9。

1)为什么navigation-case不执行?

2)为什么它重新加载我的主页网址?

请有人帮忙。

我发现这是JSF中的一个注销问题。tr:commandLink没有问题。

我在SO上阅读了一些关于JSF注销问题的文章,并且实现了相同的功能。

它按预期工作。

+0

嘿Sreeram! 你能否更具体地说明你的固定。 重新部署到Tomcat后,旧JSF项目中出现“ERROR org.apache.myfaces.config.FacesConfigurator - 配置对象不支持清理。更新中止”。最糟糕的是,它是某种随机的。有时我得到它有时它工作正常。 –