Session Struts2-会话故障

Session Struts2-会话故障,session,struts2,javabeans,Session,Struts2,Javabeans,我将实现SessionAware的应用程序(感谢此门户上的一些用户) 这是我的实际代码: public class UserManager extends ActionSupport implements SessionAware { private Map<String, Object> session; @Override public String execute() throws Exception { return SUCCESS;

我将实现SessionAware的应用程序(感谢此门户上的一些用户)

这是我的实际代码:

public class UserManager extends ActionSupport implements SessionAware {
    private Map<String, Object> session;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    public void setSession(Map<String, Object> map) {
        this.session=map;
    }

    public String checkLogin() {        
        session.put("loggedOn", true);
        return SUCCESS;
    }

    public String checkLogout() {
        session.clear();
        return SUCCESS;
    }
}
public类UserManager扩展ActionSupport实现SessionAware{
私人Map会议;
@凌驾
公共字符串execute()引发异常{
回归成功;
}
公共无效设置会话(映射){
session=map;
}
公共字符串checkLogin(){
session.put(“loggedOn”,true);
回归成功;
}
公共字符串checkLogout(){
session.clear();
回归成功;
}
}
我在我的.jsp上检查这些变量:

<s:if test="#session['loggedOn']!=true">
    DIV LOGIN
</s:if>
<s:else>
    DIV LOGOUT
</s:else>

DIV登录
分区注销
一段简单的代码

我想知道的是:

1-bean(默认情况下)为请求范围。因此,当请求完成时,它将被销毁。但是我看到,当我把一个变量放到映射中时,它在服务器上仍然是活动的。怎么可能?是我Bean的一个变量

2-谁调用setSession方法?我认为servlet,因为我实现了这个接口

3-我想谈谈如何在会话对象上保存对象/bean。我想使用Bean会话范围(对于任何类型的MVC框架)。我怎样才能在struts2上完成它

希望您能澄清这些问题:)干杯

1)您的bean是一个struts2操作,因此它是一个操作范围(这是一个比请求更严格的范围)。我说动作是一个较小的作用域,因为您可以将一个动作转发给另一个动作,在这种情况下,前一个动作超出了作用域,但请求作用域的对象将保留在作用域中,直到请求得到服务。当您实现SessionWare时,会向您提供对SessionObject的引用,然后您将对象放入会话对象中,该对象的生命周期比您的操作长得多。清除浏览器缓存将删除会话值。。。您还可以通过实现SessionAware并从映射中删除值的代码来删除它们

2-会话已存在。您可以获取会话并添加密钥,但即使您不在其中放入任何内容,它也会在那里使用

3-关于这个主题,您已经有了一个稍后的问题,请参见我的答案。

1)您的bean是一个struts2操作,因此它是操作范围的(这是一个比请求更严格的范围)。我说动作是一个较小的作用域,因为您可以将一个动作转发给另一个动作,在这种情况下,前一个动作超出了作用域,但请求作用域的对象将保留在作用域中,直到请求得到服务。当您实现SessionWare时,会向您提供对SessionObject的引用,然后您将对象放入会话对象中,该对象的生命周期比您的操作长得多。清除浏览器缓存将删除会话值。。。您还可以通过实现SessionAware并从映射中删除值的代码来删除它们

2-会话已存在。您可以获取会话并添加密钥,但即使您不在其中放入任何内容,它也会在那里使用


3-您已经有了关于本主题的后续问题,请参见我的答案。

1和2-现在更清楚了。会话映射引用被设置为操作Bean trought
public void setSession(映射映射){this.session=map;}
。但谁管这种方法叫?当我做一个动作(我称之为Bean)时,我看到这个函数被调用。。。怎么可能?它是servlet吗?不,它是一个拦截器!在struts.xml中,您将看到您的包声明具有“extends=”struts default“,那么这意味着什么呢?那么,您的操作是如何从其上设置的表单中获取值的?如何自动调用会话?这些值是如何从您的操作到JSP的。。。这一切都是由拦截器完成的。。。您需要查看一些重要的内容:打开Struts2-core-x.x.x.jar(其中x.x.x是当前版本),然后查看默认包,打开struts-default.xml您将找到“package name=“struts default”,您将找到“interceptor stack name=“defaultStack”'这是一个拦截器列表,它们一个接一个地被调用,直到到达您的操作,然后它们都返回堆栈,直到请求得到服务。您不会发现还有其他堆栈可供选择,但您会在最底部看到“default interceptor ref name=“defaultStack””,这就是为什么使用此包中的此堆栈=)现在,堆栈按名称列出了拦截器,但更高的级别,您会看到所有定义的拦截器及其使用的类(在xwork jar中)因此,您应该快速浏览这个,查找每个类并查看JavaDoc。。。因为每一个都提供了一些使struts2运行正常的功能。您选择对您的操作包使用“struts default”,但您可以“扩展”此堆栈并添加您自己的拦截器(只需将其视为添加到链末端的函数),该拦截器将在每次调用该包中的操作时被调用。1和2-现在更清楚了。会话映射引用被设置为操作Bean trought
public void setSession(映射映射){this.session=map;}
。但谁管这种方法叫?当我做一个动作(我称之为Bean)时,我看到这个函数被调用。。。怎么可能?它是servlet吗?不,它是一个拦截器!在struts.xml中,您将看到您的包声明具有“extends=”struts default“,那么这意味着什么呢?那么,您的操作是如何从其上设置的表单中获取值的?如何自动调用会话?这些值是如何从您的操作到JSP的。。。这一切都是由拦截器完成的。。。你需要看一些重要的东西:打开Struts2-core-x.x.x.jar(其中x.x.x是当前版本)并查看默认包,打开struts-default.xml你会找到“package name=“struts default”,你会找到“interceptor stack name=“defaultStack””,这是一个拦截器的列表