【问题标题】:tr:commandLink action method does not navigate to next page.Instead loads same page againtr:commandLink 操作方法不会导航到下一页。而是再次加载同一页面
【发布时间】:2011-12-31 07:59:27
【问题描述】:

在我的 JSF 应用程序中,成功登录后,我将导航到我的应用程序主页,其中有一个 Logout 链接。

这里是注销链接的相关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";
    }
}

在构造函数中,我检查会话中的用户 ID 并将特定列表加载给用户。

我还有一个ServletFilter,它会检查每个会话中的某个 id。如果找不到,它会重定向到 InvalidUser 页面。我的过滤器映射到 /faces/jsp/*,以便检查 jsp 文件夹中的所有 jsp会话中的 id。

这是我的过滤器的doFilter 方法

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.

            }

    }

我还添加了一个PhaseListener 来调试来自here 的JSF 生命周期。

第一次加载页面时,我看到以下服务器日志,其中只有 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)

上面的日志是预期的,因为没有表单提交类型的东西。所以只列出了第一阶段和最后阶段。

但是当我点击我在这篇文章顶部提到的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 阶段,它会尝试重新加载我的同一个主页 url。显然它在会话中没有id,这会导致抛出NullPointerException

我在上面给出的相应文件夹中有 jsp。我使用的是 JSF 1.2 和 myFaces 1.2.9。

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

2)为什么又重新加载了我的主页url?

请有人帮忙。

【问题讨论】:

    标签: jsf myfaces jsf-1.2


    【解决方案1】:

    我发现这是 JSF 中的注销问题。不是 tr:commandLink 的问题。

    我在 SO 上阅读了一些关于 JSF 注销问题的帖子并实施了相同的操作。

    它按预期工作。

    【讨论】:

    • 嘿Sreeram!您能否更具体地说明您的固定内容。在重新部署到 Tomcat 后,我​​在旧的 JSF 项目上收到“错误 org.apache.myfaces.config.FacesConfigurator - 配置对象不支持清理。更新中止”。最糟糕的是,它是某种随机的。有时我得到它有时它工作正常。
    猜你喜欢
    • 2019-12-03
    • 2015-05-08
    • 2014-08-09
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多