2013-10-23 110 views
1

我想知道什么所有种类的数据必须存储在ActionContext的会话映射?什么都存储在ActionContext的会话对象在Struts2中?

例如:

从事件被触发后一个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"); 

是不是把这些变量在会话或我应在应用程序映射或值栈保留其中的某些在其他类似???

我的信息和错误字符串不是现场一般的错误/消息特别到现场,但消息一样,如果地图从数据库得到了来自空,等事情是这样的:

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

回答

1

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

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的动作移动到ValueStack中,后来使得它包含了从框架(使用OGNL),例如JSP页面的各个部分可直接访问的所有数据。

<s:property value="dataRetrievedFromDatabase"/> 

回想一下,JavaBean属性名称,并在JSP页面的属性值必须完全是一样的:

所以,在结果的JSP页面,则可以使用引用您从数据库中检索数据。 这种通过各种应用程序组件移动数据的方式只使用JavaBeans属性。你也可以考虑其他方法来实现这一点。只需查找:对象支持的javabeans属性和模型驱动的操作。

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. 输出字符串由通过Getters和Setters公开的私有变量处理。

DTO地图从DB 可以是合法的被投入在会话中,如果是很常见的多页,以防止每次重装它。但是对于大多数情况,只需阅读文档和/或查找示例,网络就充满了它们。

+0

:请参阅我加入到这个问题的编辑!感谢您的帮助 –

+0

我的MESSAGE和ERROR字符串不是字段错误/消息!请参阅更新! –

+0

您的编辑不会改变任何内容。你需要** ACTION ** ERRORS和** ACTION ** MESSAGES,就像我说的。然后,如果你需要字段特定的错误,你可以使用** FIELD ** ERRORS,就像我说的。仔细读 :) –

0

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

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

会话对应于用户与系统进行交互,因为他进来直到他离开。

只是为了给你一个想法,比如说,当用户登录时,你从数据库中获取UserProfile对象。比方说,这个userProfile对象包含名字,称呼,如果需要的话(先生,小姐,博士等)。这些细节在多个页面和用例中都是必需的。所以这个对象可以进入用户的会话。

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

在这些方面,我不会建议在session中保留error_message之类的东西。

待办事项看看:https://stackoverflow.com/a/3106909/668951

相关问题