如何改变布局定义运行时在TileRequestProcessor



我有一个场景,当请求来自IE浏览器,然后显示login(这是默认行为),当它来自Chrome浏览器,然后显示login_chrome(布局定义是在tile .xml如下)

<definition name="login" path="/login/login1.jsp"></definition>
<definition name="login_chrome" path="/login/login2.jsp"></definition>

还有CustomizedTileProcessor

    public class CustomizedTileProcessor extends TilesRequestProcessor
    {
     @Override
   protected boolean processTilesDefinition(String pDefinitionName, boolean pContextRelative, HttpServletRequest pRequest, HttpServletResponse pResponse) throws IOException, ServletException
   {
      if (isChromeBrowser(pRequest))
      {
         pDefinitionName+="_chrome";
      }
      return super.processTilesDefinition(pDefinitionName, true, pRequest, pResponse);
   } 
}

注意:我不想在JSP中放入逻辑来根据条件选择包含的JSP。

请帮助我,告诉我应该覆盖TilesRequestProcessor的哪个方法来动态改变tile的定义?

在做了大量的试错之后,我知道我必须重写TilesRequestProcessorprocessForwardConfig方法。在这里我必须覆盖path的值ForwardConfig对象的值到我的新布局即login_chrome

请参见下面的代码:

public class CustomizedTileProcessor extends TilesRequestProcessor
    {
     @Override
 protected void processForwardConfig(HttpServletRequest pRequest, 
       HttpServletResponse pResponse, ForwardConfig pForward) 
       throws IOException, ServletException
   {
      if(isChromeBrowser(pRequest))
      {
         ForwardConfig newForward = new ForwardConfig(pForward.getName(),
         pForward.getPath()+"_chrome", pForward.getRedirect(),
         pForward.getContextRelative());
         super.processForwardConfig(pRequest, pResponse, newForward);
      }
      else
      {
         super.processForwardConfig(pRequest, pResponse, pForward);
      }
   }
}

最新更新