我有一个名为Brand的简单实体:
public class Brand{
private long id;
private String name;
//getters and setters
}
我有一个显示此数据的jsp:
<p>
<label for="id"><s:text name="brand.view.id" /></label>
<c:out value="${requestScope.brand.id}"></c:out>
</p>
<p>
<label for="name"><s:text name="brand.view.name" /></label>
<c:out value="${requestScope.brand.name}"></c:out>
</p>
<p>
<s:a action="edit_display" namespace="/brand"><s:text name="brand.view.button.edit" />
</s:a>
</p>
在这个jsp页面中,你会看到有一个按钮&#34;编辑&#34;这将使用户得到编辑表格。我希望这个表单填充品牌数据。
现在在struts.xml
我有下一个映射:
<package name="brand" namespace="/brand" extends="struts-default">
<action name="*_display">
<result name="success" type="dispatcher">/WEB-INF/view/brand/{1}.jsp
</result>
</action>
<action name="view" class="com.example.action.brand.ViewBrandAction">
<result name="success">/WEB-INF/view/brand/view.jsp</result>
</action>
<action name="edit" class="com.example.action.brand.EditBrandAction">
<result name="success">/WEB-INF/view/brand/edit.jsp</result>
</action>
</package>
现在逻辑是下一个:当用户点击/brand/edit_display
链接时,将不会调用任何操作,因此将显示空表单。
如果我想在jsp&#39;之间传递对象,我有哪些选项?动作链接,编辑页面上的ajax,另一个动作PopulateEditBrandAction
,构建查询参数字符串或者可能有更好的东西?
因为我知道用户想要编辑的对象 - 我可以简单地传递它吗?
答案 0 :(得分:1)
对edit_display的调用会创建一个带有新操作上下文的新请求。如果您希望不同的请求共享相同的数据,则必须使用该会话。
Struts2的方法是在你的Action中实现org.apache.struts2.interceptor.SessionAware
。
将对象保存在ViewBrandAction
:
userSession.put("some_namespace_brand", brand);
然后,您可以使用以下命令访问jsp中的对象:
<s:property value="#session.some_namespace_brand.id" />
或者实现你所谓的PopulateEditBrandAction
来获取对象:
brand = (Brand) userSession.get("some_namespace_brand");
请务必阅读相关文档,因为它解决了通过请求参数访问会话的安全风险。 https://struts.apache.org/docs/http-session.html