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