为什么在struts2中不保留会话



我想在strtus2中跨多个动作使用值,具体来说,我开发了以下示例。

当我在输入标签中输入sample input时,这个值被传递给updateAction.java,然后nextAction.jsp将被加载,然后ServletHelperAction将被执行。

之后,sample input显示在我的控制台中。我的期望是显示changed in Action,因为这个变量在updateAction.java中发生了变化。

为什么在会话中不保留这些变量?这和ValueStack有关吗?

jsp

<input name="inputValue" value="${getInputValue()}" form="formCasePost">
<form method="post" id="formCasePost" submit="case-update"></form>

updateAction.java

public class updateAction extends ActionSupport implements SessionAware {
@Getter @Setter
private String inputValue;
@Getter @Setter
private Map<String, Object> session;
@Action(value = "case-update", results = {
@Result(location = "nextAction.jsp")
})
public String update() {
this.setInputValue("changed in Action");
this.session.put("changedInputValue",inputValue)
return SUCCESS;
}
}

nextAction.jsp

<s:action var="ServletHelperAction" name="login-user-to-bean" namespace="/servlet-helper"></s:action>

AnotherFileAction.java

public class ServletHelperAction extends ActionSupport implements SessionAware{
@Action(value = "login-user-to-bean", results = {
@Result(location = "servlethelper.jsp")
})
public String loginUserToBean() {
System.out.println(this.session.get("changedInputValue"));
// my expectation is "changed in Action", but actual value is "sample input"
}

在使用Struts2应用程序时可能会错过的要点。每个操作都使用自己的操作上下文,因此有一个值堆栈。这些对象是由默认为struts2的对象工厂创建的,并使它们从Struts2容器或通过实用程序类静态地可用。最后一个选项是非常有用的,如果你需要从自定义拦截器。您永远不会手动创建这些对象,而是由Struts管理以正确地构建并将实例注入到容器中。

如果你曾经使用过容器,你可以参考这个问题来更好地理解Struts2中的DI和Struts容器管理的对象的可用范围。

SessionMap对象是在每个操作执行之前创建的,用于将bean存储到这个类成功包装的http会话中。SesdionMap提供了对http会话属性的更好访问,而不是它本身。除非您通过SesdionMap使会话无效或更新http会话,否则Struts将使bean保持在操作之间的映射中。如果你想重置SessionMap,同时保持相同的集合,你必须以某种方式重新填充它,这超出了这个问题的主题。

在代码中,您使用了未映射到任何操作配置的html表单。应该更新代码以使用struts标记或至少使用有效的html。因为您使用的代码不会转到struts的action执行方法。

<form method="post" id="formCasePost" action="case-update">
<input type="submit" value="case-update">
</form>

在视图中,您映射在不同命名空间中的操作,而不是默认操作。如果没有正确映射操作,那么您可能不会通过action标签得到任何错误。

ValueStack有一个作用域到action,不去会话,会话是一个单独的对象SessionMap,它不包含值堆栈。

相关内容

  • 没有找到相关文章

最新更新