1

我想知道必须在 ActionContext 的会话映射中存储哪些类型的数据?

例如:

触发事件后,从 jsp 控制转到我的操作类。在我的动作类中,如果我从数据库中获取一些数据并希望在下一个要显示的 jsp 中呈现该数据,那么我应该将该数据存储在会话映射或 ActionContext 的其他一些对象中,如参数、应用程序、请求等??

我在会话图中添加了以下变量:

        session.remove("MESSAGE"); // Some message Strings
        session.remove("ERROR");// Some Error Strings
        session.remove("TSRequestDetailsMap");    // Dto Map from DB
        session.remove("TowerReqGenDtoMap");
        session.remove("RequestFileName");
        session.remove("ResponseFileName");
        session.remove("ResponseFileDetailsDto");// DTO
        session.remove("Output");// Output Strings
        session.remove("RequestType");

将这些变量放在会话中是否正确,或者我应该将它们中的一些保留在应用程序映射或 ValueStack 中?

我的 MESSAGE 和 ERROR 字符串不是特定于某个字段的字段错误/消息,而是一般的消息,例如从 DB 获取的地图是否为空等。像这样:

            tsReqDetailsMap = slsRequestResponseDetailsLocal.getRequestDetailsForTargetSuspect(operatorIds, requestType, startDate, endDate,loginMode);         
            if(!tsReqDetailsMap.isEmpty()){
                session.put("TSRequestDetailsMap", tsReqDetailsMap);
            }else{
                session.put("MESSAGE", "Request not found for specified time period for "+requestType);
            }
4

3 回答 3

2

这完全取决于您的数据范围。

是必须存在于不同页面之间的数据吗?然后会话。

数据是否必须仅存在于正在呈现的视图 (JSP) 中?然后是值堆栈(通过带有 Getters 和 Setters 的私有字段)。

例如,有关登录用户的信息会进入会话,而数据库中的内容通常不会。

编辑

添加代码后,答案可以更具体:

session.remove("MESSAGE"); // Some message Strings
session.remove("ERROR");// Some Error Strings
session.remove("TSRequestDetailsMap");    // Dto Map from DB
session.remove("TowerReqGenDtoMap");
session.remove("RequestFileName");
session.remove("ResponseFileName");
session.remove("ResponseFileDetailsDto");// DTO
session.remove("Output");// Output Strings
session.remove("RequestType");

将这些变量放在会话中是否正确?

不它不是。

  1. 对于消息,使用 ActionMessages;
  2. 对于错误,使用 ActionErrors 和 FieldErrors;
  3. 对于 fileName、fileContentType 和文件本身,使用 fileUploadInterceptor
  4. 输出字符串由通过 Getter 和 Setter 公开的私有变量处理。

来自 DB 的 Dto Map可以合法地放入会话中,如果它对多个页面是通用的,以防止每次都重新加载它。但是对于大多数事情,只需阅读文档和/或查找示例,网络上到处都是。

于 2013-10-23T20:52:19.360 回答
1

有很多方法可以做到这一点。您可以使用会话或响应对象来存储从数据库中检索到的所有类型的数据,但没有必要这样做。由于 Struts 2 动作是简单的 Javabean,您可以在该 Struts 2 动作上定义一些属性,以及它们的 getter 和 setter。

public class MyClass extends ActionSupport{
    private String dataRetrievedFromDatabase;

    public String execute(){
         dataRetrievedFromDatabase = retrievedataFromDatabase()

         return SUCCESS;
    }

    public String retrieveDataFromDatabase(){
          //code to retrieve data
    }

    //define getter and setter of the dataRetrievedFromDatabase property here
}

当它执行时,整个 javabean Action 被移动到 ValueStack,后者使得它包含的所有数据可以从框架的各个部分(使用 OGNL)直接访问,例如您的 JSP 页面。

因此,在您的 Result JSP 页面中,您可以使用以下方法引用您从数据库中检索到的数据:

<s:property value="dataRetrievedFromDatabase"/>

回想一下,JSP 页面中的 javabean 属性名称和属性值必须完全相同。这种通过各种应用程序组件移动数据的方式仅使用 JavaBeans 属性。您还可以考虑其他方法来实现这一目标。只需寻找:对象支持的 javabeans 属性和模型驱动的操作。

于 2013-10-23T20:52:11.660 回答
0

会话对象应该保存用户会话的数据。应用程序对象将保存应用程序范围内的数据。当相应的作用域结束时,这些作用域对象将被删除。例如,当应用程序停止时,应用程序级别的数据将被清除。

会话驱动的操作可以将数据添加到会话中。你会更好地判断要求。但我建议让这些对象尽可能小,因为它们在整个范围内都保持活动状态。例如,如果您将某些内容存储在应用程序范围内,那么它将在整个应用程序期间保留在那里。如果其中一些不需要这么长时间,它可能会不必要地增加内存占用。因此,只有当国家代码增加价值而不是从数据库中查找它们时,才能在应用程序范围内读取和存储国家代码。

会话对应于用户从进来到离开时与系统的交互。

只是给您一个想法,例如,当用户登录时,您从数据库中获取 UserProfile 对象。假设这个 userProfile 对象包含 FirstName、Salutation,如果需要的话(Mr、Miss、Dr 等)。多个页面和用例都需要这些详细信息。所以这个对象可以进入用户的会话。

现在让我们说其中一项功能是在屏幕上向用户显示警报消息,如果系统中有任何针对该用户的警报。用户登录,浏览其他一些用例,在某些时候他点击“警报”链接,系统在屏幕上显示一条消息。一些用户更喜欢 html 格式的消息;其他人更喜欢纯文本消息。因此,按照设计,这个 userMailPreference 对象可以包含在 userProfile 对象中。但由于它是一次性使用或至少不是很频繁,您可以选择延迟加载此对象(当用户单击警报链接时),而不是将此信息存储在用户会话中。这种方式会话对象很轻。

在这些方面,我不建议在会话中保留诸如 error_message 之类的内容。

看看:https ://stackoverflow.com/a/3106909/668951

于 2013-10-30T06:13:33.120 回答