Struts2值堆栈

Struts2值堆栈,struts2,Struts2,我想了解Struts 2的值堆栈和请求范围。 我希望struts2值堆栈的工作方式与请求范围相同 例如。 我在struts 2中调用了action1,该操作执行一些db任务并返回。它对一个名为cases的对象执行一些操作(类型cases,其中cases是带有getter和setter的bean类)。cases对象是在类级别声明的 action1导致一个视图被呈现,比如jsp1 jsp1还有一个称为action2的操作。action2生成与action1相同的java文件,但方法不同 现在,我想访

我想了解Struts 2的值堆栈和请求范围。 我希望struts2值堆栈的工作方式与请求范围相同

例如。 我在struts 2中调用了action1,该操作执行一些db任务并返回。它对一个名为cases的对象执行一些操作(类型cases,其中cases是带有getter和setter的bean类)。cases对象是在类级别声明的

action1导致一个视图被呈现,比如jsp1

jsp1还有一个称为action2的操作。action2生成与action1相同的java文件,但方法不同

现在,我想访问action1中使用的对象。在action1期间,案例被推送到值堆栈,并在jsp1上访问

我只是尝试访问它的getter方法,但它返回一个空值


有什么解决办法吗???还是有可能??我知道如果可能的话,那么vs和请求范围之间有什么区别…

您在第一个请求中创建的对象无法在第二个请求中引用,因为

这对于所有web编程(PHP、servlet jsp、asp等)都是一样的,因为web使用HTTP协议进行通信

针对您的问题的可行解决方案:

1.创建包含对象id的隐藏输入标记,这样当您第二次请求时,struts 2方法可以获取id(作为参数)并再次执行“action Performes some db task”以重新创建相同的对象(再次创建该对象的成本很高,但这取决于您的需要)

2.在第一个请求中呈现jsp之前,可以将对象放入会话范围(最好在实际操作中执行此步骤,而不是在jsp scriplet中)

在第二个请求中,您可以访问该对象

在删除会话之前,可以在任何actions/jsp中访问会话


如果在将“myCases”从会话中删除后尝试访问它,则会得到null。

在第一个请求中创建的对象无法在第二个请求中引用,因为

这对于所有web编程(PHP、servlet jsp、asp等)都是一样的,因为web使用HTTP协议进行通信

针对您的问题的可行解决方案:

1.创建包含对象id的隐藏输入标记,这样当您第二次请求时,struts 2方法可以获取id(作为参数)并再次执行“action Performes some db task”以重新创建相同的对象(再次创建该对象的成本很高,但这取决于您的需要)

2.在第一个请求中呈现jsp之前,可以将对象放入会话范围(最好在实际操作中执行此步骤,而不是在jsp scriplet中)

在第二个请求中,您可以访问该对象

在删除会话之前,可以在任何actions/jsp中访问会话


如果在将“myCases”从会话中删除后尝试访问它,则会得到null。

Dave关于ValueStack在请求范围内的说法是正确的

但是,为了实现您的愿望,只要从数据库获取一次数据,然后在多个操作/请求中使用这些数据,就可以使用以下几种可能的方法:

1) 让您的操作实现接口,并编写一些代码“手动”从会话映射中获取数据并将其放入会话映射中。这种方法不需要额外的配置,而且非常直截了当且“没有魔力”。另一方面,它向action类中添加了boiler plate代码,并要求您在完成任务后“手动”从会话中删除数据(或者,如果节省内存并不重要,您可以将数据留在会话中)

2) 让您的操作实现接口并配置以管理“案例”模型的会话范围。这不如SessionAware方法简单,因为它需要参考文档,向struts.xml中添加一些非常具体的配置细节。它仍然需要添加boiler plate代码,并且没有提供从会话中删除数据的简单方法

3) 使用,并将@ConversationField注释放在cases对象上,将@ConversationAction注释放在action1和action2方法上。然后在struts.xml中,让包扩展“struts2 conversation default”包,并在拦截器堆栈中包含“conversation”拦截器ref。然后在jsp中,使用。这种方法只需要很少的锅炉板和配置,但它确实通过注释向您的操作添加元数据(有些人会对此皱眉),而且它确实需要学习更多。该插件具有额外的功能,例如允许同一对话的多个并发实例,自动删除数据以节省内存等,但是,根据您的需要,这可能会有些过分


应用程序的最佳方法取决于您的需求和偏好。使用
ActionContext.getContext().getSession()访问会话对象,以支持SessionAware接口。

Dave关于请求范围中的ValueStack的说法是正确的

但是,为了实现您的愿望,只要从数据库获取一次数据,然后在多个操作/请求中使用这些数据,就可以使用以下几种可能的方法:

1) 让您的操作实现接口,并编写一些代码“手动”从会话映射中获取数据并将其放入会话映射中。这种方法不需要额外的配置,而且非常直截了当且“没有魔力”。另一方面,它向action类中添加了boiler plate代码,并要求您在完成任务后“手动”从会话中删除数据(或者,如果节省内存并不重要,您可以将数据留在会话中)

2) 让您的操作实现接口并配置以管理“案例”模型的会话范围。这不如SessionAware方法简单,因为它需要参考文档来添加一些非常具体的内容
Map session = ActionContext.getContext().getSession();
session.put("myCases","cases);
Map session = ActionContext.getContext().getSession();
Cases cases=(Cases)session.get("myCases");
Map session = ActionContext.getContext().getSession();
session.remove("myCases");