如何在Struts动作类中设置磁贴的正文URL?

时间:2008-11-21 16:13:53

标签: java struts tiles

我正在使用struts 1.1 with tiles。

我有像

这样的定义的图块
<definition name="cnmp.body.index" extends="cnmp.mainLayout" >
  <put name="title"  value="CNM Portal" />
  <put name="bodytitle"  value="Home" />
  <put name="body"   value="/00-CNM_Landing.jsp" />
</definition>

我希望能够在我的java Action类中设置body参数的值。 我会从ActionMapping或ActionForm获得什么来做到这一点?

public class TileForwardAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm arg1,
        HttpServletRequest arg2, HttpServletResponse arg3) throws Exception
{
    return mapping.findForward("theTile");           
}
}

struts配置文件看起来像

  <action-mappings>

  <action   path = "/index"
            type = "com.bellsouth.snt.cnmp.ui.action.TileForwardAction"
            scope = "request"
            input = "cnmp.body.index"
            parameter= "theTile"
    >    
      <forward name="theTile" path="cnmp.body.index"/>       
  </action>

谢谢


受到接受的答案的启发,我提出了以下解决方案

在tile def中定义的页面中,我有以下内容

<% String destAttr=(String)request.getAttribute("dest"); %>

<jsp:include page="<%=destAttr%>" flush="true" />

在动作类中(因为我很懒)我有以下

    request.setAttribute("dest", "landingB.jsp");

它有效。

1 个答案:

答案 0 :(得分:0)

您可能希望查看控制器类的切片支持。 tile def entry看起来像这样:

<definition 
  name="cnmp.body.index" 
  extends="cnmp.mainLayout"
  controllerClass="org.yourpackage.YourControllerClass">
  <put name="title"  value="CNM Portal" />
  <put name="bodytitle"  value="Home" />
  <put name="body"   value="/00-CNM_Landing.jsp" />
</definition>

然后YourControllerClass将实现perform()方法,如:

public class YourControllerClasss implements Controller
    public void perform(ComponentContext context,
      HttpServletRequest request,
      HttpServletResponse response,
      ServletContext servletContext)
      throws ServletException, IOException {

      //some logic to determine what the 'body' should be

      if (service.isUp()){
        request.setAttribute("nameOfJSPToImport", "/jsps/import-me.jsp");
      }else{
        request.setAttribute("nameOfJSPToImport", "/jsps/import-me-instead.jsp");
      }

    }
}

上面的示例可以直接在您的操作中完成而不使用TilesControllers,但TilesController可以帮助您减少操作的混乱。无论技术如何,总体目标是参数化NM_Landing.jsp,然后实际更改定义的“body”属性使用的jsp。例如,NM_landing.jsp可能只是包含类似

的调用
<c:import url="${nameOfJSPToImport}" />