【问题标题】:What all to store in session object of ActionContext in Struts2?在 Struts2 的 ActionContext 的会话对象中存储什么?
【发布时间】:2013-10-23 17:11:30
【问题描述】:

我想知道什么各种数据必须存储在 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);
            }

【问题讨论】:

    标签: java session struts2


    【解决方案1】:

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

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

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

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

    编辑

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

    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");
    

    把这样的变量放到session里面对吗?

    不,不是。

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

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

    【讨论】:

    • :请查看我添加到问题中的编辑!感谢您的帮助
    • 我的 MESSAGE 和 ERROR 字符串不是字段错误/消息!请看更新!
    • 您的编辑不会改变任何内容。正如我所说,您需要 ACTION 错误和 ACTION 消息。然后,如果您需要特定于字段的错误,您可以使用 FIELD ERRORS,就像我说的那样。仔细阅读:)
    【解决方案2】:

    有很多方法可以做到这一点。您可以使用会话或响应对象来存储从数据库中检索到的所有类型的数据,但没有必要这样做。由于 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 页面。

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

    <s:property value="dataRetrievedFromDatabase"/>
    

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

    【讨论】:

      【解决方案3】:

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

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

      Session对应用户从进来到离开的与系统的交互。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 2017-08-25
        • 2010-11-08
        • 2011-10-15
        • 2011-02-12
        相关资源
        最近更新 更多