0

默认情况下,OpenXava 使用相同的视图来创建新实体和更新现有实体。有没有办法对每种情况有不同的看法?

4

1 回答 1

0

显然,您必须定义一个用于创建的视图和另一个用于更新的视图,因此:

@View(name="Create", members=" ... ")
@View(name="Update", members=" ... ")
public class MyEntity { ...

现在您必须细化用于选择 Create 视图的新操作和用于选择 Update 视图的搜索操作。首先,在您的 controllers.xml 中定义您自己的控制器,因此:

<controller name="MyTypical">
    <extends controller="Typical"/>
    
    <action  name="new" 
        class="com.mycompany.myapplication.actions.MyNewAction"
        image="new.gif"
        icon="library-plus"
        keystroke="Control N"
        loses-changed-data="true">
        <set property="restoreModel" value="true"/>         
    </action>

    <action name="search" hidden="true"         
        class="com.mycompany.myapplication.actions.MySearchAction"/>
        
</controller>

现在将此控制器分配给您的模块,并为模块定义搜索操作。以这种方式在 application.xml 中编写您的模块:

<module name="MyModule">
    <env-var name="XAVA_SEARCH_ACTION" value="MyTypical.search"/>
    <model name="MyEntity"/>
    <controller name="MyTypical"/>
</module>

现在只剩下完善你的行动逻辑了。对于您编写的 MySearchAction (注意:必须捕获选定的实体索引值 (1) 以便在 setViewName(...) 方法 (2) 执行重置后恢复 (3)):

public class MySearchAction extends SearchByViewKeyAction {

    public void execute() throws Exception {
        Map mapIndexValues = getView().getKeyValuesWithValue();   //1
        getView().setViewName("Update");                          //2
        getView().setValues(mapIndexValues);                      //3
        super.execute();
    }

}

对于 MyNewAction:

public class MyNewAction extends NewAction {

    public void execute() throws Exception {
        getView().setViewName("Create");
        super.execute();
    }

}
于 2021-03-30T17:50:46.780 回答