Struts2 项目中,Session 对象存放在 ValueStack 的 context 对象中,context 是 Map 对象,那么要从 context 对象中获取到 Session 对象,就要指定 key 值。我们查看 ValueStack 的内容: 从 ValueStack 显示的内容可以知道,Session 存储在 context 对象中,对应的 key 值是 session。并且我们还知道 Session 也是 Map 类型的,所以 Session 对象其实也是一个 Map 对象,是按键值对存储数据的。
那么通过 ognl 表达式访问 context 中的 Session 对象,获取 Session 对象中 User 对象的 userName 属性值,ognl 表达式可以这样写:
我们也可以通过 EL 表达式来获取 Session 对象中的 User 对象的 userName 属性值,EL 表达式的写法如下:
${sessionScope.user.userName}
如果你不指定查询的范围,那么 EL 表达式会从 ValueStack 的 root 对象中获取 user 属性的值,因为在 roo 对象中存在 Action 对象(Struts2 控制器自动将 Action 对象压入 root 的栈顶),而 Action 对象存在 user 属性。
上述讲解中用到的 Action 组件是 LoginAction,代码如下:
package priv.lwx.struts2.action;
import com.opensymphony.xwork2.ActionContext;
import org.apache.struts2.dispatcher.ApplicationMap;
import priv.lwx.struts2.action.dao.UserDAO;
import priv.lwx.struts2.action.entity.User;
import java.util.Map;
/**
* description
*
* @author liaowenxiong
* @date 2022/2/14 11:54
*/
public class LoginAction {
private User user;
private UserDAO userDAO = new UserDAO();
public String login() {
System.out.println(user.getUserName());
System.out.println(user.getPassword());
User user = userDAO.login(this.user.getUserName(), this.user.getPassword());
if (user != null) {
// 登录成功
ActionContext act = ActionContext.getContext();
Map session = act.getSession();
String name = session.getClass().getName();
// 将User对象存储在Session对象中
session.put("user", user);
return "success";
}
// 登录失败
return "fail";
}
public String form() {
return "success";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
JSP 的代码如下:
Title
您好!
--%>
${sessionScope.user.userName}
struts.xml 的内容:
DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
/WEB-INF/jsp/main.jsp
/login.jsp
/login.jsp