Struts 如何使用对象预填充编辑表单
Struts how to prepopulate edit form with object
我有一个名为品牌的简单实体:
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 页面中,您会看到有一个按钮 "Edit" 可以让用户进入编辑表单。我希望使用品牌数据填充此表单。
现在 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
link 时,不会调用任何操作,因此会显示空表单。
如果我想在 jsp 之间传递对象,我有什么选择?操作链接,编辑页面上的 ajax,另一个操作 PopulateEditBrandAction
,构建查询参数字符串或者可能有更好的东西?
因为我知道用户想要编辑的对象 - 我可以简单地传递它吗?
对 edit_display 的调用创建了一个具有新操作上下文的新请求。如果想让不同的请求共享相同的数据,就得用session了。
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
我有一个名为品牌的简单实体:
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 页面中,您会看到有一个按钮 "Edit" 可以让用户进入编辑表单。我希望使用品牌数据填充此表单。
现在 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
link 时,不会调用任何操作,因此会显示空表单。
如果我想在 jsp 之间传递对象,我有什么选择?操作链接,编辑页面上的 ajax,另一个操作 PopulateEditBrandAction
,构建查询参数字符串或者可能有更好的东西?
因为我知道用户想要编辑的对象 - 我可以简单地传递它吗?
对 edit_display 的调用创建了一个具有新操作上下文的新请求。如果想让不同的请求共享相同的数据,就得用session了。
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