我正在使用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");
它有效。
答案 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}" />