0

我正在使用带有瓷砖的 struts 1.1。

我有像这样定义的瓷砖

<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");

它奏效了。

4

1 回答 1

0

您可能想要查看对控制器类的磁贴支持。瓷砖 def 条目看起来像这样:

<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");
      }

    }
}

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

<c:import url="${nameOfJSPToImport}" />
于 2009-06-05T00:50:07.497 回答