Я использую распорки 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>
Я хочу иметь возможность устанавливать значение параметра body в моем классе действий Java. Что я могу получить от 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");
И это сработало.




Возможно, вы захотите изучить поддержку плиток для классов контроллеров. Запись определения плиток будет выглядеть примерно так:
<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, а затем фактически изменить, какой jsp используется атрибутом "body" определения. Например, NM_landing.jsp может быть не чем иным, как включить вызов чего-то вроде
<c:import url = "${nameOfJSPToImport}" />