我(通过此门户网站上的一些用户)制作实现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;
}
}
我在.jsp上查看这些变量:
<s:if test="#session['loggedOn']!=true">
DIV LOGIN
</s:if>
<s:else>
DIV LOGOUT
</s:else>
一段简单的代码。
我想知道的是:
1 - bean是(默认情况下)请求作用域。因此,当请求完成时,它将被销毁。但是我看到,当我在Map中放置一个变量时,它仍然在服务器上存活。怎么可能?是我的Bean的变量。
2 - 谁调用了setSession方法?我认为servlet是由于我实现了这个接口的事实?
3 - 我想在会话对象上分离保存对象/ bean。我想使用Bean会话范围(对于任何类型的MVC框架)。我怎样才能在struts2上做到这一点?
希望你能说清楚这些问题:)干杯
答案 0 :(得分:3)
1)你的bean是一个struts2动作,因此它是动作范围的(这是一个比请求更具限制性的范围)。我说该操作的范围较小,因为您可以将操作转发给另一个操作,在这种情况下,先前的操作超出范围,但请求范围的对象将保留在范围内,直到请求被提供。实现SessionAware时,会向您提供对SessionObject的引用,然后将对象放入Session对象中,该对象的生命周期比您的操作长得多。清除浏览器缓存将删除会话值...您也可以通过代码删除它们来实现SessionAware并从地图中删除值。
2 - 会话已存在。您可以获得会话并添加密钥,但即使您没有在其中添加任何内容,也可以使用它。
3 - 您已经有一个关于此主题的问题,请参阅我的答案。