我有一个场景,当请求来自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的定义?
在做了大量的试错之后,我知道我必须重写TilesRequestProcessor
的processForwardConfig
方法。在这里我必须覆盖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);
}
}
}